langtools/src/share/classes/com/sun/tools/javac/code/Scope.java
author mcimadamore
Wed, 06 Feb 2013 14:03:39 +0000
changeset 15705 c4124695db0c
parent 14258 8d2148961366
child 18899 2557b27d1f1c
permissions -rw-r--r--
8007463: Cleanup inference related classes Summary: Make Infer.InferenceContext an inner class; adjust bound replacement logic in Type.UndetVar Reviewed-by: jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10
06bc494ca11e Initial load
duke
parents:
diff changeset
     1
/*
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 9593
diff changeset
     2
 * Copyright (c) 1999, 2012, 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
14258
8d2148961366 8000663: clean up langtools imports
jjg
parents: 9593
diff changeset
    28
import java.util.Iterator;
8d2148961366 8000663: clean up langtools imports
jjg
parents: 9593
diff changeset
    29
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    30
import com.sun.tools.javac.util.*;
06bc494ca11e Initial load
duke
parents:
diff changeset
    31
06bc494ca11e Initial load
duke
parents:
diff changeset
    32
/** A scope represents an area of visibility in a Java program. The
06bc494ca11e Initial load
duke
parents:
diff changeset
    33
 *  Scope class is a container for symbols which provides
06bc494ca11e Initial load
duke
parents:
diff changeset
    34
 *  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
    35
 *  as hash tables with "open addressing" and "double hashing".
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    36
 *  Scopes can be nested; the next field of a scope points
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    37
 *  to its next outer scope. Nested scopes can share their hash tables.
06bc494ca11e Initial load
duke
parents:
diff changeset
    38
 *
5847
1908176fd6e3 6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents: 5520
diff changeset
    39
 *  <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
    40
 *  If you write code that depends on this, you do so at your own risk.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    41
 *  This code and its internal interfaces are subject to change or
06bc494ca11e Initial load
duke
parents:
diff changeset
    42
 *  deletion without notice.</b>
06bc494ca11e Initial load
duke
parents:
diff changeset
    43
 */
06bc494ca11e Initial load
duke
parents:
diff changeset
    44
