langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Scope.java
author mcimadamore
Mon, 05 Dec 2016 19:00:56 +0000
changeset 42416 1cfad0990b99
parent 42407 f3702cff2933
child 42827 36468b5fa7f4
permissions -rw-r--r--
8170410: inference: javac doesn't implement 18.2.5 correctly Summary: javac does not generate constraints of the kind 'throws alpha' as described in the spec Reviewed-by: vromero, dlsmith
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     1
/*
42407
f3702cff2933 8169069: Module system implementation refresh (11/2016)
alanb
parents: 41991
diff changeset
     2
 * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
06bc494ca11e Initial load
duke
parents:
diff changeset
     4
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
06bc494ca11e Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1264
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1264
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    10
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
06bc494ca11e Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
06bc494ca11e Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
06bc494ca11e Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
06bc494ca11e Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
06bc494ca11e Initial load
duke
parents:
diff changeset
    16
 *
06bc494ca11e Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
06bc494ca11e Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
06bc494ca11e Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
06bc494ca11e Initial load
duke
parents:
diff changeset
    20
 *
5520
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1264
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1264
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
86e4b9a9da40 6943119: Rebrand source copyright notices
ohair
parents: 1264
diff changeset
    23
 * questions.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    24
 */
06bc494ca11e Initial load
duke
parents:
diff changeset
    25
06bc494ca11e Initial load
duke
parents:
diff changeset
    26
package com.sun.tools.javac.code;
06bc494ca11e Initial load
duke
parents:
diff changeset
    27
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
    28
import com.sun.tools.javac.code.Kinds.Kind;
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
    29
import java.lang.ref.WeakReference;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    30
import java.util.*;
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
    31
import java.util.function.BiConsumer;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
    32
import java.util.stream.Stream;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
    33
import java.util.stream.StreamSupport;
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 9593
diff changeset
    34
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
    35
import com.sun.tools.javac.code.Symbol.CompletionFailure;
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
    36
import com.sun.tools.javac.code.Symbol.TypeSymbol;
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
    37
import com.sun.tools.javac.tree.JCTree.JCImport;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    38
import com.sun.tools.javac.util.*;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    39
import com.sun.tools.javac.util.List;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    40
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    41
import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    42
import static com.sun.tools.javac.code.Scope.LookupKind.RECURSIVE;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    43
06bc494ca11e Initial load
duke
parents:
diff changeset
    44
/** A scope represents an area of visibility in a Java program. The
06bc494ca11e Initial load
duke
parents:
diff changeset
    45
 *  Scope class is a container for symbols which provides
06bc494ca11e Initial load
duke
parents:
diff changeset
    46
 *  efficient access to symbols given their names. Scopes are implemented
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    47
 *  as hash tables with "open addressing" and "double hashing".
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    48
 *  Scopes can be nested. Nested scopes can share their hash tables.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    49
 *
5847
1908176fd6e3 6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents: 5520
diff changeset
    50
 *  <p><b>This is NOT part of any supported API.
1908176fd6e3 6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents: 5520
diff changeset
    51
 *  If you write code that depends on this, you do so at your own risk.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    52
 *  This code and its internal interfaces are subject to change or
06bc494ca11e Initial load
duke
parents:
diff changeset
    53
 *  deletion without notice.</b>
06bc494ca11e Initial load
duke
parents:
diff changeset
    54
 */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    55