public class Scope {
06bc494ca11e Initial load
duke
parents:
diff changeset
    45
06bc494ca11e Initial load
duke
parents:
diff changeset
    46
    /** The number of scopes that share this scope's hash table.
06bc494ca11e Initial load
duke
parents:
diff changeset
    47
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    48
    private int shared;
06bc494ca11e Initial load
duke
parents:
diff changeset
    49
06bc494ca11e Initial load
duke
parents:
diff changeset
    50
    /** Next enclosing scope (with whom this scope may share a hashtable)
06bc494ca11e Initial load
duke
parents:
diff changeset
    51
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    52
    public Scope next;
06bc494ca11e Initial load
duke
parents:
diff changeset
    53
06bc494ca11e Initial load
duke
parents:
diff changeset
    54
    /** The scope's owner.
06bc494ca11e Initial load
duke
parents:
diff changeset
    55
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    56
    public Symbol owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
    57
06bc494ca11e Initial load
duke
parents:
diff changeset
    58
    /** A hash table for the scope's entries.
06bc494ca11e Initial load
duke
parents:
diff changeset
    59
     */
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    60
    Entry[] table;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    61
06bc494ca11e Initial load
duke
parents:
diff changeset
    62
    /** Mask for hash codes, always equal to (table.length - 1).
06bc494ca11e Initial load
duke
parents:
diff changeset
    63
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    64
    int hashMask;
06bc494ca11e Initial load
duke
parents:
diff changeset
    65
06bc494ca11e Initial load
duke
parents:
diff changeset
    66
    /** A linear list that also contains all entries in
06bc494ca11e Initial load
duke
parents:
diff changeset
    67
     *  reverse order of appearance (i.e later entries are pushed on top).
06bc494ca11e Initial load
duke
parents:
diff changeset
    68
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    69
    public Entry elems;
06bc494ca11e Initial load
duke
parents:
diff changeset
    70
06bc494ca11e Initial load
duke
parents:
diff changeset
    71
    /** The number of elements in this scope.
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    72
     * This includes deleted elements, whose value is the sentinel.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    73
     */
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    74
    int nelems = 0;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    75
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
    76
    /** 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
    77
     */
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
    78
    List<ScopeListener> listeners = List.nil();
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
    79
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    80
    /** Use as a "not-found" result for lookup.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
    81
     * Also used to mark deleted entries in the table.
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    82
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    83
    private static final Entry sentinel = new Entry(null, null, null, null);
06bc494ca11e Initial load
duke
parents:
diff changeset
    84
06bc494ca11e Initial load
duke
parents:
diff changeset
    85
    /** The hash table's initial size.
06bc494ca11e Initial load
duke
parents:
diff changeset
    86
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
    87
    private static final int INITIAL_SIZE = 0x10;
06bc494ca11e Initial load
duke
parents:
diff changeset
    88
06bc494ca11e Initial load
duke
parents:
diff changeset
    89
    /** A value for the empty scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
    90
     */
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
    91
    public static final Scope emptyScope = new Scope(null, null, new Entry[]{});
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    92
06bc494ca11e Initial load
duke
parents:
diff changeset
    93
    /** Construct a new scope, within scope next, with given owner, using
06bc494ca11e Initial load
duke
parents:
diff changeset
    94
     *  given table. The table's length must be an exponent of 2.
06bc494ca11e Initial load
duke
parents:
diff changeset
    95
     */
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
    96
    private Scope(Scope next, Symbol owner, Entry[] table) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    97
        this.next = next;
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
    98
        Assert.check(emptyScope == null || owner != null);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
    99
        this.owner = owner;
06bc494ca11e Initial load
duke
parents:
diff changeset
   100
        this.table = table;
06bc494ca11e Initial load
duke
parents:
diff changeset
   101
        this.hashMask = table.length - 1;
06bc494ca11e Initial load
duke
parents:
diff changeset
   102
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   103
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   104
    /** Convenience constructor used for dup and dupUnshared. */
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   105
    private Scope(Scope next, Symbol owner, Entry[] table, int nelems) {
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   106
        this(next, owner, table);
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   107
        this.nelems = nelems;
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   108
    }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   109
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   110
    /** Construct a new scope, within scope next, with given owner,
06bc494ca11e Initial load
duke
parents:
diff changeset
   111
     *  using a fresh table of length INITIAL_SIZE.
06bc494ca11e Initial load
duke
parents:
diff changeset
   112
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   113
    public Scope(Symbol owner) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   114
        this(null, owner, new Entry[INITIAL_SIZE]);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   115
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   116
06bc494ca11e Initial load
duke
parents:
diff changeset
   117
    /** Construct a fresh scope within this scope, with same owner,
06bc494ca11e Initial load
duke
parents:
diff changeset
   118
     *  which shares its table with the outer scope. Used in connection with
06bc494ca11e Initial load
duke
parents:
diff changeset
   119
     *  method leave if scope access is stack-like in order to avoid allocation
06bc494ca11e Initial load
duke
parents:
diff changeset
   120
     *  of fresh tables.
06bc494ca11e Initial load
duke
parents:
diff changeset
   121
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   122
    public Scope dup() {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   123
        return dup(this.owner);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   124
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   125
06bc494ca11e Initial load
duke
parents:
diff changeset
   126
    /** Construct a fresh scope within this scope, with new owner,
06bc494ca11e Initial load
duke
parents:
diff changeset
   127
     *  which shares its table with the outer scope. Used in connection with
06bc494ca11e Initial load
duke
parents:
diff changeset
   128
     *  method leave if scope access is stack-like in order to avoid allocation
06bc494ca11e Initial load
duke
parents:
diff changeset
   129
     *  of fresh tables.
06bc494ca11e Initial load
duke
parents:
diff changeset
   130
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   131
    public Scope dup(Symbol newOwner) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   132
        Scope result = new Scope(this, newOwner, this.table, this.nelems);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   133
        shared++;
06bc494ca11e Initial load
duke
parents:
diff changeset
   134
        // System.out.println("====> duping scope " + this.hashCode() + " owned by " + newOwner + " to " + result.hashCode());
06bc494ca11e Initial load
duke
parents:
diff changeset
   135
        // new Error().printStackTrace(System.out);
06bc494ca11e Initial load
duke
parents:
diff changeset
   136
        return result;
06bc494ca11e Initial load
duke
parents:
diff changeset
   137
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   138
06bc494ca11e Initial load
duke
parents:
diff changeset
   139
    /** Construct a fresh scope within this scope, with same owner,
06bc494ca11e Initial load
duke
parents:
diff changeset
   140
     *  with a new hash table, whose contents initially are those of
06bc494ca11e Initial load
duke
parents:
diff changeset
   141
     *  the table of its outer scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   142
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   143
    public Scope dupUnshared() {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   144
        return new Scope(this, this.owner, this.table.clone(), this.nelems);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   145
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   146
06bc494ca11e Initial load
duke
parents:
diff changeset
   147
    /** Remove all entries of this scope from its table, if shared
06bc494ca11e Initial load
duke
parents:
diff changeset
   148
     *  with next.
06bc494ca11e Initial load
duke
parents:
diff changeset
   149
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   150
    public Scope leave() {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   151
        Assert.check(shared == 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   152
        if (table != next.table) return next;
06bc494ca11e Initial load
duke
parents:
diff changeset
   153
        while (elems != null) {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   154
            int hash = getIndex(elems.sym.name);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   155
            Entry e = table[hash];
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   156
            Assert.check(e == elems, elems.sym);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   157
            table[hash] = elems.shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   158
            elems = elems.sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   159
        }
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   160
        Assert.check(next.shared > 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   161
        next.shared--;
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   162
        next.nelems = nelems;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   163
        // System.out.println("====> leaving scope " + this.hashCode() + " owned by " + this.owner + " to " + next.hashCode());
06bc494ca11e Initial load
duke
parents:
diff changeset
   164
        // new Error().printStackTrace(System.out);
06bc494ca11e Initial load
duke
parents:
diff changeset
   165
        return next;
06bc494ca11e Initial load
duke
parents:
diff changeset
   166
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   167
06bc494ca11e Initial load
duke
parents:
diff changeset
   168
    /** Double size of hash table.
06bc494ca11e Initial load
duke
parents:
diff changeset
   169
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   170
    private void dble() {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   171
        Assert.check(shared == 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   172
        Entry[] oldtable = table;
06bc494ca11e Initial load
duke
parents:
diff changeset
   173
        Entry[] newtable = new Entry[oldtable.length * 2];
06bc494ca11e Initial load
duke
parents:
diff changeset
   174
        for (Scope s = this; s != null; s = s.next) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   175
            if (s.table == oldtable) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   176
                Assert.check(s == this || s.shared != 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   177
                s.table = newtable;
06bc494ca11e Initial load
duke
parents:
diff changeset
   178
                s.hashMask = newtable.length - 1;
06bc494ca11e Initial load
duke
parents:
diff changeset
   179
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   180
        }
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   181
        int n = 0;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   182
        for (int i = oldtable.length; --i >= 0; ) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   183
            Entry e = oldtable[i];
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   184
            if (e != null && e != sentinel) {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   185
                table[getIndex(e.sym.name)] = e;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   186
                n++;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   187
            }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   188
        }
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   189
        // We don't need to update nelems for shared inherited scopes,
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   190
        // since that gets handled by leave().
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   191
        nelems = n;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   192
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   193
06bc494ca11e Initial load
duke
parents:
diff changeset
   194
    /** Enter symbol sym in this scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   195
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   196
    public void enter(Symbol sym) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   197
        Assert.check(shared == 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   198
        enter(sym, this);
06bc494ca11e Initial load
duke
parents:
diff changeset
   199
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   200
06bc494ca11e Initial load
duke
parents:
diff changeset
   201
    public void enter(Symbol sym, Scope s) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   202
        enter(sym, s, s);
06bc494ca11e Initial load
duke
parents:
diff changeset
   203
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   204
06bc494ca11e Initial load
duke
parents:
diff changeset
   205
    /**
06bc494ca11e Initial load
duke
parents:
diff changeset
   206
     * Enter symbol sym in this scope, but mark that it comes from
06bc494ca11e Initial load
duke
parents:
diff changeset
   207
     * given scope `s' accessed through `origin'.  The last two
06bc494ca11e Initial load
duke
parents:
diff changeset
   208
     * arguments are only used in import scopes.
06bc494ca11e Initial load
duke
parents:
diff changeset
   209
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   210
    public void enter(Symbol sym, Scope s, Scope origin) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   211
        Assert.check(shared == 0);
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   212
        if (nelems * 3 >= hashMask * 2)
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   213
            dble();
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   214
        int hash = getIndex(sym.name);
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   215
        Entry old = table[hash];
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   216
        if (old == null) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   217
            old = sentinel;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   218
            nelems++;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   219
        }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   220
        Entry e = makeEntry(sym, old, elems, s, origin);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   221
        table[hash] = e;
06bc494ca11e Initial load
duke
parents:
diff changeset
   222
        elems = e;
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   223
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   224
        //notify listeners
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   225
        for (List<ScopeListener> l = listeners; l.nonEmpty(); l = l.tail) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   226
            l.head.symbolAdded(sym, this);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   227
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   228
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   229
06bc494ca11e Initial load
duke
parents:
diff changeset
   230
    Entry makeEntry(Symbol sym, Entry shadowed, Entry sibling, Scope scope, Scope origin) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   231
        return new Entry(sym, shadowed, sibling, scope);
06bc494ca11e Initial load
duke
parents:
diff changeset
   232
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   233
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   234
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   235
    public interface ScopeListener {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   236
        public void symbolAdded(Symbol sym, Scope s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   237
        public void symbolRemoved(Symbol sym, Scope s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   238
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   239
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   240
    public void addScopeListener(ScopeListener sl) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   241
        listeners = listeners.prepend(sl);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   242
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   243
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   244
    /** Remove symbol from this scope.  Used when an inner class
06bc494ca11e Initial load
duke
parents:
diff changeset
   245
     *  attribute tells us that the class isn't a package member.
06bc494ca11e Initial load
duke
parents:
diff changeset
   246
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   247
    public void remove(Symbol sym) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   248
        Assert.check(shared == 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   249
        Entry e = lookup(sym.name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   250
        if (e.scope == null) return;
06bc494ca11e Initial load
duke
parents:
diff changeset
   251
06bc494ca11e Initial load
duke
parents:
diff changeset
   252
        // remove e from table and shadowed list;
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   253
        int i = getIndex(sym.name);
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   254
        Entry te = table[i];
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   255
        if (te == e)
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   256
            table[i] = e.shadowed;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   257
        else while (true) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   258
            if (te.shadowed == e) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   259
                te.shadowed = e.shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   260
                break;
06bc494ca11e Initial load
duke
parents:
diff changeset
   261
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   262
            te = te.shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   263
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   264
06bc494ca11e Initial load
duke
parents:
diff changeset
   265
        // remove e from elems and sibling list
06bc494ca11e Initial load
duke
parents:
diff changeset
   266
        te = elems;
06bc494ca11e Initial load
duke
parents:
diff changeset
   267
        if (te == e)
06bc494ca11e Initial load
duke
parents:
diff changeset
   268
            elems = e.sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   269
        else while (true) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   270
            if (te.sibling == e) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   271
                te.sibling = e.sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   272
                break;
06bc494ca11e Initial load
duke
parents:
diff changeset
   273
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   274
            te = te.sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   275
        }
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   276
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   277
        //notify listeners
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   278
        for (List<ScopeListener> l = listeners; l.nonEmpty(); l = l.tail) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   279
            l.head.symbolRemoved(sym, this);
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   280
        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   281
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   282
06bc494ca11e Initial load
duke
parents:
diff changeset
   283
    /** Enter symbol sym in this scope if not already there.
06bc494ca11e Initial load
duke
parents:
diff changeset
   284
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   285
    public void enterIfAbsent(Symbol sym) {
8032
e1aa25ccdabb 6396503: javac should not require assertions enabled
jjg
parents: 7628
diff changeset
   286
        Assert.check(shared == 0);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   287
        Entry e = lookup(sym.name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   288
        while (e.scope == this && e.sym.kind != sym.kind) e = e.next();
06bc494ca11e Initial load
duke
parents:
diff changeset
   289
        if (e.scope != this) enter(sym);
06bc494ca11e Initial load
duke
parents:
diff changeset
   290
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   291
06bc494ca11e Initial load
duke
parents:
diff changeset
   292
    /** Given a class, is there already a class with same fully
06bc494ca11e Initial load
duke
parents:
diff changeset
   293
     *  qualified name in this (import) scope?
06bc494ca11e Initial load
duke
parents:
diff changeset
   294
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   295
    public boolean includes(Symbol c) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   296
        for (Scope.Entry e = lookup(c.name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   297
             e.scope == this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   298
             e = e.next()) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   299
            if (e.sym == c) return true;
06bc494ca11e Initial load
duke
parents:
diff changeset
   300
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   301
        return false;
06bc494ca11e Initial load
duke
parents:
diff changeset
   302
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   303
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   304
    static final Filter<Symbol> noFilter = new Filter<Symbol>() {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   305
        public boolean accepts(Symbol s) {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   306
            return true;
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   307
        }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   308
    };
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   309
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   310
    /** Return the entry associated with given name, starting in
06bc494ca11e Initial load
duke
parents:
diff changeset
   311
     *  this scope and proceeding outwards. If no entry was found,
06bc494ca11e Initial load
duke
parents:
diff changeset
   312
     *  return the sentinel, which is characterized by having a null in
06bc494ca11e Initial load
duke
parents:
diff changeset
   313
     *  both its scope and sym fields, whereas both fields are non-null
06bc494ca11e Initial load
duke
parents:
diff changeset
   314
     *  for regular entries.
06bc494ca11e Initial load
duke
parents:
diff changeset
   315
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   316
    public Entry lookup(Name name) {
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   317
        return lookup(name, noFilter);
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   318
    }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   319
    public Entry lookup(Name name, Filter<Symbol> sf) {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   320
        Entry e = table[getIndex(name)];
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   321
        if (e == null || e == sentinel)
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   322
            return sentinel;
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   323
        while (e.scope != null && (e.sym.name != name || !sf.accepts(e.sym)))
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   324
            e = e.shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   325
        return e;
06bc494ca11e Initial load
duke
parents:
diff changeset
   326
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   327
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   328
    /*void dump (java.io.PrintStream out) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   329
        out.println(this);
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   330
        for (int l=0; l < table.length; l++) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   331
            Entry le = table[l];
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   332
            out.print("#"+l+": ");
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   333
            if (le==sentinel) out.println("sentinel");
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   334
            else if(le == null) out.println("null");
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   335
            else out.println(""+le+" s:"+le.sym);
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   336
        }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   337
    }*/
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   338
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   339
    /** Look for slot in the table.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   340
     *  We use open addressing with double hashing.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   341
     */
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   342
    int getIndex (Name name) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   343
        int h = name.hashCode();
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   344
        int i = h & hashMask;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   345
        // The expression below is always odd, so it is guaranteed
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   346
        // to be mutually prime with table.length, a power of 2.
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   347
        int x = hashMask - ((h + (h >> 16)) << 1);
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   348
        int d = -1; // Index of a deleted item.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   349
        for (;;) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   350
            Entry e = table[i];
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   351
            if (e == null)
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   352
                return d >= 0 ? d : i;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   353
            if (e == sentinel) {
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   354
                // We have to keep searching even if we see a deleted item.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   355
                // However, remember the index in case we fail to find the name.
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   356
                if (d < 0)
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   357
                    d = i;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   358
            } else if (e.sym.name == name)
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   359
                return i;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   360
            i = (i + x) & hashMask;
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   361
        }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   362
    }
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   363
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   364
    public Iterable<Symbol> getElements() {
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   365
        return getElements(noFilter);
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   366
    }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   367
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   368
    public Iterable<Symbol> getElements(final Filter<Symbol> sf) {
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   369
        return new Iterable<Symbol>() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   370
            public Iterator<Symbol> iterator() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   371
                return new Iterator<Symbol>() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   372
                    private Scope currScope = Scope.this;
06bc494ca11e Initial load
duke
parents:
diff changeset
   373
                    private Scope.Entry currEntry = elems;
06bc494ca11e Initial load
duke
parents:
diff changeset
   374
                    {
06bc494ca11e Initial load
duke
parents:
diff changeset
   375
                        update();
06bc494ca11e Initial load
duke
parents:
diff changeset
   376
                    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   377
06bc494ca11e Initial load
duke
parents:
diff changeset
   378
                    public boolean hasNext() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   379
                        return currEntry != null;
06bc494ca11e Initial load
duke
parents:
diff changeset
   380
                    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   381
06bc494ca11e Initial load
duke
parents:
diff changeset
   382
                    public Symbol next() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   383
                        Symbol sym = (currEntry == null ? null : currEntry.sym);
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   384
                        if (currEntry != null) {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   385
                            currEntry = currEntry.sibling;
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   386
                        }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   387
                        update();
06bc494ca11e Initial load
duke
parents:
diff changeset
   388
                        return sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   389
                    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   390
06bc494ca11e Initial load
duke
parents:
diff changeset
   391
                    public void remove() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   392
                        throw new UnsupportedOperationException();
06bc494ca11e Initial load
duke
parents:
diff changeset
   393
                    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   394
06bc494ca11e Initial load
duke
parents:
diff changeset
   395
                    private void update() {
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   396
                        skipToNextMatchingEntry();
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   397
                        while (currEntry == null && currScope.next != null) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   398
                            currScope = currScope.next;
06bc494ca11e Initial load
duke
parents:
diff changeset
   399
                            currEntry = currScope.elems;
6591
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   400
                            skipToNextMatchingEntry();
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   401
                        }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   402
                    }
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   403
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   404
                    void skipToNextMatchingEntry() {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   405
                        while (currEntry != null && !sf.accepts(currEntry.sym)) {
a953c8c6b85e 6337171: javac should create bridge methods when type variable bounds restricted
mcimadamore
parents: 5847
diff changeset
   406
                            currEntry = currEntry.sibling;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   407
                        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   408
                    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   409
                };
06bc494ca11e Initial load
duke
parents:
diff changeset
   410
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   411
        };
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   412
    }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   413
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   414
    public Iterable<Symbol> getElementsByName(Name name) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   415
        return getElementsByName(name, noFilter);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   416
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   417
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   418
    public Iterable<Symbol> getElementsByName(final Name name, final Filter<Symbol> sf) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   419
        return new Iterable<Symbol>() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   420
            public Iterator<Symbol> iterator() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   421
                 return new Iterator<Symbol>() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   422
                    Scope.Entry currentEntry = lookup(name, sf);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   423
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   424
                    public boolean hasNext() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   425
                        return currentEntry.scope != null;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   426
                    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   427
                    public Symbol next() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   428
                        Scope.Entry prevEntry = currentEntry;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   429
                        currentEntry = currentEntry.next(sf);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   430
                        return prevEntry.sym;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   431
                    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   432
                    public void remove() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   433
                        throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   434
                    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   435
                };
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   436
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   437
        };
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   438
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   439
06bc494ca11e Initial load
duke
parents:
diff changeset
   440
    public String toString() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   441
        StringBuilder result = new StringBuilder();
06bc494ca11e Initial load
duke
parents:
diff changeset
   442
        result.append("Scope[");
06bc494ca11e Initial load
duke
parents:
diff changeset
   443
        for (Scope s = this; s != null ; s = s.next) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   444
            if (s != this) result.append(" | ");
06bc494ca11e Initial load
duke
parents:
diff changeset
   445
            for (Entry e = s.elems; e != null; e = e.sibling) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   446
                if (e != s.elems) result.append(", ");
06bc494ca11e Initial load
duke
parents:
diff changeset
   447
                result.append(e.sym);
06bc494ca11e Initial load
duke
parents:
diff changeset
   448
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   449
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   450
        result.append("]");
06bc494ca11e Initial load
duke
parents:
diff changeset
   451
        return result.toString();
06bc494ca11e Initial load
duke
parents:
diff changeset
   452
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   453
06bc494ca11e Initial load
duke
parents:
diff changeset
   454
    /** A class for scope entries.
06bc494ca11e Initial load
duke
parents:
diff changeset
   455
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   456
    public static class Entry {
06bc494ca11e Initial load
duke
parents:
diff changeset
   457
06bc494ca11e Initial load
duke
parents:
diff changeset
   458
        /** The referenced symbol.
06bc494ca11e Initial load
duke
parents:
diff changeset
   459
         *  sym == null   iff   this == sentinel
06bc494ca11e Initial load
duke
parents:
diff changeset
   460
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   461
        public Symbol sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   462
06bc494ca11e Initial load
duke
parents:
diff changeset
   463
        /** An entry with the same hash code, or sentinel.
06bc494ca11e Initial load
duke
parents:
diff changeset
   464
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   465
        private Entry shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   466
06bc494ca11e Initial load
duke
parents:
diff changeset
   467
        /** Next entry in same scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   468
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   469
        public Entry sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   470
06bc494ca11e Initial load
duke
parents:
diff changeset
   471
        /** The entry's scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   472
         *  scope == null   iff   this == sentinel
06bc494ca11e Initial load
duke
parents:
diff changeset
   473
         *  for an entry in an import scope, this is the scope
06bc494ca11e Initial load
duke
parents:
diff changeset
   474
         *  where the entry came from (i.e. was imported from).
06bc494ca11e Initial load
duke
parents:
diff changeset
   475
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   476
        public Scope scope;
06bc494ca11e Initial load
duke
parents:
diff changeset
   477
06bc494ca11e Initial load
duke
parents:
diff changeset
   478
        public Entry(Symbol sym, Entry shadowed, Entry sibling, Scope scope) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   479
            this.sym = sym;
06bc494ca11e Initial load
duke
parents:
diff changeset
   480
            this.shadowed = shadowed;
06bc494ca11e Initial load
duke
parents:
diff changeset
   481
            this.sibling = sibling;
06bc494ca11e Initial load
duke
parents:
diff changeset
   482
            this.scope = scope;
06bc494ca11e Initial load
duke
parents:
diff changeset
   483
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   484
06bc494ca11e Initial load
duke
parents:
diff changeset
   485
        /** Return next entry with the same name as this entry, proceeding
06bc494ca11e Initial load
duke
parents:
diff changeset
   486
         *  outwards if not found in this scope.
06bc494ca11e Initial load
duke
parents:
diff changeset
   487
         */