public abstract class Scope {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    56
06bc494ca11e Initial load
duke
parents:
diff changeset
    57
    /** The scope's owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
    58
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    59
    public final Symbol owner;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    60
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    61
    protected Scope(Symbol owner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    62
        this.owner = owner;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    63
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    64
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    65
    /**Returns all Symbols in this Scope. Symbols from outward Scopes are included.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    66
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    67
    public final Iterable<Symbol> getSymbols() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    68
        return getSymbols(noFilter);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    69
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    70
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    71
    /**Returns Symbols that match the given filter. Symbols from outward Scopes are included.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    72
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    73
    public final Iterable<Symbol> getSymbols(Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    74
        return getSymbols(sf, RECURSIVE);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    75
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    76
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    77
    /**Returns all Symbols in this Scope. Symbols from outward Scopes are included
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    78
     * iff lookupKind == RECURSIVE.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    79
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    80
    public final Iterable<Symbol> getSymbols(LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    81
        return getSymbols(noFilter, lookupKind);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    82
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    83
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    84
    /**Returns Symbols that match the given filter. Symbols from outward Scopes are included
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    85
     * iff lookupKind == RECURSIVE.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    86
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    87
    public abstract Iterable<Symbol> getSymbols(Filter<Symbol> sf, LookupKind lookupKind);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    88
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    89
    /**Returns Symbols with the given name. Symbols from outward Scopes are included.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    90
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    91
    public final Iterable<Symbol> getSymbolsByName(Name name) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    92
        return getSymbolsByName(name, RECURSIVE);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    93
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    94
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    95
    /**Returns Symbols with the given name that match the given filter.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    96
     * Symbols from outward Scopes are included.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    97
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    98
    public final Iterable<Symbol> getSymbolsByName(final Name name, final Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
    99
        return getSymbolsByName(name, sf, RECURSIVE);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   100
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   101
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   102
    /**Returns Symbols with the given name. Symbols from outward Scopes are included
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   103
     * iff lookupKind == RECURSIVE.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   104
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   105
    public final Iterable<Symbol> getSymbolsByName(Name name, LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   106
        return getSymbolsByName(name, noFilter, lookupKind);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   107
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   108
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   109
    /**Returns Symbols with the given name that match the given filter.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   110
     * Symbols from outward Scopes are included iff lookupKind == RECURSIVE.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   111
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   112
    public abstract Iterable<Symbol> getSymbolsByName(final Name name, final Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   113
            final LookupKind lookupKind);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   114
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   115
    /** Return the first Symbol from this or outward scopes with the given name.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   116
     * Returns null if none.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   117
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   118
    public final Symbol findFirst(Name name) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   119
        return findFirst(name, noFilter);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   120
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   121
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   122
    /** Return the first Symbol from this or outward scopes with the given name that matches the
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   123
     *  given filter. Returns null if none.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   124
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   125
    public Symbol findFirst(Name name, Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   126
        Iterator<Symbol> it = getSymbolsByName(name, sf).iterator();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   127
        return it.hasNext() ? it.next() : null;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   128
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   129
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   130
    /** Returns true iff there are is at least one Symbol in this scope matching the given filter.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   131
     *  Does not inspect outward scopes.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   132
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   133
    public boolean anyMatch(Filter<Symbol> filter) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   134
        return getSymbols(filter, NON_RECURSIVE).iterator().hasNext();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   135
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   136
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   137
    /** Returns true iff the given Symbol is in this scope or any outward scope.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   138
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   139
    public boolean includes(final Symbol sym) {
41991
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   140
        return includes(sym, RECURSIVE);
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   141
    }
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   142
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   143
    /** Returns true iff the given Symbol is in this scope, optionally checking outward scopes.
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   144
     */
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   145
    public boolean includes(final Symbol sym, LookupKind lookupKind) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   146
        return getSymbolsByName(sym.name, new Filter<Symbol>() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   147
            @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   148
            public boolean accepts(Symbol t) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   149
                return t == sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   150
            }
41991
cc8a2784dd4c 8166700: NPE during invoking getEnclosedElements() on javax.lang.model.element.Element instance representing a package
jlahoda
parents: 40235
diff changeset
   151
        }, lookupKind).iterator().hasNext();
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   152
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   153
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   154
    /** Returns true iff this scope does not contain any Symbol. Does not inspect outward scopes.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   155
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   156
    public boolean isEmpty() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   157
        return !getSymbols(NON_RECURSIVE).iterator().hasNext();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   158
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   159
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   160
    /** Returns the Scope from which the givins Symbol originates in this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   161
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   162
    public abstract Scope getOrigin(Symbol byName);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   163
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   164
    /** Returns true iff the given Symbol is part of this scope due to a static import.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   165
     */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   166
    public abstract boolean isStaticallyImported(Symbol byName);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   167
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   168
    private static final Filter<Symbol> noFilter = null;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   169
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   170
    /** A list of scopes to be notified if items are to be removed from this scope.
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   171
     */
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   172
    ScopeListenerList listeners = new ScopeListenerList();
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   173
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   174
    public interface ScopeListener {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   175
        void symbolAdded(Symbol sym, Scope s);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   176
        void symbolRemoved(Symbol sym, Scope s);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   177
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   178
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   179
    /**
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   180
     * A list of scope listeners; listeners are stored in weak references, to avoid memory leaks.
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   181
     * When the listener list is scanned (upon notification), elements corresponding to GC-ed
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   182
     * listeners are removed so that the listener list size is kept in check.
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   183
     */
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   184
    public static class ScopeListenerList {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   185
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   186
        List<WeakReference<ScopeListener>> listeners = List.nil();
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   187
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   188
        void add(ScopeListener sl) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   189
            listeners = listeners.prepend(new WeakReference<>(sl));
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   190
        }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   191
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   192
        void symbolAdded(Symbol sym, Scope scope) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   193
            walkReferences(sym, scope, false);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   194
        }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   195
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   196
        void symbolRemoved(Symbol sym, Scope scope) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   197
            walkReferences(sym, scope, true);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   198
        }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   199
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   200
        private void walkReferences(Symbol sym, Scope scope, boolean isRemove) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   201
            ListBuffer<WeakReference<ScopeListener>> newListeners = new ListBuffer<>();
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   202
            for (WeakReference<ScopeListener> wsl : listeners) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   203
                ScopeListener sl = wsl.get();
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   204
                if (sl != null) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   205
                    if (isRemove) {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   206
                        sl.symbolRemoved(sym, scope);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   207
                    } else {
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   208
                        sl.symbolAdded(sym, scope);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   209
                    }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   210
                    newListeners.add(wsl);
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   211
                }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   212
            }
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   213
            listeners = newListeners.toList();
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   214
        }
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   215
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   216
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   217
    public enum LookupKind {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   218
        RECURSIVE,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   219
        NON_RECURSIVE;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   220
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   221
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   222
    /**A scope into which Symbols can be added.*/
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   223
    public abstract static class WriteableScope extends Scope {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   224
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   225
        public WriteableScope(Symbol owner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   226
            super(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   227
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   228
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   229
        /** Enter the given Symbol into this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   230
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   231
        public abstract void enter(Symbol c);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   232
        /** Enter symbol sym in this scope if not already there.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   233
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   234
        public abstract void enterIfAbsent(Symbol c);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   235
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   236
        public abstract void remove(Symbol c);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   237
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   238
        /** Construct a fresh scope within this scope, with same owner. The new scope may
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   239
         *  shares internal structures with the this scope. Used in connection with
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   240
         *  method leave if scope access is stack-like in order to avoid allocation
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   241
         *  of fresh tables.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   242
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   243
        public final WriteableScope dup() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   244
            return dup(this.owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   245
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   246
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   247
        /** Construct a fresh scope within this scope, with new owner. The new scope may
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   248
         *  shares internal structures with the this scope. Used in connection with
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   249
         *  method leave if scope access is stack-like in order to avoid allocation
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   250
         *  of fresh tables.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   251
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   252
        public abstract WriteableScope dup(Symbol newOwner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   253
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   254
        /** Must be called on dup-ed scopes to be able to work with the outward scope again.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   255
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   256
        public abstract WriteableScope leave();
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   257
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   258
        /** Construct a fresh scope within this scope, with same owner. The new scope
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   259
         *  will not share internal structures with this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   260
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   261
        public final WriteableScope dupUnshared() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   262
            return dupUnshared(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   263
        }
18899
2557b27d1f1c 6356530: -Xlint:serial does not flag abstract classes with concrete methods/members
vromero
parents: 14258
diff changeset
   264
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   265
        /** Construct a fresh scope within this scope, with new owner. The new scope
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   266
         *  will not share internal structures with this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   267
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   268
        public abstract WriteableScope dupUnshared(Symbol newOwner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   269
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   270
        /** Create a new WriteableScope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   271
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   272
        public static WriteableScope create(Symbol owner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   273
            return new ScopeImpl(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   274
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   275
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   276
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   277
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   278
    private static class ScopeImpl extends WriteableScope {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   279
        /** The number of scopes that share this scope's hash table.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   280
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   281
        private int shared;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   282
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   283
        /** Next enclosing scope (with whom this scope may share a hashtable)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   284
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   285
        public ScopeImpl next;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   286
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   287
        /** A hash table for the scope's entries.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   288
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   289
        Entry[] table;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   290
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   291
        /** Mask for hash codes, always equal to (table.length - 1).
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   292
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   293
        int hashMask;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   294
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   295
        /** A linear list that also contains all entries in
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   296
         *  reverse order of appearance (i.e later entries are pushed on top).
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   297
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   298
        public Entry elems;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   299
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   300
        /** The number of elements in this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   301
         * This includes deleted elements, whose value is the sentinel.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   302
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   303
        int nelems = 0;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   304
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   305
        int removeCount = 0;
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   306
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   307
        /** Use as a "not-found" result for lookup.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   308
         * Also used to mark deleted entries in the table.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   309
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   310
        private static final Entry sentinel = new Entry(null, null, null, null);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   311
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   312
        /** The hash table's initial size.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   313
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   314
        private static final int INITIAL_SIZE = 0x10;
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   315
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   316
        /** Construct a new scope, within scope next, with given owner, using
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   317
         *  given table. The table's length must be an exponent of 2.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   318
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   319
        private ScopeImpl(ScopeImpl next, Symbol owner, Entry[] table) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   320
            super(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   321
            this.next = next;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   322
            Assert.check(owner != null);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   323
            this.table = table;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   324
            this.hashMask = table.length - 1;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   325
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   326
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   327
        /** Convenience constructor used for dup and dupUnshared. */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   328
        private ScopeImpl(ScopeImpl next, Symbol owner, Entry[] table, int nelems) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   329
            this(next, owner, table);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   330
            this.nelems = nelems;
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   331
        }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   332
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   333
        /** Construct a new scope, within scope next, with given owner,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   334
         *  using a fresh table of length INITIAL_SIZE.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   335
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   336
        public ScopeImpl(Symbol owner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   337
            this(null, owner, new Entry[INITIAL_SIZE]);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   338
        }
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   339
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   340
        /** Construct a fresh scope within this scope, with new owner,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   341
         *  which shares its table with the outer scope. Used in connection with
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   342
         *  method leave if scope access is stack-like in order to avoid allocation
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   343
         *  of fresh tables.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   344
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   345
        public WriteableScope dup(Symbol newOwner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   346
            ScopeImpl result = new ScopeImpl(this, newOwner, this.table, this.nelems);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   347
            shared++;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   348
            // System.out.println("====> duping scope " + this.hashCode() + " owned by " + newOwner + " to " + result.hashCode());
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   349
            // new Error().printStackTrace(System.out);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   350
            return result;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   351
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   352
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   353
        /** Construct a fresh scope within this scope, with new owner,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   354
         *  with a new hash table, whose contents initially are those of
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   355
         *  the table of its outer scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   356
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   357
        public WriteableScope dupUnshared(Symbol newOwner) {
27553
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   358
            if (shared > 0) {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   359
                //The nested Scopes might have already added something to the table, so all items
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   360
                //that don't originate in this Scope or any of its outer Scopes need to be cleared:
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   361
                Set<Scope> acceptScopes = Collections.newSetFromMap(new IdentityHashMap<>());
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   362
                ScopeImpl c = this;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   363
                while (c != null) {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   364
                    acceptScopes.add(c);
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   365
                    c = c.next;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   366
                }
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   367
                int n = 0;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   368
                Entry[] oldTable = this.table;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   369
                Entry[] newTable = new Entry[this.table.length];
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   370
                for (int i = 0; i < oldTable.length; i++) {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   371
                    Entry e = oldTable[i];
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   372
                    while (e != null && e != sentinel && !acceptScopes.contains(e.scope)) {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   373
                        e = e.shadowed;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   374
                    }
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   375
                    if (e != null) {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   376
                        n++;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   377
                        newTable[i] = e;
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   378
                    }
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   379
                }
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   380
                return new ScopeImpl(this, newOwner, newTable, n);
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   381
            } else {
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   382
                return new ScopeImpl(this, newOwner, this.table.clone(), this.nelems);
75321debd020 8064362: WriteableScope.dupUnshared misbehaves on shared Scopes
jlahoda
parents: 25874
diff changeset
   383
            }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   384
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   385
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   386
        /** Remove all entries of this scope from its table, if shared
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   387
         *  with next.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   388
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   389
        public WriteableScope leave() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   390
            Assert.check(shared == 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   391
            if (table != next.table) return next;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   392
            while (elems != null) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   393
                int hash = getIndex(elems.sym.name);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   394
                Entry e = table[hash];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   395
                Assert.check(e == elems, elems.sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   396
                table[hash] = elems.shadowed;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   397
                elems = elems.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   398
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   399
            Assert.check(next.shared > 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   400
            next.shared--;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   401
            next.nelems = nelems;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   402
            // System.out.println("====> leaving scope " + this.hashCode() + " owned by " + this.owner + " to " + next.hashCode());
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   403
            // new Error().printStackTrace(System.out);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   404
            return next;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   405
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   406
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   407
        /** Double size of hash table.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   408
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   409
        private void dble() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   410
            Assert.check(shared == 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   411
            Entry[] oldtable = table;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   412
            Entry[] newtable = new Entry[oldtable.length * 2];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   413
            for (ScopeImpl s = this; s != null; s = s.next) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   414
                if (s.table == oldtable) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   415
                    Assert.check(s == this || s.shared != 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   416
                    s.table = newtable;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   417
                    s.hashMask = newtable.length - 1;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   418
                }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   419
            }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   420
            int n = 0;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   421
            for (int i = oldtable.length; --i >= 0; ) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   422
                Entry e = oldtable[i];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   423
                if (e != null && e != sentinel) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   424
                    table[getIndex(e.sym.name)] = e;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   425
                    n++;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   426
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   427
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   428
            // We don't need to update nelems for shared inherited scopes,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   429
            // since that gets handled by leave().
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   430
            nelems = n;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   431
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   432
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   433
        /** Enter symbol sym in this scope.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   434
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   435
        public void enter(Symbol sym) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   436
            Assert.check(shared == 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   437
            if (nelems * 3 >= hashMask * 2)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   438
                dble();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   439
            int hash = getIndex(sym.name);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   440
            Entry old = table[hash];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   441
            if (old == null) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   442
                old = sentinel;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   443
                nelems++;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   444
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   445
            Entry e = new Entry(sym, old, elems, this);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   446
            table[hash] = e;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   447
            elems = e;
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   448
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   449
            //notify listeners
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   450
            listeners.symbolAdded(sym, this);
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   451
        }
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   452
30999
f1bb0191a5a7 8080842: Using Lambda Expression with name clash results in ClassFormatError
sadayapalam
parents: 29149
diff changeset
   453
        /** Remove symbol from this scope.
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   454
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   455
        public void remove(Symbol sym) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   456
            Assert.check(shared == 0);
30999
f1bb0191a5a7 8080842: Using Lambda Expression with name clash results in ClassFormatError
sadayapalam
parents: 29149
diff changeset
   457
            Entry e = lookup(sym.name, candidate -> candidate == sym);
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   458
            if (e.scope == null) return;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   459
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   460
            // remove e from table and shadowed list;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   461
            int i = getIndex(sym.name);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   462
            Entry te = table[i];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   463
            if (te == e)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   464
                table[i] = e.shadowed;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   465
            else while (true) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   466
                if (te.shadowed == e) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   467
                    te.shadowed = e.shadowed;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   468
                    break;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   469
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   470
                te = te.shadowed;
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   471
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   472
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   473
            // remove e from elems and sibling list
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   474
            te = elems;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   475
            if (te == e)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   476
                elems = e.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   477
            else while (true) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   478
                if (te.sibling == e) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   479
                    te.sibling = e.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   480
                    break;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   481
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   482
                te = te.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   483
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   484
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   485
            removeCount++;
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   486
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   487
            //notify listeners
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   488
            listeners.symbolRemoved(sym, this);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   489
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   490
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   491
        /** Enter symbol sym in this scope if not already there.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   492
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   493
        public void enterIfAbsent(Symbol sym) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   494
            Assert.check(shared == 0);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   495
            Entry e = lookup(sym.name);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   496
            while (e.scope == this && e.sym.kind != sym.kind) e = e.next();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   497
            if (e.scope != this) enter(sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   498
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   499
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   500
        /** Given a class, is there already a class with same fully
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   501
         *  qualified name in this (import) scope?
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   502
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   503
        public boolean includes(Symbol c) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   504
            for (Scope.Entry e = lookup(c.name);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   505
                 e.scope == this;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   506
                 e = e.next()) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   507
                if (e.sym == c) return true;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   508
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   509
            return false;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   510
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   511
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   512
        /** Return the entry associated with given name, starting in
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   513
         *  this scope and proceeding outwards. If no entry was found,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   514
         *  return the sentinel, which is characterized by having a null in
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   515
         *  both its scope and sym fields, whereas both fields are non-null
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   516
         *  for regular entries.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   517
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   518
        protected Entry lookup(Name name) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   519
            return lookup(name, noFilter);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   520
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   521
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   522
        protected Entry lookup(Name name, Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   523
            Entry e = table[getIndex(name)];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   524
            if (e == null || e == sentinel)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   525
                return sentinel;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   526
            while (e.scope != null && (e.sym.name != name || (sf != null && !sf.accepts(e.sym))))
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   527
                e = e.shadowed;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   528
            return e;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   529
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   530
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   531
        public Symbol findFirst(Name name, Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   532
            return lookup(name, sf).sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   533
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   534
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   535
        /*void dump (java.io.PrintStream out) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   536
            out.println(this);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   537
            for (int l=0; l < table.length; l++) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   538
                Entry le = table[l];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   539
                out.print("#"+l+": ");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   540
                if (le==sentinel) out.println("sentinel");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   541
                else if(le == null) out.println("null");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   542
                else out.println(""+le+" s:"+le.sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   543
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   544
        }*/
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   545
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   546
        /** Look for slot in the table.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   547
         *  We use open addressing with double hashing.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   548
         */
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   549
        int getIndex (Name name) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   550
            int h = name.hashCode();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   551
            int i = h & hashMask;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   552
            // The expression below is always odd, so it is guaranteed
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   553
            // to be mutually prime with table.length, a power of 2.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   554
            int x = hashMask - ((h + (h >> 16)) << 1);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   555
            int d = -1; // Index of a deleted item.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   556
            for (;;) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   557
                Entry e = table[i];
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   558
                if (e == null)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   559
                    return d >= 0 ? d : i;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   560
                if (e == sentinel) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   561
                    // We have to keep searching even if we see a deleted item.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   562
                    // However, remember the index in case we fail to find the name.
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   563
                    if (d < 0)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   564
                        d = i;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   565
                } else if (e.sym.name == name)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   566
                    return i;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   567
                i = (i + x) & hashMask;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   568
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   569
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   570
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   571
        public boolean anyMatch(Filter<Symbol> sf) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   572
            return getSymbols(sf, NON_RECURSIVE).iterator().hasNext();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   573
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   574
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   575
        public Iterable<Symbol> getSymbols(final Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   576
                                           final LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   577
            return new Iterable<Symbol>() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   578
                public Iterator<Symbol> iterator() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   579
                    return new Iterator<Symbol>() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   580
                        private ScopeImpl currScope = ScopeImpl.this;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   581
                        private Scope.Entry currEntry = elems;
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   582
                        private int seenRemoveCount = currScope.removeCount;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   583
                        {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   584
                            update();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   585
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   586
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   587
                        public boolean hasNext() {
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   588
                            if (seenRemoveCount != currScope.removeCount &&
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   589
                                currEntry != null &&
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   590
                                !currEntry.scope.includes(currEntry.sym)) {
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   591
                                doNext(); //skip entry that is no longer in the Scope
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   592
                                seenRemoveCount = currScope.removeCount;
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   593
                            }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   594
                            return currEntry != null;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   595
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   596
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   597
                        public Symbol next() {
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   598
                            if (!hasNext()) {
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   599
                                throw new NoSuchElementException();
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   600
                            }
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   601
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   602
                            return doNext();
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   603
                        }
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   604
                        private Symbol doNext() {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   605
                            Symbol sym = (currEntry == null ? null : currEntry.sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   606
                            if (currEntry != null) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   607
                                currEntry = currEntry.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   608
                            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   609
                            update();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   610
                            return sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   611
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   612
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   613
                        public void remove() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   614
                            throw new UnsupportedOperationException();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   615
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   616
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   617
                        private void update() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   618
                            skipToNextMatchingEntry();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   619
                            if (lookupKind == RECURSIVE) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   620
                                while (currEntry == null && currScope.next != null) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   621
                                    currScope = currScope.next;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   622
                                    currEntry = currScope.elems;
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   623
                                    seenRemoveCount = currScope.removeCount;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   624
                                    skipToNextMatchingEntry();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   625
                                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   626
                            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   627
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   628
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   629
                        void skipToNextMatchingEntry() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   630
                            while (currEntry != null && sf != null && !sf.accepts(currEntry.sym)) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   631
                                currEntry = currEntry.sibling;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   632
                            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   633
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   634
                    };
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   635
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   636
            };
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   637
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   638
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   639
        public Iterable<Symbol> getSymbolsByName(final Name name,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   640
                                                 final Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   641
                                                 final LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   642
            return new Iterable<Symbol>() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   643
                public Iterator<Symbol> iterator() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   644
                     return new Iterator<Symbol>() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   645
                        Scope.Entry currentEntry = lookup(name, sf);
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   646
                        int seenRemoveCount = currentEntry.scope != null ?
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   647
                                currentEntry.scope.removeCount : -1;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   648
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   649
                        public boolean hasNext() {
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   650
                            if (currentEntry.scope != null &&
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   651
                                seenRemoveCount != currentEntry.scope.removeCount &&
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   652
                                !currentEntry.scope.includes(currentEntry.sym)) {
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   653
                                doNext(); //skip entry that is no longer in the Scope
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   654
                            }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   655
                            return currentEntry.scope != null &&
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   656
                                    (lookupKind == RECURSIVE ||
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   657
                                     currentEntry.scope == ScopeImpl.this);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   658
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   659
                        public Symbol next() {
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   660
                            if (!hasNext()) {
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   661
                                throw new NoSuchElementException();
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   662
                            }
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   663
                            return doNext();
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   664
                        }
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   665
                        private Symbol doNext() {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   666
                            Scope.Entry prevEntry = currentEntry;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   667
                            currentEntry = currentEntry.next(sf);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   668
                            return prevEntry.sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   669
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   670
                        public void remove() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   671
                            throw new UnsupportedOperationException();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   672
                        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   673
                    };
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   674
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   675
            };
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   676
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   677
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   678
        public Scope getOrigin(Symbol s) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   679
            for (Scope.Entry e = lookup(s.name); e.scope != null ; e = e.next()) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   680
                if (e.sym == s) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   681
                    return this;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   682
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   683
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   684
            return null;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   685
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   686
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   687
        @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   688
        public boolean isStaticallyImported(Symbol s) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   689
            return false;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   690
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   691
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   692
        public String toString() {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   693
            StringBuilder result = new StringBuilder();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   694
            result.append("Scope[");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   695
            for (ScopeImpl s = this; s != null ; s = s.next) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   696
                if (s != this) result.append(" | ");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   697
                for (Entry e = s.elems; e != null; e = e.sibling) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   698
                    if (e != s.elems) result.append(", ");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   699
                    result.append(e.sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   700
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   701
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   702
            result.append("]");
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   703
            return result.toString();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   704
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   705
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   706
06bc494ca11e Initial load
duke
parents:
diff changeset
   707
    /** A class for scope entries.
06bc494ca11e Initial load
duke
parents:
diff changeset
   708
     */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   709
    private static class Entry {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   710
06bc494ca11e Initial load
duke
parents:
diff changeset
   711
        /** The referenced symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
   712
         *  sym == null   iff   this == sentinel
06bc494ca11e Initial load
duke
parents:
diff changeset
   713
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   714
        public Symbol sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   715
06bc494ca11e Initial load
duke
parents:
diff changeset
   716
        /** An entry with the same hash code, or sentinel.
06bc494ca11e Initial load
duke
parents:
diff changeset
   717
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   718
        private Entry shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   719
06bc494ca11e Initial load
duke
parents:
diff changeset
   720
        /** Next entry in same scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   721
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   722
        public Entry sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   723
06bc494ca11e Initial load
duke
parents:
diff changeset
   724
        /** The entry's scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   725
         *  scope == null   iff   this == sentinel
06bc494ca11e Initial load
duke
parents:
diff changeset
   726
         */
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   727
        public ScopeImpl scope;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   728
40235
fe6c00618434 8144733: Iterating over elements of a Scope can return spurious inner class elements
jlahoda
parents: 32454
diff changeset
   729
        public Entry(Symbol sym, Entry shadowed, Entry sibling, ScopeImpl scope) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   730
            this.sym = sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   731
            this.shadowed = shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   732
            this.sibling = sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   733
            this.scope = scope;
06bc494ca11e Initial load
duke
parents:
diff changeset
   734
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   735
06bc494ca11e Initial load
duke
parents:
diff changeset
   736
        /** Return next entry with the same name as this entry, proceeding
06bc494ca11e Initial load
duke
parents:
diff changeset
   737
         *  outwards if not found in this scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   738
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   739
        public Entry next() {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   740
            return shadowed;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   741
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   742
7628
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   743
        public Entry next(Filter<Symbol> sf) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   744
            if (shadowed.sym == null || sf == null || sf.accepts(shadowed.sym)) return shadowed;
7628
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   745
            else return shadowed.next(sf);
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   746
        }
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   747
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   748
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   749
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   750
    public static class ImportScope extends CompoundScope {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   751
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   752
        public ImportScope(Symbol owner) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   753
            super(owner);
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   754
        }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   755
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   756
        /**Finalize the content of the ImportScope to speed-up future lookups.
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   757
         * No further changes to class hierarchy or class content will be reflected.
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   758
         */
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   759
        public void finalizeScope() {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   760
            for (List<Scope> scopes = this.subScopes; scopes.nonEmpty(); scopes = scopes.tail) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   761
                Scope impScope = scopes.head;
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   762
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   763
                if (impScope instanceof FilterImportScope && impScope.owner.kind == Kind.TYP) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   764
                    WriteableScope finalized = WriteableScope.create(impScope.owner);
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   765
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   766
                    for (Symbol sym : impScope.getSymbols()) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   767
                        finalized.enter(sym);
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   768
                    }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   769
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   770
                    finalized.listeners.add(new ScopeListener() {
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   771
                        @Override
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   772
                        public void symbolAdded(Symbol sym, Scope s) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   773
                            Assert.error("The scope is sealed.");
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   774
                        }
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
   775
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   776
                        @Override
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   777
                        public void symbolRemoved(Symbol sym, Scope s) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   778
                            Assert.error("The scope is sealed.");
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   779
                        }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   780
                    });
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   781
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   782
                    scopes.head = finalized;
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   783
                }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   784
            }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   785
        }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   786
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   787
    }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   788
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   789
    public static class NamedImportScope extends ImportScope {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   790
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   791
        public NamedImportScope(Symbol owner, Scope currentFileScope) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   792
            super(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   793
            prependSubScope(currentFileScope);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   794
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   795
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   796
        public Scope importByName(Types types, Scope origin, Name name, ImportFilter filter, JCImport imp, BiConsumer<JCImport, CompletionFailure> cfHandler) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   797
            return appendScope(new FilterImportScope(types, origin, name, filter, imp, cfHandler));
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   798
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   799
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   800
        public Scope importType(Scope delegate, Scope origin, Symbol sym) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   801
            return appendScope(new SingleEntryScope(delegate.owner, sym, origin));
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   802
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   803
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   804
        private Scope appendScope(Scope newScope) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   805
            List<Scope> existingScopes = this.subScopes.reverse();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   806
            subScopes = List.of(existingScopes.head);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   807
            subScopes = subScopes.prepend(newScope);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   808
            for (Scope s : existingScopes.tail) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   809
                subScopes = subScopes.prepend(s);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   810
            }
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   811
            return newScope;
19492
767d7330011f 6537020: JCK tests: a compile-time error should be given in case of ambiguously imported fields (types, methods)
mcimadamore
parents: 18899
diff changeset
   812
        }
767d7330011f 6537020: JCK tests: a compile-time error should be given in case of ambiguously imported fields (types, methods)
mcimadamore
parents: 18899
diff changeset
   813
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   814
        private static class SingleEntryScope extends Scope {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   815
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   816
            private final Symbol sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   817
            private final List<Symbol> content;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   818
            private final Scope origin;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   819
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   820
            public SingleEntryScope(Symbol owner, Symbol sym, Scope origin) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   821
                super(owner);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   822
                this.sym = sym;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   823
                this.content = List.of(sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   824
                this.origin = origin;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   825
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   826
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   827
            @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   828
            public Iterable<Symbol> getSymbols(Filter<Symbol> sf, LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   829
                return sf == null || sf.accepts(sym) ? content : Collections.<Symbol>emptyList();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   830
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   831
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   832
            @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   833
            public Iterable<Symbol> getSymbolsByName(Name name,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   834
                                                     Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   835
                                                     LookupKind lookupKind) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   836
                return sym.name == name &&
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   837
                       (sf == null || sf.accepts(sym)) ? content : Collections.<Symbol>emptyList();
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   838
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   839
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   840
            @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   841
            public Scope getOrigin(Symbol byName) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   842
                return sym == byName ? origin : null;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   843
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   844
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   845
            @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   846
            public boolean isStaticallyImported(Symbol byName) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   847
                return false;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   848
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   849
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   850
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   851
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   852
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   853
    public static class StarImportScope extends ImportScope {
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   854
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   855
        public StarImportScope(Symbol owner) {
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   856
            super(owner);
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   857
        }
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   858
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   859
        public void importAll(Types types, Scope origin,
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   860
                              ImportFilter filter,
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   861
                              JCImport imp,
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   862
                              BiConsumer<JCImport, CompletionFailure> cfHandler) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   863
            for (Scope existing : subScopes) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   864
                Assert.check(existing instanceof FilterImportScope);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   865
                FilterImportScope fis = (FilterImportScope) existing;
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   866
                if (fis.origin == origin && fis.filter == filter &&
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   867
                    fis.imp.staticImport == imp.staticImport)
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   868
                    return ; //avoid entering the same scope twice
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   869
            }
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   870
            prependSubScope(new FilterImportScope(types, origin, null, filter, imp, cfHandler));
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   871
        }
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   872
29149
3fa94aad0264 8067886: Inaccessible nested classes can be incorrectly imported
jlahoda
parents: 27857
diff changeset
   873
        public boolean isFilled() {
3fa94aad0264 8067886: Inaccessible nested classes can be incorrectly imported
jlahoda
parents: 27857
diff changeset
   874
            return subScopes.nonEmpty();
3fa94aad0264 8067886: Inaccessible nested classes can be incorrectly imported
jlahoda
parents: 27857
diff changeset
   875
        }
3fa94aad0264 8067886: Inaccessible nested classes can be incorrectly imported
jlahoda
parents: 27857
diff changeset
   876
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   877
    }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   878
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   879
    public interface ImportFilter {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   880
        public boolean accepts(Scope origin, Symbol sym);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   881
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   882
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   883
    private static class FilterImportScope extends Scope {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   884
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   885
        private final Types types;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   886
        private final Scope origin;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   887
        private final Name  filterName;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   888
        private final ImportFilter filter;
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   889
        private final JCImport imp;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   890
        private final BiConsumer<JCImport, CompletionFailure> cfHandler;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   891
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   892
        public FilterImportScope(Types types,
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   893
                                 Scope origin,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   894
                                 Name  filterName,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   895
                                 ImportFilter filter,
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   896
                                 JCImport imp,
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   897
                                 BiConsumer<JCImport, CompletionFailure> cfHandler) {
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   898
            super(origin.owner);
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   899
            this.types = types;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   900
            this.origin = origin;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   901
            this.filterName = filterName;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   902
            this.filter = filter;
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   903
            this.imp = imp;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   904
            this.cfHandler = cfHandler;
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   905
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   906
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   907
        @Override
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   908
        public Iterable<Symbol> getSymbols(final Filter<Symbol> sf, final LookupKind lookupKind) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   909
            if (filterName != null)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   910
                return getSymbolsByName(filterName, sf, lookupKind);
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   911
            try {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   912
                SymbolImporter si = new SymbolImporter(imp.staticImport) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   913
                    @Override
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   914
                    Iterable<Symbol> doLookup(TypeSymbol tsym) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   915
                        return tsym.members().getSymbols(sf, lookupKind);
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   916
                    }
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   917
                };
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   918
                return si.importFrom((TypeSymbol) origin.owner) :: iterator;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   919
            } catch (CompletionFailure cf) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   920
                cfHandler.accept(imp, cf);
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   921
                return Collections.emptyList();
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   922
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   923
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   924
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   925
        @Override
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   926
        public Iterable<Symbol> getSymbolsByName(final Name name,
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   927
                                                 final Filter<Symbol> sf,
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   928
                                                 final LookupKind lookupKind) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   929
            if (filterName != null && filterName != name)
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   930
                return Collections.emptyList();
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   931
            try {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   932
                SymbolImporter si = new SymbolImporter(imp.staticImport) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   933
                    @Override
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   934
                    Iterable<Symbol> doLookup(TypeSymbol tsym) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   935
                        return tsym.members().getSymbolsByName(name, sf, lookupKind);
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   936
                    }
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   937
                };
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   938
                return si.importFrom((TypeSymbol) origin.owner) :: iterator;
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   939
            } catch (CompletionFailure cf) {
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   940
                cfHandler.accept(imp, cf);
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   941
                return Collections.emptyList();
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   942
            }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   943
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   944
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   945
        @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   946
        public Scope getOrigin(Symbol byName) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   947
            return origin;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   948
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   949
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   950
        @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   951
        public boolean isStaticallyImported(Symbol byName) {
32059
ea04f56aeacd 8131915: CompletionFailure during import listing crashes javac
jlahoda
parents: 31506
diff changeset
   952
            return imp.staticImport;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   953
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   954
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   955
        abstract class SymbolImporter {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   956
            Set<Symbol> processed = new HashSet<>();
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   957
            List<Iterable<Symbol>> delegates = List.nil();
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   958
            final boolean inspectSuperTypes;
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   959
            public SymbolImporter(boolean inspectSuperTypes) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   960
                this.inspectSuperTypes = inspectSuperTypes;
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   961
            }
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   962
            Stream<Symbol> importFrom(TypeSymbol tsym) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   963
                if (tsym == null || !processed.add(tsym))
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   964
                    return Stream.empty();
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   965
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   966
                Stream<Symbol> result = Stream.empty();
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   967
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   968
                if (inspectSuperTypes) {
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   969
                    // also import inherited names
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   970
                    result = importFrom(types.supertype(tsym.type).tsym);
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   971
                    for (Type t : types.interfaces(tsym.type))
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   972
                        result = Stream.concat(importFrom(t.tsym), result);
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   973
                }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   974
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   975
                return Stream.concat(StreamSupport.stream(doLookup(tsym).spliterator(), false)
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   976
                                                  .filter(s -> filter.accepts(origin, s)),
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   977
                                     result);
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   978
            }
27857
7e913a535736 7101822: Compiling depends on order of imports
jlahoda
parents: 27553
diff changeset
   979
            abstract Iterable<Symbol> doLookup(TypeSymbol tsym);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   980
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   981
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   982
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   983
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   984
    /** A class scope adds capabilities to keep track of changes in related
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   985
     *  class scopes - this allows client to realize whether a class scope
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   986
     *  has changed, either directly (because a new member has been added/removed
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   987
     *  to this scope) or indirectly (i.e. because a new member has been
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   988
     *  added/removed into a supertype scope)
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   989
     */
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   990
    public static class CompoundScope extends Scope implements ScopeListener {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   991
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   992
        List<Scope> subScopes = List.nil();
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   993
        private int mark = 0;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   994
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   995
        public CompoundScope(Symbol owner) {
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   996
            super(owner);
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   997
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   998
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
   999
        public void prependSubScope(Scope that) {
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1000
           if (that != null) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1001
                subScopes = subScopes.prepend(that);
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
  1002
                that.listeners.add(this);
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1003
                mark++;
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
  1004
                listeners.symbolAdded(null, this);
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1005
           }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1006
        }
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1007
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1008
        public void symbolAdded(Symbol sym, Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1009
            mark++;
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
  1010
            listeners.symbolAdded(sym, s);
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1011
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1012
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1013
        public void symbolRemoved(Symbol sym, Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1014
            mark++;
32454
b0ac04e0fefe 8129962: Investigate performance improvements in langtools combo tests
mcimadamore
parents: 32059
diff changeset
  1015
            listeners.symbolRemoved(sym, s);
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1016
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1017
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1018
        public int getMark() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1019
            return mark;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1020
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1021
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1022
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1023
        public String toString() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1024
            StringBuilder buf = new StringBuilder();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1025
            buf.append("CompoundScope{");
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1026
            String sep = "";
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1027
            for (Scope s : subScopes) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1028
                buf.append(sep);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1029
                buf.append(s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1030
                sep = ",";
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1031
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1032
            buf.append("}");
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1033
            return buf.toString();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1034
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1035
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1036
        @Override
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1037
        public Iterable<Symbol> getSymbols(final Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1038
                                           final LookupKind lookupKind) {
31506
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1039
            return () -> Iterators.createCompoundIterator(subScopes,
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1040
                                                          scope -> scope.getSymbols(sf,
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1041
                                                                                    lookupKind)
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1042
                                                                        .iterator());
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1043
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1044
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1045
        @Override
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1046
        public Iterable<Symbol> getSymbolsByName(final Name name,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1047
                                                 final Filter<Symbol> sf,
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1048
                                                 final LookupKind lookupKind) {
31506
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1049
            return () -> Iterators.createCompoundIterator(subScopes,
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1050
                                                          scope -> scope.getSymbolsByName(name,
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1051
                                                                                          sf,
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1052
                                                                                          lookupKind)
4e07f827a794 8072480: javac should support compilation for a specific platform version
jlahoda
parents: 30999
diff changeset
  1053
                                                                        .iterator());
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1054
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1055
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1056
        @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1057
        public Scope getOrigin(Symbol sym) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1058
            for (Scope delegate : subScopes) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1059
                if (delegate.includes(sym))
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1060
                    return delegate.getOrigin(sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1061
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1062
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1063
            return null;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1064
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1065
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1066
        @Override
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1067
        public boolean isStaticallyImported(Symbol sym) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1068
            for (Scope delegate : subScopes) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1069
                if (delegate.includes(sym))
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1070
                    return delegate.isStaticallyImported(sym);
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1071
            }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1072
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1073
            return false;
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1074
        }
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1075
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1076
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
  1077
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1078
    /** An error scope, for which the owner should be an error symbol. */
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1079
    public static class ErrorScope extends ScopeImpl {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1080
        ErrorScope(ScopeImpl next, Symbol errSymbol, Entry[] table) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
  1081
            super(next, /*owner=*/errSymbol, table);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1082
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1083
        public ErrorScope(Symbol errSymbol) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1084
            super(errSymbol);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1085
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1086
        public WriteableScope dup(Symbol newOwner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1087
            return new ErrorScope(this, newOwner, table);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1088
        }
25443
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1089
        public WriteableScope dupUnshared(Symbol newOwner) {
9187d77f2c64 8031569: Refactor javac scope implementation to enable lazy imports
jlahoda
parents: 19492
diff changeset
  1090
            return new ErrorScope(this, newOwner, table.clone());
10
06bc494ca11e Initial load
duke
parents:
diff changeset
  1091
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1092
        public Entry lookup(Name name) {
06bc494ca11e Initial load
duke
parents:
diff changeset
  1093
            Entry e = super.lookup(name);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1094
            if (e.scope == null)
06bc494ca11e Initial load
duke
parents:
diff changeset
  1095
                return new Entry(owner, null, null, null);
06bc494ca11e Initial load
duke
parents:
diff changeset
  1096
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
  1097
                return e;
06bc494ca11e Initial load
duke
parents:
diff changeset
  1098
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1099
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
  1100
}