06bc494ca11e Initial load
duke
parents:
diff changeset
   488
        public Entry next() {
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   489
            return shadowed;
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   490
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   491
7628
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   492
        public Entry next(Filter<Symbol> sf) {
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   493
            if (shadowed.sym == null || sf.accepts(shadowed.sym)) return shadowed;
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   494
            else return shadowed.next(sf);
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   495
        }
e7baeb97d164 6476118: compiler bug causes runtime ClassCastException for generics overloading
mcimadamore
parents: 7615
diff changeset
   496
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   497
        public Scope getOrigin() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   498
            // The origin is only recorded for import scopes.  For all
06bc494ca11e Initial load
duke
parents:
diff changeset
   499
            // other scope entries, the "enclosing" type is available
06bc494ca11e Initial load
duke
parents:
diff changeset
   500
            // from other sources.  See Attr.visitSelect and
06bc494ca11e Initial load
duke
parents:
diff changeset
   501
            // Attr.visitIdent.  Rather than throwing an assertion
06bc494ca11e Initial load
duke
parents:
diff changeset
   502
            // error, we return scope which will be the same as origin
06bc494ca11e Initial load
duke
parents:
diff changeset
   503
            // in many cases.
06bc494ca11e Initial load
duke
parents:
diff changeset
   504
            return scope;
06bc494ca11e Initial load
duke
parents:
diff changeset
   505
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   506
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   507
06bc494ca11e Initial load
duke
parents:
diff changeset
   508
    public static class ImportScope extends Scope {
06bc494ca11e Initial load
duke
parents:
diff changeset
   509
06bc494ca11e Initial load
duke
parents:
diff changeset
   510
        public ImportScope(Symbol owner) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   511
            super(owner);
06bc494ca11e Initial load
duke
parents:
diff changeset
   512
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   513
06bc494ca11e Initial load
duke
parents:
diff changeset
   514
        @Override
06bc494ca11e Initial load
duke
parents:
diff changeset
   515
        Entry makeEntry(Symbol sym, Entry shadowed, Entry sibling, Scope scope, Scope origin) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   516
            return new ImportEntry(sym, shadowed, sibling, scope, origin);
06bc494ca11e Initial load
duke
parents:
diff changeset
   517
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   518
06bc494ca11e Initial load
duke
parents:
diff changeset
   519
        static class ImportEntry extends Entry {
06bc494ca11e Initial load
duke
parents:
diff changeset
   520
            private Scope origin;
06bc494ca11e Initial load
duke
parents:
diff changeset
   521
06bc494ca11e Initial load
duke
parents:
diff changeset
   522
            ImportEntry(Symbol sym, Entry shadowed, Entry sibling, Scope scope, Scope origin) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   523
                super(sym, shadowed, sibling, scope);
06bc494ca11e Initial load
duke
parents:
diff changeset
   524
                this.origin = origin;
06bc494ca11e Initial load
duke
parents:
diff changeset
   525
            }
06bc494ca11e Initial load
duke
parents:
diff changeset
   526
06bc494ca11e Initial load
duke
parents:
diff changeset
   527
            @Override
06bc494ca11e Initial load
duke
parents:
diff changeset
   528
            public Scope getOrigin() { return origin; }
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   529
        }
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   530
    }
7206
02edd110358f 6998063: new Scope impl to fix Scope performance issues
jjg
parents: 7079
diff changeset
   531
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   532
    public static class StarImportScope extends ImportScope implements ScopeListener {
7615
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   533
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   534
        public StarImportScope(Symbol owner) {
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   535
            super(owner);
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   536
        }
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   537
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   538
        public void importAll (Scope fromScope) {
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   539
            for (Scope.Entry e = fromScope.elems; e != null; e = e.sibling) {
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   540
                if (e.sym.kind == Kinds.TYP && !includes(e.sym))
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   541
                    enter(e.sym, fromScope);
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   542
            }
8bc078486f2b 7004029: intermittent failures compiling pack200
jjg
parents: 7329
diff changeset
   543
            // Register to be notified when imported items are removed
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   544
            fromScope.addScopeListener(this);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   545
        }
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   546
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   547
        public void symbolRemoved(Symbol sym, Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   548
            remove(sym);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   549
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   550
        public void symbolAdded(Symbol sym, Scope s) { }
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   551
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   552
06bc494ca11e Initial load
duke
parents:
diff changeset
   553
    /** An empty scope, into which you can't place anything.  Used for
06bc494ca11e Initial load
duke
parents:
diff changeset
   554
     *  the scope for a variable initializer.
06bc494ca11e Initial load
duke
parents:
diff changeset
   555
     */
06bc494ca11e Initial load
duke
parents:
diff changeset
   556
    public static class DelegatedScope extends Scope {
06bc494ca11e Initial load
duke
parents:
diff changeset
   557
        Scope delegatee;
06bc494ca11e Initial load
duke
parents:
diff changeset
   558
        public static final Entry[] emptyTable = new Entry[0];
06bc494ca11e Initial load
duke
parents:
diff changeset
   559
06bc494ca11e Initial load
duke
parents:
diff changeset
   560
        public DelegatedScope(Scope outer) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   561
            super(outer, outer.owner, emptyTable);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   562
            delegatee = outer;
06bc494ca11e Initial load
duke
parents:
diff changeset
   563
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   564
        public Scope dup() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   565
            return new DelegatedScope(next);
06bc494ca11e Initial load
duke
parents:
diff changeset
   566
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   567
        public Scope dupUnshared() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   568
            return new DelegatedScope(next);
06bc494ca11e Initial load
duke
parents:
diff changeset
   569
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   570
        public Scope leave() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   571
            return next;
06bc494ca11e Initial load
duke
parents:
diff changeset
   572
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   573
        public void enter(Symbol sym) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   574
            // only anonymous classes could be put here
06bc494ca11e Initial load
duke
parents:
diff changeset
   575
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   576
        public void enter(Symbol sym, Scope s) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   577
            // only anonymous classes could be put here
06bc494ca11e Initial load
duke
parents:
diff changeset
   578
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   579
        public void remove(Symbol sym) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   580
            throw new AssertionError(sym);
06bc494ca11e Initial load
duke
parents:
diff changeset
   581
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   582
        public Entry lookup(Name name) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   583
            return delegatee.lookup(name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   584
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   585
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   586
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   587
    /** 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
   588
     *  class scopes - this allows client to realize whether a class scope
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   589
     *  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
   590
     *  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
   591
     *  added/removed into a supertype scope)
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   592
     */
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   593
    public static class CompoundScope extends Scope implements ScopeListener {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   594
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   595
        public static final Entry[] emptyTable = new Entry[0];
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   596
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   597
        private List<Scope> subScopes = List.nil();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   598
        private int mark = 0;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   599
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   600
        public CompoundScope(Symbol owner) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   601
            super(null, owner, emptyTable);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   602
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   603
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   604
        public void addSubScope(Scope that) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   605
           if (that != null) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   606
                subScopes = subScopes.prepend(that);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   607
                that.addScopeListener(this);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   608
                mark++;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   609
                for (ScopeListener sl : listeners) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   610
                    sl.symbolAdded(null, this); //propagate upwards in case of nested CompoundScopes
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   611
                }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   612
           }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   613
         }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   614
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   615
        public void symbolAdded(Symbol sym, Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   616
            mark++;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   617
            for (ScopeListener sl : listeners) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   618
                sl.symbolAdded(sym, s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   619
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   620
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   621
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   622
        public void symbolRemoved(Symbol sym, Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   623
            mark++;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   624
            for (ScopeListener sl : listeners) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   625
                sl.symbolRemoved(sym, s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   626
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   627
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   628
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   629
        public int getMark() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   630
            return mark;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   631
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   632
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   633
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   634
        public String toString() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   635
            StringBuilder buf = new StringBuilder();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   636
            buf.append("CompoundScope{");
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   637
            String sep = "";
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   638
            for (Scope s : subScopes) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   639
                buf.append(sep);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   640
                buf.append(s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   641
                sep = ",";
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   642
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   643
            buf.append("}");
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   644
            return buf.toString();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   645
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   646
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   647
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   648
        public Iterable<Symbol> getElements(final Filter<Symbol> sf) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   649
            return new Iterable<Symbol>() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   650
                public Iterator<Symbol> iterator() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   651
                    return new CompoundScopeIterator(subScopes) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   652
                        Iterator<Symbol> nextIterator(Scope s) {
9593
f917c044e651 7036906: Scope: CompoundScope.getElements() doesn't pass scope filter to subscopes
mcimadamore
parents: 8427
diff changeset
   653
                            return s.getElements(sf).iterator();
8427
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   654
                        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   655
                    };
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   656
                }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   657
            };
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   658
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   659
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   660
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   661
        public Iterable<Symbol> getElementsByName(final Name name, final Filter<Symbol> sf) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   662
            return new Iterable<Symbol>() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   663
                public Iterator<Symbol> iterator() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   664
                    return new CompoundScopeIterator(subScopes) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   665
                        Iterator<Symbol> nextIterator(Scope s) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   666
                            return s.getElementsByName(name, sf).iterator();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   667
                        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   668
                    };
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   669
                }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   670
            };
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   671
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   672
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   673
        abstract class CompoundScopeIterator implements Iterator<Symbol> {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   674
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   675
            private Iterator<Symbol> currentIterator;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   676
            private List<Scope> scopesToScan;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   677
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   678
            public CompoundScopeIterator(List<Scope> scopesToScan) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   679
                this.scopesToScan = scopesToScan;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   680
                update();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   681
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   682
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   683
            abstract Iterator<Symbol> nextIterator(Scope s);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   684
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   685
            public boolean hasNext() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   686
                return currentIterator != null;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   687
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   688
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   689
            public Symbol next() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   690
                Symbol sym = currentIterator.next();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   691
                if (!currentIterator.hasNext()) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   692
                    update();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   693
                }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   694
                return sym;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   695
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   696
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   697
            public void remove() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   698
                throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   699
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   700
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   701
            private void update() {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   702
                while (scopesToScan.nonEmpty()) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   703
                    currentIterator = nextIterator(scopesToScan.head);
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   704
                    scopesToScan = scopesToScan.tail;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   705
                    if (currentIterator.hasNext()) return;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   706
                }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   707
                currentIterator = null;
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   708
            }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   709
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   710
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   711
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   712
        public Entry lookup(Name name, Filter<Symbol> sf) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   713
            throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   714
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   715
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   716
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   717
        public Scope dup(Symbol newOwner) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   718
            throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   719
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   720
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   721
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   722
        public void enter(Symbol sym, Scope s, Scope origin) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   723
            throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   724
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   725
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   726
        @Override
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   727
        public void remove(Symbol sym) {
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   728
            throw new UnsupportedOperationException();
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   729
        }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   730
    }
703181b01773 7017664: Add listeners infrastracture to javac scopes
mcimadamore
parents: 8242
diff changeset
   731
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   732
    /** An error scope, for which the owner should be an error symbol. */
06bc494ca11e Initial load
duke
parents:
diff changeset
   733
    public static class ErrorScope extends Scope {
06bc494ca11e Initial load
duke
parents:
diff changeset
   734
        ErrorScope(Scope next, Symbol errSymbol, Entry[] table) {
8242
3873b4aaf4a8 7007615: java_util/generics/phase2/NameClashTest02 fails since jdk7/pit/b123.
mcimadamore
parents: 8032
diff changeset
   735
            super(next, /*owner=*/errSymbol, table);
10
06bc494ca11e Initial load
duke
parents:
diff changeset
   736
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   737
        public ErrorScope(Symbol errSymbol) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   738
            super(errSymbol);
06bc494ca11e Initial load
duke
parents:
diff changeset
   739
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   740
        public Scope dup() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   741
            return new ErrorScope(this, owner, table);
06bc494ca11e Initial load
duke
parents:
diff changeset
   742
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   743
        public Scope dupUnshared() {
06bc494ca11e Initial load
duke
parents:
diff changeset
   744
            return new ErrorScope(this, owner, table.clone());
06bc494ca11e Initial load
duke
parents:
diff changeset
   745
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   746
        public Entry lookup(Name name) {
06bc494ca11e Initial load
duke
parents:
diff changeset
   747
            Entry e = super.lookup(name);
06bc494ca11e Initial load
duke
parents:
diff changeset
   748
            if (e.scope == null)
06bc494ca11e Initial load
duke
parents:
diff changeset
   749
                return new Entry(owner, null, null, null);
06bc494ca11e Initial load
duke
parents:
diff changeset
   750
            else
06bc494ca11e Initial load
duke
parents:
diff changeset
   751
                return e;
06bc494ca11e Initial load
duke
parents:
diff changeset
   752
        }
06bc494ca11e Initial load
duke
parents:
diff changeset
   753
    }
06bc494ca11e Initial load
duke
parents:
diff changeset
   754
}