EMMA Coverage Report (generated Thu Dec 06 15:52:10 GMT 2007)
[all classes][com.sun.tools.javac.comp]

COVERAGE SUMMARY FOR SOURCE FILE [Resolve.java]

nameclass, %method, %block, %line, %
Resolve.java33%  (2/6)49%  (34/70)33%  (1478/4533)36%  (222/621)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class Resolve$10%   (0/1)0%   (0/1)0%   (0/110)0%   (0/1)
<static initializer> 0%   (0/1)0%   (0/110)0%   (0/1)
     
class Resolve$AccessError0%   (0/1)0%   (0/3)0%   (0/187)0%   (0/18)
Resolve$AccessError (Resolve, Env, Type, Symbol): void 0%   (0/1)0%   (0/40)0%   (0/7)
Resolve$AccessError (Resolve, Symbol): void 0%   (0/1)0%   (0/7)0%   (0/2)
report (Log, JCDiagnostic$DiagnosticPosition, Type, Name, List, List): void 0%   (0/1)0%   (0/140)0%   (0/9)
     
class Resolve$AmbiguityError0%   (0/1)0%   (0/2)0%   (0/105)0%   (0/14)
Resolve$AmbiguityError (Resolve, Symbol, Symbol): void 0%   (0/1)0%   (0/16)0%   (0/5)
report (Log, JCDiagnostic$DiagnosticPosition, Type, Name, List, List): void 0%   (0/1)0%   (0/89)0%   (0/9)
     
class Resolve$StaticError0%   (0/1)0%   (0/2)0%   (0/50)0%   (0/6)
Resolve$StaticError (Resolve, Symbol): void 0%   (0/1)0%   (0/10)0%   (0/3)
report (Log, JCDiagnostic$DiagnosticPosition, Type, Name, List, List): void 0%   (0/1)0%   (0/40)0%   (0/3)
     
class Resolve100% (1/1)54%  (29/54)33%  (1246/3769)35%  (190.7/541)
access$000 (Resolve): boolean 0%   (0/1)0%   (0/3)0%   (0/1)
checkNonAbstract (JCDiagnostic$DiagnosticPosition, Symbol): void 0%   (0/1)0%   (0/29)0%   (0/3)
findFun (Env, Name, List, List, boolean, boolean): Symbol 0%   (0/1)0%   (0/232)0%   (0/40)
findIdentInPackage (Env, Symbol$TypeSymbol, Name, int): Symbol 0%   (0/1)0%   (0/54)0%   (0/12)
isInitializer (Env): boolean 0%   (0/1)0%   (0/40)0%   (0/2)
isInnerSubClass (Symbol$ClassSymbol, Symbol): boolean 0%   (0/1)0%   (0/19)0%   (0/3)
isProtectedAccessible (Symbol, Symbol$ClassSymbol, Type): boolean 0%   (0/1)0%   (0/45)0%   (0/3)
kindName (Symbol): JCDiagnostic 0%   (0/1)0%   (0/50)0%   (0/9)
kindName (int): JCDiagnostic 0%   (0/1)0%   (0/37)0%   (0/7)
kindNames (int): JCDiagnostic 0%   (0/1)0%   (0/58)0%   (0/8)
logAccessError (Env, JCTree, Type): void 0%   (0/1)0%   (0/22)0%   (0/3)
mostSpecific (Symbol, Symbol, Env, Type, boolean, boolean): Symbol 0%   (0/1)0%   (0/436)0%   (0/51)
printscopes (Env): void 0%   (0/1)0%   (0/17)0%   (0/5)
printscopes (Scope): void 0%   (0/1)0%   (0/54)0%   (0/10)
printscopes (Type): void 0%   (0/1)0%   (0/16)0%   (0/4)
resolveBinaryOperator (JCDiagnostic$DiagnosticPosition, int, Env, Type, Type)... 0%   (0/1)0%   (0/9)0%   (0/1)
resolveImplicitThis (JCDiagnostic$DiagnosticPosition, Env, Type): Type 0%   (0/1)0%   (0/50)0%   (0/4)
resolveInternalConstructor (JCDiagnostic$DiagnosticPosition, Env, Type, List,... 0%   (0/1)0%   (0/27)0%   (0/3)
resolveInternalField (JCDiagnostic$DiagnosticPosition, Env, Type, Name): Symb... 0%   (0/1)0%   (0/27)0%   (0/3)
resolveInternalMethod (JCDiagnostic$DiagnosticPosition, Env, Type, Name, List... 0%   (0/1)0%   (0/28)0%   (0/3)
resolveMethod (JCDiagnostic$DiagnosticPosition, Env, Name, List, List): Symbol 0%   (0/1)0%   (0/67)0%   (0/8)
resolveOperator (JCDiagnostic$DiagnosticPosition, int, Env, List): Symbol 0%   (0/1)0%   (0/53)0%   (0/5)
resolveSelf (JCDiagnostic$DiagnosticPosition, Env, Symbol$TypeSymbol, Name): ... 0%   (0/1)0%   (0/76)0%   (0/13)
resolveSelfContaining (JCDiagnostic$DiagnosticPosition, Env, Symbol): Symbol 0%   (0/1)0%   (0/93)0%   (0/15)
resolveUnaryOperator (JCDiagnostic$DiagnosticPosition, int, Env, Type): Symbol 0%   (0/1)0%   (0/8)0%   (0/1)
findVar (Env, Name): Symbol 100% (1/1)23%  (61/267)22%  (9.7/45)
isAccessible (Env, Symbol$TypeSymbol): boolean 100% (1/1)25%  (18/73)46%  (2.3/5)
isAccessible (Env, Type, Symbol): boolean 100% (1/1)38%  (54/142)67%  (4/6)
rawInstantiate (Env, Type, Symbol, List, List, boolean, boolean, Warner): Type 100% (1/1)40%  (76/191)37%  (12.1/33)
findMemberType (Env, Type, Name, Symbol$TypeSymbol): Symbol 100% (1/1)41%  (51/123)52%  (9.9/19)
resolveConstructor (JCDiagnostic$DiagnosticPosition, Env, Type, List, List, b... 100% (1/1)47%  (22/47)62%  (2.5/4)
findField (Env, Type, Name, Symbol$TypeSymbol): Symbol 100% (1/1)47%  (62/131)50%  (9.6/19)
selectBest (Env, Type, List, List, Symbol, Symbol, boolean, boolean, boolean)... 100% (1/1)50%  (54/107)49%  (8.4/17)
findMethod (Env, Type, Name, List, List, Type, boolean, Symbol, boolean, bool... 100% (1/1)52%  (67/129)55%  (11/20)
loadClass (Env, Name): Symbol 100% (1/1)52%  (13/25)29%  (1.7/6)
isAccessible (Env, Type): boolean 100% (1/1)56%  (10/18)55%  (0.6/1)
findType (Env, Name): Symbol 100% (1/1)61%  (127/208)67%  (20.2/30)
findIdentInType (Env, Type, Name, int): Symbol 100% (1/1)62%  (33/53)70%  (7/10)
absentKindName (int): JCDiagnostic 100% (1/1)63%  (17/27)80%  (4/5)
argumentsAcceptable (List, List, boolean, boolean, Warner): boolean 100% (1/1)64%  (55/86)57%  (9.1/16)
typeKindName (Type): JCDiagnostic 100% (1/1)67%  (41/61)56%  (5/9)
findGlobalType (Env, Scope, Name): Symbol 100% (1/1)71%  (34/48)83%  (6.6/8)
findIdent (Env, Name, int): Symbol 100% (1/1)75%  (42/56)83%  (9.2/11)
instantiate (Env, Type, Symbol, List, List, boolean, boolean, Warner): Type 100% (1/1)79%  (11/14)33%  (1/3)
access (Symbol, JCDiagnostic$DiagnosticPosition, Type, Name, boolean, List, L... 100% (1/1)84%  (54/64)92%  (7.3/8)
isStatic (Env): boolean 100% (1/1)86%  (12/14)85%  (0.8/1)
<static initializer> 100% (1/1)92%  (11/12)96%  (1.9/2)
Resolve (Context): void 100% (1/1)98%  (120/122)100% (22/22)
access (Symbol, JCDiagnostic$DiagnosticPosition, Type, Name, boolean): Symbol 100% (1/1)100% (16/16)100% (3/3)
findMethod (Env, Type, Name, List, List, boolean, boolean, boolean): Symbol 100% (1/1)100% (17/17)100% (1/1)
instance (Context): Resolve 100% (1/1)100% (14/14)100% (4/4)
resolveConstructor (JCDiagnostic$DiagnosticPosition, Env, Type, List, List): ... 100% (1/1)100% (69/69)100% (8/8)
resolveIdent (JCDiagnostic$DiagnosticPosition, Env, Name, int): Symbol 100% (1/1)100% (15/15)100% (1/1)
resolveQualifiedMethod (JCDiagnostic$DiagnosticPosition, Env, Type, Name, Lis... 100% (1/1)100% (70/70)100% (8/8)
     
class Resolve$ResolveError100% (1/1)62%  (5/8)74%  (232/312)75%  (31.3/42)
accept (ElementVisitor, Object): Object 0%   (0/1)0%   (0/4)0%   (0/1)
setWrongSym (Symbol, JCDiagnostic): Resolve$ResolveError 0%   (0/1)0%   (0/8)0%   (0/3)
toString (): String 0%   (0/1)0%   (0/18)0%   (0/1)
exists (): boolean 100% (1/1)71%  (5/7)67%  (2/3)
report (Log, JCDiagnostic$DiagnosticPosition, Type, Name, List, List): void 100% (1/1)80%  (180/226)80%  (18.5/23)
isOperator (Name): boolean 100% (1/1)92%  (22/24)93%  (2.8/3)
Resolve$ResolveError (Resolve, int, Symbol, String): void 100% (1/1)100% (17/17)100% (5/5)
setWrongSym (Symbol): Resolve$ResolveError 100% (1/1)100% (8/8)100% (3/3)

1/*
2 * Copyright 1999-2006 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25 
26package com.sun.tools.javac.comp;
27 
28import com.sun.tools.javac.util.*;
29import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
30import com.sun.tools.javac.code.*;
31import com.sun.tools.javac.jvm.*;
32import com.sun.tools.javac.tree.*;
33 
34import com.sun.tools.javac.code.Type.*;
35import com.sun.tools.javac.code.Symbol.*;
36import com.sun.tools.javac.tree.JCTree.*;
37 
38import static com.sun.tools.javac.code.Flags.*;
39import static com.sun.tools.javac.code.Kinds.*;
40import static com.sun.tools.javac.code.TypeTags.*;
41import javax.lang.model.element.ElementVisitor;
42 
43/** Helper class for name resolution, used mostly by the attribution phase.
44 *
45 *  <p><b>This is NOT part of any API supported by Sun Microsystems.  If
46 *  you write code that depends on this, you do so at your own risk.
47 *  This code and its internal interfaces are subject to change or
48 *  deletion without notice.</b>
49 */
50public class Resolve {
51    protected static final Context.Key<Resolve> resolveKey =
52        new Context.Key<Resolve>();
53 
54    Name.Table names;
55    Log log;
56    Symtab syms;
57    Check chk;
58    Infer infer;
59    ClassReader reader;
60    TreeInfo treeinfo;
61    Types types;
62    public final boolean boxingEnabled; // = source.allowBoxing();
63    public final boolean varargsEnabled; // = source.allowVarargs();
64    private final boolean debugResolve;
65 
66    public static Resolve instance(Context context) {
67        Resolve instance = context.get(resolveKey);
68        if (instance == null)
69            instance = new Resolve(context);
70        return instance;
71    }
72 
73    protected Resolve(Context context) {
74        context.put(resolveKey, this);
75        syms = Symtab.instance(context);
76 
77        varNotFound = new
78            ResolveError(ABSENT_VAR, syms.errSymbol, "variable not found");
79        wrongMethod = new
80            ResolveError(WRONG_MTH, syms.errSymbol, "method not found");
81        wrongMethods = new
82            ResolveError(WRONG_MTHS, syms.errSymbol, "wrong methods");
83        methodNotFound = new
84            ResolveError(ABSENT_MTH, syms.errSymbol, "method not found");
85        typeNotFound = new
86            ResolveError(ABSENT_TYP, syms.errSymbol, "type not found");
87 
88        names = Name.Table.instance(context);
89        log = Log.instance(context);
90        chk = Check.instance(context);
91        infer = Infer.instance(context);
92        reader = ClassReader.instance(context);
93        treeinfo = TreeInfo.instance(context);
94        types = Types.instance(context);
95        Source source = Source.instance(context);
96        boxingEnabled = source.allowBoxing();
97        varargsEnabled = source.allowVarargs();
98        Options options = Options.instance(context);
99        debugResolve = options.get("debugresolve") != null;
100    }
101 
102    /** error symbols, which are returned when resolution fails
103     */
104    final ResolveError varNotFound;
105    final ResolveError wrongMethod;
106    final ResolveError wrongMethods;
107    final ResolveError methodNotFound;
108    final ResolveError typeNotFound;
109 
110/* ************************************************************************
111 * Identifier resolution
112 *************************************************************************/
113 
114    /** An environment is "static" if its static level is greater than
115     *  the one of its outer environment
116     */
117    static boolean isStatic(Env<AttrContext> env) {
118        return env.info.staticLevel > env.outer.info.staticLevel;
119    }
120 
121    /** An environment is an "initializer" if it is a constructor or
122     *  an instance initializer.
123     */
124    static boolean isInitializer(Env<AttrContext> env) {
125        Symbol owner = env.info.scope.owner;
126        return owner.isConstructor() ||
127            owner.owner.kind == TYP &&
128            (owner.kind == VAR ||
129             owner.kind == MTH && (owner.flags() & BLOCK) != 0) &&
130            (owner.flags() & STATIC) == 0;
131    }
132 
133    /** Is class accessible in given evironment?
134     *  @param env    The current environment.
135     *  @param c      The class whose accessibility is checked.
136     */
137    public boolean isAccessible(Env<AttrContext> env, TypeSymbol c) {
138        switch ((short)(c.flags() & AccessFlags)) {
139        case PRIVATE:
140            return
141                env.enclClass.sym.outermostClass() ==
142                c.owner.outermostClass();
143        case 0:
144            return
145                env.toplevel.packge == c.owner // fast special case
146                ||
147                env.toplevel.packge == c.packge()
148                ||
149                // Hack: this case is added since synthesized default constructors
150                // of anonymous classes should be allowed to access
151                // classes which would be inaccessible otherwise.
152                env.enclMethod != null &&
153                (env.enclMethod.mods.flags & ANONCONSTR) != 0;
154        default: // error recovery
155        case PUBLIC:
156            return true;
157        case PROTECTED:
158            return
159                env.toplevel.packge == c.owner // fast special case
160                ||
161                env.toplevel.packge == c.packge()
162                ||
163                isInnerSubClass(env.enclClass.sym, c.owner);
164        }
165    }
166    //where
167        /** Is given class a subclass of given base class, or an inner class
168         *  of a subclass?
169         *  Return null if no such class exists.
170         *  @param c     The class which is the subclass or is contained in it.
171         *  @param base  The base class
172         */
173        private boolean isInnerSubClass(ClassSymbol c, Symbol base) {
174            while (c != null && !c.isSubClass(base, types)) {
175                c = c.owner.enclClass();
176            }
177            return c != null;
178        }
179 
180    boolean isAccessible(Env<AttrContext> env, Type t) {
181        return (t.tag == ARRAY)
182            ? isAccessible(env, types.elemtype(t))
183            : isAccessible(env, t.tsym);
184    }
185 
186    /** Is symbol accessible as a member of given type in given evironment?
187     *  @param env    The current environment.
188     *  @param site   The type of which the tested symbol is regarded
189     *                as a member.
190     *  @param sym    The symbol.
191     */
192    public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym) {
193        if (sym.name == names.init && sym.owner != site.tsym) return false;
194        ClassSymbol sub;
195        switch ((short)(sym.flags() & AccessFlags)) {
196        case PRIVATE:
197            return
198                (env.enclClass.sym == sym.owner // fast special case
199                 ||
200                 env.enclClass.sym.outermostClass() ==
201                 sym.owner.outermostClass())
202                &&
203                sym.isInheritedIn(site.tsym, types);
204        case 0:
205            return
206                (env.toplevel.packge == sym.owner.owner // fast special case
207                 ||
208                 env.toplevel.packge == sym.packge())
209                &&
210                isAccessible(env, site)
211                &&
212                sym.isInheritedIn(site.tsym, types);
213        case PROTECTED:
214            return
215                (env.toplevel.packge == sym.owner.owner // fast special case
216                 ||
217                 env.toplevel.packge == sym.packge()
218                 ||
219                 isProtectedAccessible(sym, env.enclClass.sym, site)
220                 ||
221                 // OK to select instance method or field from 'super' or type name
222                 // (but type names should be disallowed elsewhere!)
223                 env.info.selectSuper && (sym.flags() & STATIC) == 0 && sym.kind != TYP)
224                &&
225                isAccessible(env, site)
226                &&
227                // `sym' is accessible only if not overridden by
228                // another symbol which is a member of `site'
229                // (because, if it is overridden, `sym' is not strictly
230                // speaking a member of `site'.)
231                (sym.kind != MTH || sym.isConstructor() ||
232                 ((MethodSymbol)sym).implementation(site.tsym, types, true) == sym);
233        default: // this case includes erroneous combinations as well
234            return isAccessible(env, site);
235        }
236    }
237    //where
238        /** Is given protected symbol accessible if it is selected from given site
239         *  and the selection takes place in given class?
240         *  @param sym     The symbol with protected access
241         *  @param c       The class where the access takes place
242         *  @site          The type of the qualifier
243         */
244        private
245        boolean isProtectedAccessible(Symbol sym, ClassSymbol c, Type site) {
246            while (c != null &&
247                   !(c.isSubClass(sym.owner, types) &&
248                     (c.flags() & INTERFACE) == 0 &&
249                     // In JLS 2e 6.6.2.1, the subclass restriction applies
250                     // only to instance fields and methods -- types are excluded
251                     // regardless of whether they are declared 'static' or not.
252                     ((sym.flags() & STATIC) != 0 || sym.kind == TYP || site.tsym.isSubClass(c, types))))
253                c = c.owner.enclClass();
254            return c != null;
255        }
256 
257    /** Try to instantiate the type of a method so that it fits
258     *  given type arguments and argument types. If succesful, return
259     *  the method's instantiated type, else return null.
260     *  The instantiation will take into account an additional leading
261     *  formal parameter if the method is an instance method seen as a member
262     *  of un underdetermined site In this case, we treat site as an additional
263     *  parameter and the parameters of the class containing the method as
264     *  additional type variables that get instantiated.
265     *
266     *  @param env         The current environment
267     *  @param site        The type of which the method is a member.
268     *  @param m           The method symbol.
269     *  @param argtypes    The invocation's given value arguments.
270     *  @param typeargtypes    The invocation's given type arguments.
271     *  @param allowBoxing Allow boxing conversions of arguments.
272     *  @param useVarargs Box trailing arguments into an array for varargs.
273     */
274    Type rawInstantiate(Env<AttrContext> env,
275                        Type site,
276                        Symbol m,
277                        List<Type> argtypes,
278                        List<Type> typeargtypes,
279                        boolean allowBoxing,
280                        boolean useVarargs,
281                        Warner warn)
282        throws Infer.NoInstanceException {
283        if (useVarargs && (m.flags() & VARARGS) == 0) return null;
284        Type mt = types.memberType(site, m);
285 
286        // tvars is the list of formal type variables for which type arguments
287        // need to inferred.
288        List<Type> tvars = env.info.tvars;
289        if (typeargtypes == null) typeargtypes = List.nil();
290        if (mt.tag != FORALL && typeargtypes.nonEmpty()) {
291            // This is not a polymorphic method, but typeargs are supplied
292            // which is fine, see JLS3 15.12.2.1
293        } else if (mt.tag == FORALL && typeargtypes.nonEmpty()) {
294            ForAll pmt = (ForAll) mt;
295            if (typeargtypes.length() != pmt.tvars.length())
296                return null;
297            // Check type arguments are within bounds
298            List<Type> formals = pmt.tvars;
299            List<Type> actuals = typeargtypes;
300            while (formals.nonEmpty() && actuals.nonEmpty()) {
301                List<Type> bounds = types.subst(types.getBounds((TypeVar)formals.head),
302                                                pmt.tvars, typeargtypes);
303                for (; bounds.nonEmpty(); bounds = bounds.tail)
304                    if (!types.isSubtypeUnchecked(actuals.head, bounds.head, warn))
305                        return null;
306                formals = formals.tail;
307                actuals = actuals.tail;
308            }
309            mt = types.subst(pmt.qtype, pmt.tvars, typeargtypes);
310        } else if (mt.tag == FORALL) {
311            ForAll pmt = (ForAll) mt;
312            List<Type> tvars1 = types.newInstances(pmt.tvars);
313            tvars = tvars.appendList(tvars1);
314            mt = types.subst(pmt.qtype, pmt.tvars, tvars1);
315        }
316 
317        // find out whether we need to go the slow route via infer
318        boolean instNeeded = tvars.tail != null/*inlined: tvars.nonEmpty()*/;
319        for (List<Type> l = argtypes;
320             l.tail != null/*inlined: l.nonEmpty()*/ && !instNeeded;
321             l = l.tail) {
322            if (l.head.tag == FORALL) instNeeded = true;
323        }
324 
325        if (instNeeded)
326            return
327            infer.instantiateMethod(tvars,
328                                    (MethodType)mt,
329                                    argtypes,
330                                    allowBoxing,
331                                    useVarargs,
332                                    warn);
333        return
334            argumentsAcceptable(argtypes, mt.getParameterTypes(),
335                                allowBoxing, useVarargs, warn)
336            ? mt
337            : null;
338    }
339 
340    /** Same but returns null instead throwing a NoInstanceException
341     */
342    Type instantiate(Env<AttrContext> env,
343                     Type site,
344                     Symbol m,
345                     List<Type> argtypes,
346                     List<Type> typeargtypes,
347                     boolean allowBoxing,
348                     boolean useVarargs,
349                     Warner warn) {
350        try {
351            return rawInstantiate(env, site, m, argtypes, typeargtypes,
352                                  allowBoxing, useVarargs, warn);
353        } catch (Infer.NoInstanceException ex) {
354            return null;
355        }
356    }
357 
358    /** Check if a parameter list accepts a list of args.
359     */
360    boolean argumentsAcceptable(List<Type> argtypes,
361                                List<Type> formals,
362                                boolean allowBoxing,
363                                boolean useVarargs,
364                                Warner warn) {
365        Type varargsFormal = useVarargs ? formals.last() : null;
366        while (argtypes.nonEmpty() && formals.head != varargsFormal) {
367            boolean works = allowBoxing
368                ? types.isConvertible(argtypes.head, formals.head, warn)
369                : types.isSubtypeUnchecked(argtypes.head, formals.head, warn);
370            if (!works) return false;
371            argtypes = argtypes.tail;
372            formals = formals.tail;
373        }
374        if (formals.head != varargsFormal) return false; // not enough args
375        if (!useVarargs)
376            return argtypes.isEmpty();
377        Type elt = types.elemtype(varargsFormal);
378        while (argtypes.nonEmpty()) {
379            if (!types.isConvertible(argtypes.head, elt, warn))
380                return false;
381            argtypes = argtypes.tail;
382        }
383        return true;
384    }
385 
386/* ***************************************************************************
387 *  Symbol lookup
388 *  the following naming conventions for arguments are used
389 *
390 *       env      is the environment where the symbol was mentioned
391 *       site     is the type of which the symbol is a member
392 *       name     is the symbol's name
393 *                if no arguments are given
394 *       argtypes are the value arguments, if we search for a method
395 *
396 *  If no symbol was found, a ResolveError detailing the problem is returned.
397 ****************************************************************************/
398 
399    /** Find field. Synthetic fields are always skipped.
400     *  @param env     The current environment.
401     *  @param site    The original type from where the selection takes place.
402     *  @param name    The name of the field.
403     *  @param c       The class to search for the field. This is always
404     *                 a superclass or implemented interface of site's class.
405     */
406    Symbol findField(Env<AttrContext> env,
407                     Type site,
408                     Name name,
409                     TypeSymbol c) {
410        Symbol bestSoFar = varNotFound;
411        Symbol sym;
412        Scope.Entry e = c.members().lookup(name);
413        while (e.scope != null) {
414            if (e.sym.kind == VAR && (e.sym.flags_field & SYNTHETIC) == 0) {
415                return isAccessible(env, site, e.sym)
416                    ? e.sym : new AccessError(env, site, e.sym);
417            }
418            e = e.next();
419        }
420        Type st = types.supertype(c.type);
421        if (st != null && st.tag == CLASS) {
422            sym = findField(env, site, name, st.tsym);
423            if (sym.kind < bestSoFar.kind) bestSoFar = sym;
424        }
425        for (List<Type> l = types.interfaces(c.type);
426             bestSoFar.kind != AMBIGUOUS && l.nonEmpty();
427             l = l.tail) {
428            sym = findField(env, site, name, l.head.tsym);
429            if (bestSoFar.kind < AMBIGUOUS && sym.kind < AMBIGUOUS &&
430                sym.owner != bestSoFar.owner)
431                bestSoFar = new AmbiguityError(bestSoFar, sym);
432            else if (sym.kind < bestSoFar.kind)
433                bestSoFar = sym;
434        }
435        return bestSoFar;
436    }
437 
438    /** Resolve a field identifier, throw a fatal error if not found.
439     *  @param pos       The position to use for error reporting.
440     *  @param env       The environment current at the method invocation.
441     *  @param site      The type of the qualifying expression, in which
442     *                   identifier is searched.
443     *  @param name      The identifier's name.
444     */
445    public VarSymbol resolveInternalField(DiagnosticPosition pos, Env<AttrContext> env,
446                                          Type site, Name name) {
447        Symbol sym = findField(env, site, name, site.tsym);
448        if (sym.kind == VAR) return (VarSymbol)sym;
449        else throw new FatalError(
450                 JCDiagnostic.fragment("fatal.err.cant.locate.field",
451                                name));
452    }
453 
454    /** Find unqualified variable or field with given name.
455     *  Synthetic fields always skipped.
456     *  @param env     The current environment.
457     *  @param name    The name of the variable or field.
458     */
459    Symbol findVar(Env<AttrContext> env, Name name) {
460        Symbol bestSoFar = varNotFound;
461        Symbol sym;
462        Env<AttrContext> env1 = env;
463        boolean staticOnly = false;
464        while (env1.outer != null) {
465            if (isStatic(env1)) staticOnly = true;
466            Scope.Entry e = env1.info.scope.lookup(name);
467            while (e.scope != null &&
468                   (e.sym.kind != VAR ||
469                    (e.sym.flags_field & SYNTHETIC) != 0))
470                e = e.next();
471            sym = (e.scope != null)
472                ? e.sym
473                : findField(
474                    env1, env1.enclClass.sym.type, name, env1.enclClass.sym);
475            if (sym.exists()) {
476                if (staticOnly &&
477                    sym.kind == VAR &&
478                    sym.owner.kind == TYP &&
479                    (sym.flags() & STATIC) == 0)
480                    return new StaticError(sym);
481                else
482                    return sym;
483            } else if (sym.kind < bestSoFar.kind) {
484                bestSoFar = sym;
485            }
486 
487            if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true;
488            env1 = env1.outer;
489        }
490 
491        sym = findField(env, syms.predefClass.type, name, syms.predefClass);
492        if (sym.exists())
493            return sym;
494        if (bestSoFar.exists())
495            return bestSoFar;
496 
497        Scope.Entry e = env.toplevel.namedImportScope.lookup(name);
498        for (; e.scope != null; e = e.next()) {
499            sym = e.sym;
500            Type origin = e.getOrigin().owner.type;
501            if (sym.kind == VAR) {
502                if (e.sym.owner.type != origin)
503                    sym = sym.clone(e.getOrigin().owner);
504                return isAccessible(env, origin, sym)
505                    ? sym : new AccessError(env, origin, sym);
506            }
507        }
508 
509        Symbol origin = null;
510        e = env.toplevel.starImportScope.lookup(name);
511        for (; e.scope != null; e = e.next()) {
512            sym = e.sym;
513            if (sym.kind != VAR)
514                continue;
515            // invariant: sym.kind == VAR
516            if (bestSoFar.kind < AMBIGUOUS && sym.owner != bestSoFar.owner)
517                return new AmbiguityError(bestSoFar, sym);
518            else if (bestSoFar.kind >= VAR) {
519                origin = e.getOrigin().owner;
520                bestSoFar = isAccessible(env, origin.type, sym)
521                    ? sym : new AccessError(env, origin.type, sym);
522            }
523        }
524        if (bestSoFar.kind == VAR && bestSoFar.owner.type != origin.type)
525            return bestSoFar.clone(origin);
526        else
527            return bestSoFar;
528    }
529 
530    Warner noteWarner = new Warner();
531 
532    /** Select the best method for a call site among two choices.
533     *  @param env              The current environment.
534     *  @param site             The original type from where the
535     *                          selection takes place.
536     *  @param argtypes         The invocation's value arguments,
537     *  @param typeargtypes     The invocation's type arguments,
538     *  @param sym              Proposed new best match.
539     *  @param bestSoFar        Previously found best match.
540     *  @param allowBoxing Allow boxing conversions of arguments.
541     *  @param useVarargs Box trailing arguments into an array for varargs.
542     */
543    Symbol selectBest(Env<AttrContext> env,
544                      Type site,
545                      List<Type> argtypes,
546                      List<Type> typeargtypes,
547                      Symbol sym,
548                      Symbol bestSoFar,
549                      boolean allowBoxing,
550                      boolean useVarargs,
551                      boolean operator) {
552        if (sym.kind == ERR) return bestSoFar;
553        if (!sym.isInheritedIn(site.tsym, types)) return bestSoFar;
554        assert sym.kind < AMBIGUOUS;
555        try {
556            if (rawInstantiate(env, site, sym, argtypes, typeargtypes,
557                               allowBoxing, useVarargs, Warner.noWarnings) == null) {
558                // inapplicable
559                switch (bestSoFar.kind) {
560                case ABSENT_MTH: return wrongMethod.setWrongSym(sym);
561                case WRONG_MTH: return wrongMethods;
562                default: return bestSoFar;
563                }
564            }
565        } catch (Infer.NoInstanceException ex) {
566            switch (bestSoFar.kind) {
567            case ABSENT_MTH:
568                return wrongMethod.setWrongSym(sym, ex.getDiagnostic());
569            case WRONG_MTH:
570                return wrongMethods;
571            default:
572                return bestSoFar;
573            }
574        }
575        if (!isAccessible(env, site, sym)) {
576            return (bestSoFar.kind == ABSENT_MTH)
577                ? new AccessError(env, site, sym)
578                : bestSoFar;
579        }
580        return (bestSoFar.kind > AMBIGUOUS)
581            ? sym
582            : mostSpecific(sym, bestSoFar, env, site,
583                           allowBoxing && operator, useVarargs);
584    }
585 
586    /* Return the most specific of the two methods for a call,
587     *  given that both are accessible and applicable.
588     *  @param m1               A new candidate for most specific.
589     *  @param m2               The previous most specific candidate.
590     *  @param env              The current environment.
591     *  @param site             The original type from where the selection
592     *                          takes place.
593     *  @param allowBoxing Allow boxing conversions of arguments.
594     *  @param useVarargs Box trailing arguments into an array for varargs.
595     */
596    Symbol mostSpecific(Symbol m1,
597                        Symbol m2,
598                        Env<AttrContext> env,
599                        Type site,
600                        boolean allowBoxing,
601                        boolean useVarargs) {
602        switch (m2.kind) {
603        case MTH:
604            if (m1 == m2) return m1;
605            Type mt1 = types.memberType(site, m1);
606            noteWarner.unchecked = false;
607            boolean m1SignatureMoreSpecific =
608                (instantiate(env, site, m2, types.lowerBoundArgtypes(mt1), null,
609                             allowBoxing, false, noteWarner) != null ||
610                 useVarargs && instantiate(env, site, m2, types.lowerBoundArgtypes(mt1), null,
611                                           allowBoxing, true, noteWarner) != null) &&
612                !noteWarner.unchecked;
613            Type mt2 = types.memberType(site, m2);
614            noteWarner.unchecked = false;
615            boolean m2SignatureMoreSpecific =
616                (instantiate(env, site, m1, types.lowerBoundArgtypes(mt2), null,
617                             allowBoxing, false, noteWarner) != null ||
618                 useVarargs && instantiate(env, site, m1, types.lowerBoundArgtypes(mt2), null,
619                                           allowBoxing, true, noteWarner) != null) &&
620                !noteWarner.unchecked;
621            if (m1SignatureMoreSpecific && m2SignatureMoreSpecific) {
622                if (!types.overrideEquivalent(mt1, mt2))
623                    return new AmbiguityError(m1, m2);
624                // same signature; select (a) the non-bridge method, or
625                // (b) the one that overrides the other, or (c) the concrete
626                // one, or (d) merge both abstract signatures
627                if ((m1.flags() & BRIDGE) != (m2.flags() & BRIDGE)) {
628                    return ((m1.flags() & BRIDGE) != 0) ? m2 : m1;
629                }
630                // if one overrides or hides the other, use it
631                TypeSymbol m1Owner = (TypeSymbol)m1.owner;
632                TypeSymbol m2Owner = (TypeSymbol)m2.owner;
633                if (types.asSuper(m1Owner.type, m2Owner) != null &&
634                    ((m1.owner.flags_field & INTERFACE) == 0 ||
635                     (m2.owner.flags_field & INTERFACE) != 0) &&
636                    m1.overrides(m2, m1Owner, types, false))
637                    return m1;
638                if (types.asSuper(m2Owner.type, m1Owner) != null &&
639                    ((m2.owner.flags_field & INTERFACE) == 0 ||
640                     (m1.owner.flags_field & INTERFACE) != 0) &&
641                    m2.overrides(m1, m2Owner, types, false))
642                    return m2;
643                boolean m1Abstract = (m1.flags() & ABSTRACT) != 0;
644                boolean m2Abstract = (m2.flags() & ABSTRACT) != 0;
645                if (m1Abstract && !m2Abstract) return m2;
646                if (m2Abstract && !m1Abstract) return m1;
647                // both abstract or both concrete
648                if (!m1Abstract && !m2Abstract)
649                    return new AmbiguityError(m1, m2);
650                // check for same erasure
651                if (!types.isSameType(m1.erasure(types), m2.erasure(types)))
652                    return new AmbiguityError(m1, m2);
653                // both abstract, neither overridden; merge throws clause and result type
654                Symbol result;
655                Type result2 = mt2.getReturnType();;
656                if (mt2.tag == FORALL)
657                    result2 = types.subst(result2, ((ForAll)mt2).tvars, ((ForAll)mt1).tvars);
658                if (types.isSubtype(mt1.getReturnType(), result2)) {
659                    result = m1;
660                } else if (types.isSubtype(result2, mt1.getReturnType())) {
661                    result = m2;
662                } else {
663                    // Theoretically, this can't happen, but it is possible
664                    // due to error recovery or mixing incompatible class files
665                    return new AmbiguityError(m1, m2);
666                }
667                result = result.clone(result.owner);
668                result.type = (Type)result.type.clone();
669                result.type.setThrown(chk.intersect(mt1.getThrownTypes(),
670                                                    mt2.getThrownTypes()));
671                return result;
672            }
673            if (m1SignatureMoreSpecific) return m1;
674            if (m2SignatureMoreSpecific) return m2;
675            return new AmbiguityError(m1, m2);
676        case AMBIGUOUS:
677            AmbiguityError e = (AmbiguityError)m2;
678            Symbol err1 = mostSpecific(m1, e.sym1, env, site, allowBoxing, useVarargs);
679            Symbol err2 = mostSpecific(m1, e.sym2, env, site, allowBoxing, useVarargs);
680            if (err1 == err2) return err1;
681            if (err1 == e.sym1 && err2 == e.sym2) return m2;
682            if (err1 instanceof AmbiguityError &&
683                err2 instanceof AmbiguityError &&
684                ((AmbiguityError)err1).sym1 == ((AmbiguityError)err2).sym1)
685                return new AmbiguityError(m1, m2);
686            else
687                return new AmbiguityError(err1, err2);
688        default:
689            throw new AssertionError();
690        }
691    }
692 
693    /** Find best qualified method matching given name, type and value
694     *  arguments.
695     *  @param env       The current environment.
696     *  @param site      The original type from where the selection
697     *                   takes place.
698     *  @param name      The method's name.
699     *  @param argtypes  The method's value arguments.
700     *  @param typeargtypes The method's type arguments
701     *  @param allowBoxing Allow boxing conversions of arguments.
702     *  @param useVarargs Box trailing arguments into an array for varargs.
703     */
704    Symbol findMethod(Env<AttrContext> env,
705                      Type site,
706                      Name name,
707                      List<Type> argtypes,
708                      List<Type> typeargtypes,
709                      boolean allowBoxing,
710                      boolean useVarargs,
711                      boolean operator) {
712        return findMethod(env,
713                          site,
714                          name,
715                          argtypes,
716                          typeargtypes,
717                          site.tsym.type,
718                          true,
719                          methodNotFound,
720                          allowBoxing,
721                          useVarargs,
722                          operator);
723    }
724    // where
725    private Symbol findMethod(Env<AttrContext> env,
726                              Type site,
727                              Name name,
728                              List<Type> argtypes,
729                              List<Type> typeargtypes,
730                              Type intype,
731                              boolean abstractok,
732                              Symbol bestSoFar,
733                              boolean allowBoxing,
734                              boolean useVarargs,
735                              boolean operator) {
736        for (Type ct = intype; ct.tag == CLASS; ct = types.supertype(ct)) {
737            ClassSymbol c = (ClassSymbol)ct.tsym;
738            if ((c.flags() & (ABSTRACT | INTERFACE)) == 0)
739                abstractok = false;
740            for (Scope.Entry e = c.members().lookup(name);
741                 e.scope != null;
742                 e = e.next()) {
743                //- System.out.println(" e " + e.sym);
744                if (e.sym.kind == MTH &&
745                    (e.sym.flags_field & SYNTHETIC) == 0) {
746                    bestSoFar = selectBest(env, site, argtypes, typeargtypes,
747                                           e.sym, bestSoFar,
748                                           allowBoxing,
749                                           useVarargs,
750                                           operator);
751                }
752            }
753            //- System.out.println(" - " + bestSoFar);
754            if (abstractok) {
755                Symbol concrete = methodNotFound;
756                if ((bestSoFar.flags() & ABSTRACT) == 0)
757                    concrete = bestSoFar;
758                for (List<Type> l = types.interfaces(c.type);
759                     l.nonEmpty();
760                     l = l.tail) {
761                    bestSoFar = findMethod(env, site, name, argtypes,
762                                           typeargtypes,
763                                           l.head, abstractok, bestSoFar,
764                                           allowBoxing, useVarargs, operator);
765                }
766                if (concrete != bestSoFar &&
767                    concrete.kind < ERR  && bestSoFar.kind < ERR &&
768                    types.isSubSignature(concrete.type, bestSoFar.type))
769                    bestSoFar = concrete;
770            }
771        }
772        return bestSoFar;
773    }
774 
775    /** Find unqualified method matching given name, type and value arguments.
776     *  @param env       The current environment.
777     *  @param name      The method's name.
778     *  @param argtypes  The method's value arguments.
779     *  @param typeargtypes  The method's type arguments.
780     *  @param allowBoxing Allow boxing conversions of arguments.
781     *  @param useVarargs Box trailing arguments into an array for varargs.
782     */
783    Symbol findFun(Env<AttrContext> env, Name name,
784                   List<Type> argtypes, List<Type> typeargtypes,
785                   boolean allowBoxing, boolean useVarargs) {
786        Symbol bestSoFar = methodNotFound;
787        Symbol sym;
788        Env<AttrContext> env1 = env;
789        boolean staticOnly = false;
790        while (env1.outer != null) {
791            if (isStatic(env1)) staticOnly = true;
792            sym = findMethod(
793                env1, env1.enclClass.sym.type, name, argtypes, typeargtypes,
794                allowBoxing, useVarargs, false);
795            if (sym.exists()) {
796                if (staticOnly &&
797                    sym.kind == MTH &&
798                    sym.owner.kind == TYP &&
799                    (sym.flags() & STATIC) == 0) return new StaticError(sym);
800                else return sym;
801            } else if (sym.kind < bestSoFar.kind) {
802                bestSoFar = sym;
803            }
804            if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true;
805            env1 = env1.outer;
806        }
807 
808        sym = findMethod(env, syms.predefClass.type, name, argtypes,
809                         typeargtypes, allowBoxing, useVarargs, false);
810        if (sym.exists())
811            return sym;
812 
813        Scope.Entry e = env.toplevel.namedImportScope.lookup(name);
814        for (; e.scope != null; e = e.next()) {
815            sym = e.sym;
816            Type origin = e.getOrigin().owner.type;
817            if (sym.kind == MTH) {
818                if (e.sym.owner.type != origin)
819                    sym = sym.clone(e.getOrigin().owner);
820                if (!isAccessible(env, origin, sym))
821                    sym = new AccessError(env, origin, sym);
822                bestSoFar = selectBest(env, origin,
823                                       argtypes, typeargtypes,
824                                       sym, bestSoFar,
825                                       allowBoxing, useVarargs, false);
826            }
827        }
828        if (bestSoFar.exists())
829            return bestSoFar;
830 
831        e = env.toplevel.starImportScope.lookup(name);
832        for (; e.scope != null; e = e.next()) {
833            sym = e.sym;
834            Type origin = e.getOrigin().owner.type;
835            if (sym.kind == MTH) {
836                if (e.sym.owner.type != origin)
837                    sym = sym.clone(e.getOrigin().owner);
838                if (!isAccessible(env, origin, sym))
839                    sym = new AccessError(env, origin, sym);
840                bestSoFar = selectBest(env, origin,
841                                       argtypes, typeargtypes,
842                                       sym, bestSoFar,
843                                       allowBoxing, useVarargs, false);
844            }
845        }
846        return bestSoFar;
847    }
848 
849    /** Load toplevel or member class with given fully qualified name and
850     *  verify that it is accessible.
851     *  @param env       The current environment.
852     *  @param name      The fully qualified name of the class to be loaded.
853     */
854    Symbol loadClass(Env<AttrContext> env, Name name) {
855        try {
856            ClassSymbol c = reader.loadClass(name);
857            return isAccessible(env, c) ? c : new AccessError(c);
858        } catch (ClassReader.BadClassFile err) {
859            throw err;
860        } catch (CompletionFailure ex) {
861            return typeNotFound;
862        }
863    }
864 
865    /** Find qualified member type.
866     *  @param env       The current environment.
867     *  @param site      The original type from where the selection takes
868     *                   place.
869     *  @param name      The type's name.
870     *  @param c         The class to search for the member type. This is
871     *                   always a superclass or implemented interface of
872     *                   site's class.
873     */
874    Symbol findMemberType(Env<AttrContext> env,
875                          Type site,
876                          Name name,
877                          TypeSymbol c) {
878        Symbol bestSoFar = typeNotFound;
879        Symbol sym;
880        Scope.Entry e = c.members().lookup(name);
881        while (e.scope != null) {
882            if (e.sym.kind == TYP) {
883                return isAccessible(env, site, e.sym)
884                    ? e.sym
885                    : new AccessError(env, site, e.sym);
886            }
887            e = e.next();
888        }
889        Type st = types.supertype(c.type);
890        if (st != null && st.tag == CLASS) {
891            sym = findMemberType(env, site, name, st.tsym);
892            if (sym.kind < bestSoFar.kind) bestSoFar = sym;
893        }
894        for (List<Type> l = types.interfaces(c.type);
895             bestSoFar.kind != AMBIGUOUS && l.nonEmpty();
896             l = l.tail) {
897            sym = findMemberType(env, site, name, l.head.tsym);
898            if (bestSoFar.kind < AMBIGUOUS && sym.kind < AMBIGUOUS &&
899                sym.owner != bestSoFar.owner)
900                bestSoFar = new AmbiguityError(bestSoFar, sym);
901            else if (sym.kind < bestSoFar.kind)
902                bestSoFar = sym;
903        }
904        return bestSoFar;
905    }
906 
907    /** Find a global type in given scope and load corresponding class.
908     *  @param env       The current environment.
909     *  @param scope     The scope in which to look for the type.
910     *  @param name      The type's name.
911     */
912    Symbol findGlobalType(Env<AttrContext> env, Scope scope, Name name) {
913        Symbol bestSoFar = typeNotFound;
914        for (Scope.Entry e = scope.lookup(name); e.scope != null; e = e.next()) {
915            Symbol sym = loadClass(env, e.sym.flatName());
916            if (bestSoFar.kind == TYP && sym.kind == TYP &&
917                bestSoFar != sym)
918                return new AmbiguityError(bestSoFar, sym);
919            else if (sym.kind < bestSoFar.kind)
920                bestSoFar = sym;
921        }
922        return bestSoFar;
923    }
924 
925    /** Find an unqualified type symbol.
926     *  @param env       The current environment.
927     *  @param name      The type's name.
928     */
929    Symbol findType(Env<AttrContext> env, Name name) {
930        Symbol bestSoFar = typeNotFound;
931        Symbol sym;
932        boolean staticOnly = false;
933        for (Env<AttrContext> env1 = env; env1.outer != null; env1 = env1.outer) {
934            if (isStatic(env1)) staticOnly = true;
935            for (Scope.Entry e = env1.info.scope.lookup(name);
936                 e.scope != null;
937                 e = e.next()) {
938                if (e.sym.kind == TYP) {
939                    if (staticOnly &&
940                        e.sym.type.tag == TYPEVAR &&
941                        e.sym.owner.kind == TYP) return new StaticError(e.sym);
942                    return e.sym;
943                }
944            }
945 
946            sym = findMemberType(env1, env1.enclClass.sym.type, name,
947                                 env1.enclClass.sym);
948            if (staticOnly && sym.kind == TYP &&
949                sym.type.tag == CLASS &&
950                sym.type.getEnclosingType().tag == CLASS &&
951                env1.enclClass.sym.type.isParameterized() &&
952                sym.type.getEnclosingType().isParameterized())
953                return new StaticError(sym);
954            else if (sym.exists()) return sym;
955            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
956 
957            JCClassDecl encl = env1.baseClause ? (JCClassDecl)env1.tree : env1.enclClass;
958            if ((encl.sym.flags() & STATIC) != 0)
959                staticOnly = true;
960        }
961 
962        if (env.tree.getTag() != JCTree.IMPORT) {
963            sym = findGlobalType(env, env.toplevel.namedImportScope, name);
964            if (sym.exists()) return sym;
965            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
966 
967            sym = findGlobalType(env, env.toplevel.packge.members(), name);
968            if (sym.exists()) return sym;
969            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
970 
971            sym = findGlobalType(env, env.toplevel.starImportScope, name);
972            if (sym.exists()) return sym;
973            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
974        }
975 
976        return bestSoFar;
977    }
978 
979    /** Find an unqualified identifier which matches a specified kind set.
980     *  @param env       The current environment.
981     *  @param name      The indentifier's name.
982     *  @param kind      Indicates the possible symbol kinds
983     *                   (a subset of VAL, TYP, PCK).
984     */
985    Symbol findIdent(Env<AttrContext> env, Name name, int kind) {
986        Symbol bestSoFar = typeNotFound;
987        Symbol sym;
988 
989        if ((kind & VAR) != 0) {
990            sym = findVar(env, name);
991            if (sym.exists()) return sym;
992            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
993        }
994 
995        if ((kind & TYP) != 0) {
996            sym = findType(env, name);
997            if (sym.exists()) return sym;
998            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
999        }
1000 
1001        if ((kind & PCK) != 0) return reader.enterPackage(name);
1002        else return bestSoFar;
1003    }
1004 
1005    /** Find an identifier in a package which matches a specified kind set.
1006     *  @param env       The current environment.
1007     *  @param name      The identifier's name.
1008     *  @param kind      Indicates the possible symbol kinds
1009     *                   (a nonempty subset of TYP, PCK).
1010     */
1011    Symbol findIdentInPackage(Env<AttrContext> env, TypeSymbol pck,
1012                              Name name, int kind) {
1013        Name fullname = TypeSymbol.formFullName(name, pck);
1014        Symbol bestSoFar = typeNotFound;
1015        PackageSymbol pack = null;
1016        if ((kind & PCK) != 0) {
1017            pack = reader.enterPackage(fullname);
1018            if (pack.exists()) return pack;
1019        }
1020        if ((kind & TYP) != 0) {
1021            Symbol sym = loadClass(env, fullname);
1022            if (sym.exists()) {
1023                // don't allow programs to use flatnames
1024                if (name == sym.name) return sym;
1025            }
1026            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
1027        }
1028        return (pack != null) ? pack : bestSoFar;
1029    }
1030 
1031    /** Find an identifier among the members of a given type `site'.
1032     *  @param env       The current environment.
1033     *  @param site      The type containing the symbol to be found.
1034     *  @param name      The identifier's name.
1035     *  @param kind      Indicates the possible symbol kinds
1036     *                   (a subset of VAL, TYP).
1037     */
1038    Symbol findIdentInType(Env<AttrContext> env, Type site,
1039                           Name name, int kind) {
1040        Symbol bestSoFar = typeNotFound;
1041        Symbol sym;
1042        if ((kind & VAR) != 0) {
1043            sym = findField(env, site, name, site.tsym);
1044            if (sym.exists()) return sym;
1045            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
1046        }
1047 
1048        if ((kind & TYP) != 0) {
1049            sym = findMemberType(env, site, name, site.tsym);
1050            if (sym.exists()) return sym;
1051            else if (sym.kind < bestSoFar.kind) bestSoFar = sym;
1052        }
1053        return bestSoFar;
1054    }
1055 
1056/* ***************************************************************************
1057 *  Access checking
1058 *  The following methods convert ResolveErrors to ErrorSymbols, issuing
1059 *  an error message in the process
1060 ****************************************************************************/
1061 
1062    /** If `sym' is a bad symbol: report error and return errSymbol
1063     *  else pass through unchanged,
1064     *  additional arguments duplicate what has been used in trying to find the
1065     *  symbol (--> flyweight pattern). This improves performance since we
1066     *  expect misses to happen frequently.
1067     *
1068     *  @param sym       The symbol that was found, or a ResolveError.
1069     *  @param pos       The position to use for error reporting.
1070     *  @param site      The original type from where the selection took place.
1071     *  @param name      The symbol's name.
1072     *  @param argtypes  The invocation's value arguments,
1073     *                   if we looked for a method.
1074     *  @param typeargtypes  The invocation's type arguments,
1075     *                   if we looked for a method.
1076     */
1077    Symbol access(Symbol sym,
1078                  DiagnosticPosition pos,
1079                  Type site,
1080                  Name name,
1081                  boolean qualified,
1082                  List<Type> argtypes,
1083                  List<Type> typeargtypes) {
1084        if (sym.kind >= AMBIGUOUS) {
1085//          printscopes(site.tsym.members());//DEBUG
1086            if (!site.isErroneous() &&
1087                !Type.isErroneous(argtypes) &&
1088                (typeargtypes==null || !Type.isErroneous(typeargtypes)))
1089                ((ResolveError)sym).report(log, pos, site, name, argtypes, typeargtypes);
1090            do {
1091                sym = ((ResolveError)sym).sym;
1092            } while (sym.kind >= AMBIGUOUS);
1093            if (sym == syms.errSymbol // preserve the symbol name through errors
1094                || ((sym.kind & ERRONEOUS) == 0 // make sure an error symbol is returned
1095                    && (sym.kind & TYP) != 0))
1096                sym = new ErrorType(name, qualified?site.tsym:syms.noSymbol).tsym;
1097        }
1098        return sym;
1099    }
1100 
1101    /** Same as above, but without type arguments and arguments.
1102     */
1103    Symbol access(Symbol sym,
1104                  DiagnosticPosition pos,
1105                  Type site,
1106                  Name name,
1107                  boolean qualified) {
1108        if (sym.kind >= AMBIGUOUS)
1109            return access(sym, pos, site, name, qualified, List.<Type>nil(), null);
1110        else
1111            return sym;
1112    }
1113 
1114    /** Check that sym is not an abstract method.
1115     */
1116    void checkNonAbstract(DiagnosticPosition pos, Symbol sym) {
1117        if ((sym.flags() & ABSTRACT) != 0)
1118            log.error(pos, "abstract.cant.be.accessed.directly",
1119                      kindName(sym), sym, sym.location());
1120    }
1121 
1122/* ***************************************************************************
1123 *  Debugging
1124 ****************************************************************************/
1125 
1126    /** print all scopes starting with scope s and proceeding outwards.
1127     *  used for debugging.
1128     */
1129    public void printscopes(Scope s) {
1130        while (s != null) {
1131            if (s.owner != null)
1132                System.err.print(s.owner + ": ");
1133            for (Scope.Entry e = s.elems; e != null; e = e.sibling) {
1134                if ((e.sym.flags() & ABSTRACT) != 0)
1135                    System.err.print("abstract ");
1136                System.err.print(e.sym + " ");
1137            }
1138            System.err.println();
1139            s = s.next;
1140        }
1141    }
1142 
1143    void printscopes(Env<AttrContext> env) {
1144        while (env.outer != null) {
1145            System.err.println("------------------------------");
1146            printscopes(env.info.scope);
1147            env = env.outer;
1148        }
1149    }
1150 
1151    public void printscopes(Type t) {
1152        while (t.tag == CLASS) {
1153            printscopes(t.tsym.members());
1154            t = types.supertype(t);
1155        }
1156    }
1157 
1158/* ***************************************************************************
1159 *  Name resolution
1160 *  Naming conventions are as for symbol lookup
1161 *  Unlike the find... methods these methods will report access errors
1162 ****************************************************************************/
1163 
1164    /** Resolve an unqualified (non-method) identifier.
1165     *  @param pos       The position to use for error reporting.
1166     *  @param env       The environment current at the identifier use.
1167     *  @param name      The identifier's name.
1168     *  @param kind      The set of admissible symbol kinds for the identifier.
1169     */
1170    Symbol resolveIdent(DiagnosticPosition pos, Env<AttrContext> env,
1171                        Name name, int kind) {
1172        return access(
1173            findIdent(env, name, kind),
1174            pos, env.enclClass.sym.type, name, false);
1175    }
1176 
1177    /** Resolve an unqualified method identifier.
1178     *  @param pos       The position to use for error reporting.
1179     *  @param env       The environment current at the method invocation.
1180     *  @param name      The identifier's name.
1181     *  @param argtypes  The types of the invocation's value arguments.
1182     *  @param typeargtypes  The types of the invocation's type arguments.
1183     */
1184    Symbol resolveMethod(DiagnosticPosition pos,
1185                         Env<AttrContext> env,
1186                         Name name,
1187                         List<Type> argtypes,
1188                         List<Type> typeargtypes) {
1189        Symbol sym = findFun(env, name, argtypes, typeargtypes, false, env.info.varArgs=false);
1190        if (varargsEnabled && sym.kind >= WRONG_MTHS) {
1191            sym = findFun(env, name, argtypes, typeargtypes, true, false);
1192            if (sym.kind >= WRONG_MTHS)
1193                sym = findFun(env, name, argtypes, typeargtypes, true, env.info.varArgs=true);
1194        }
1195        if (sym.kind >= AMBIGUOUS) {
1196            sym = access(
1197                sym, pos, env.enclClass.sym.type, name, false, argtypes, typeargtypes);
1198        }
1199        return sym;
1200    }
1201 
1202    /** Resolve a qualified method identifier
1203     *  @param pos       The position to use for error reporting.
1204     *  @param env       The environment current at the method invocation.
1205     *  @param site      The type of the qualifying expression, in which
1206     *                   identifier is searched.
1207     *  @param name      The identifier's name.
1208     *  @param argtypes  The types of the invocation's value arguments.
1209     *  @param typeargtypes  The types of the invocation's type arguments.
1210     */
1211    Symbol resolveQualifiedMethod(DiagnosticPosition pos, Env<AttrContext> env,
1212                                  Type site, Name name, List<Type> argtypes,
1213                                  List<Type> typeargtypes) {
1214        Symbol sym = findMethod(env, site, name, argtypes, typeargtypes, false,
1215                                env.info.varArgs=false, false);
1216        if (varargsEnabled && sym.kind >= WRONG_MTHS) {
1217            sym = findMethod(env, site, name, argtypes, typeargtypes, true,
1218                             false, false);
1219            if (sym.kind >= WRONG_MTHS)
1220                sym = findMethod(env, site, name, argtypes, typeargtypes, true,
1221                                 env.info.varArgs=true, false);
1222        }
1223        if (sym.kind >= AMBIGUOUS) {
1224            sym = access(sym, pos, site, name, true, argtypes, typeargtypes);
1225        }
1226        return sym;
1227    }
1228 
1229    /** Resolve a qualified method identifier, throw a fatal error if not
1230     *  found.
1231     *  @param pos       The position to use for error reporting.
1232     *  @param env       The environment current at the method invocation.
1233     *  @param site      The type of the qualifying expression, in which
1234     *                   identifier is searched.
1235     *  @param name      The identifier's name.
1236     *  @param argtypes  The types of the invocation's value arguments.
1237     *  @param typeargtypes  The types of the invocation's type arguments.
1238     */
1239    public MethodSymbol resolveInternalMethod(DiagnosticPosition pos, Env<AttrContext> env,
1240                                        Type site, Name name,
1241                                        List<Type> argtypes,
1242                                        List<Type> typeargtypes) {
1243        Symbol sym = resolveQualifiedMethod(
1244            pos, env, site, name, argtypes, typeargtypes);
1245        if (sym.kind == MTH) return (MethodSymbol)sym;
1246        else throw new FatalError(
1247                 JCDiagnostic.fragment("fatal.err.cant.locate.meth",
1248                                name));
1249    }
1250 
1251    /** Resolve constructor.
1252     *  @param pos       The position to use for error reporting.
1253     *  @param env       The environment current at the constructor invocation.
1254     *  @param site      The type of class for which a constructor is searched.
1255     *  @param argtypes  The types of the constructor invocation's value
1256     *                   arguments.
1257     *  @param typeargtypes  The types of the constructor invocation's type
1258     *                   arguments.
1259     */
1260    Symbol resolveConstructor(DiagnosticPosition pos,
1261                              Env<AttrContext> env,
1262                              Type site,
1263                              List<Type> argtypes,
1264                              List<Type> typeargtypes) {
1265        Symbol sym = resolveConstructor(pos, env, site, argtypes, typeargtypes, false, env.info.varArgs=false);
1266        if (varargsEnabled && sym.kind >= WRONG_MTHS) {
1267            sym = resolveConstructor(pos, env, site, argtypes, typeargtypes, true, false);
1268            if (sym.kind >= WRONG_MTHS)
1269                sym = resolveConstructor(pos, env, site, argtypes, typeargtypes, true, env.info.varArgs=true);
1270        }
1271        if (sym.kind >= AMBIGUOUS) {
1272            sym = access(sym, pos, site, names.init, true, argtypes, typeargtypes);
1273        }
1274        return sym;
1275    }
1276 
1277    /** Resolve constructor.
1278     *  @param pos       The position to use for error reporting.
1279     *  @param env       The environment current at the constructor invocation.
1280     *  @param site      The type of class for which a constructor is searched.
1281     *  @param argtypes  The types of the constructor invocation's value
1282     *                   arguments.
1283     *  @param typeargtypes  The types of the constructor invocation's type
1284     *                   arguments.
1285     *  @param allowBoxing Allow boxing and varargs conversions.
1286     *  @param useVarargs Box trailing arguments into an array for varargs.
1287     */
1288    Symbol resolveConstructor(DiagnosticPosition pos, Env<AttrContext> env,
1289                              Type site, List<Type> argtypes,
1290                              List<Type> typeargtypes,
1291                              boolean allowBoxing,
1292                              boolean useVarargs) {
1293        Symbol sym = findMethod(env, site,
1294                                names.init, argtypes,
1295                                typeargtypes, allowBoxing,
1296                                useVarargs, false);
1297        if ((sym.flags() & DEPRECATED) != 0 &&
1298            (env.info.scope.owner.flags() & DEPRECATED) == 0 &&
1299            env.info.scope.owner.outermostClass() != sym.outermostClass())
1300            chk.warnDeprecated(pos, sym);
1301        return sym;
1302    }
1303 
1304    /** Resolve a constructor, throw a fatal error if not found.
1305     *  @param pos       The position to use for error reporting.
1306     *  @param env       The environment current at the method invocation.
1307     *  @param site      The type to be constructed.
1308     *  @param argtypes  The types of the invocation's value arguments.
1309     *  @param typeargtypes  The types of the invocation's type arguments.
1310     */
1311    public MethodSymbol resolveInternalConstructor(DiagnosticPosition pos, Env<AttrContext> env,
1312                                        Type site,
1313                                        List<Type> argtypes,
1314                                        List<Type> typeargtypes) {
1315        Symbol sym = resolveConstructor(
1316            pos, env, site, argtypes, typeargtypes);
1317        if (sym.kind == MTH) return (MethodSymbol)sym;
1318        else throw new FatalError(
1319                 JCDiagnostic.fragment("fatal.err.cant.locate.ctor", site));
1320    }
1321 
1322    /** Resolve operator.
1323     *  @param pos       The position to use for error reporting.
1324     *  @param optag     The tag of the operation tree.
1325     *  @param env       The environment current at the operation.
1326     *  @param argtypes  The types of the operands.
1327     */
1328    Symbol resolveOperator(DiagnosticPosition pos, int optag,
1329                           Env<AttrContext> env, List<Type> argtypes) {
1330        Name name = treeinfo.operatorName(optag);
1331        Symbol sym = findMethod(env, syms.predefClass.type, name, argtypes,
1332                                null, false, false, true);
1333        if (boxingEnabled && sym.kind >= WRONG_MTHS)
1334            sym = findMethod(env, syms.predefClass.type, name, argtypes,
1335                             null, true, false, true);
1336        return access(sym, pos, env.enclClass.sym.type, name,
1337                      false, argtypes, null);
1338    }
1339 
1340    /** Resolve operator.
1341     *  @param pos       The position to use for error reporting.
1342     *  @param optag     The tag of the operation tree.
1343     *  @param env       The environment current at the operation.
1344     *  @param arg       The type of the operand.
1345     */
1346    Symbol resolveUnaryOperator(DiagnosticPosition pos, int optag, Env<AttrContext> env, Type arg) {
1347        return resolveOperator(pos, optag, env, List.of(arg));
1348    }
1349 
1350    /** Resolve binary operator.
1351     *  @param pos       The position to use for error reporting.
1352     *  @param optag     The tag of the operation tree.
1353     *  @param env       The environment current at the operation.
1354     *  @param left      The types of the left operand.
1355     *  @param right     The types of the right operand.
1356     */
1357    Symbol resolveBinaryOperator(DiagnosticPosition pos,
1358                                 int optag,
1359                                 Env<AttrContext> env,
1360                                 Type left,
1361                                 Type right) {
1362        return resolveOperator(pos, optag, env, List.of(left, right));
1363    }
1364 
1365    /**
1366     * Resolve `c.name' where name == this or name == super.
1367     * @param pos           The position to use for error reporting.
1368     * @param env           The environment current at the expression.
1369     * @param c             The qualifier.
1370     * @param name          The identifier's name.
1371     */
1372    Symbol resolveSelf(DiagnosticPosition pos,
1373                       Env<AttrContext> env,
1374                       TypeSymbol c,
1375                       Name name) {
1376        Env<AttrContext> env1 = env;
1377        boolean staticOnly = false;
1378        while (env1.outer != null) {
1379            if (isStatic(env1)) staticOnly = true;
1380            if (env1.enclClass.sym == c) {
1381                Symbol sym = env1.info.scope.lookup(name).sym;
1382                if (sym != null) {
1383                    if (staticOnly) sym = new StaticError(sym);
1384                    return access(sym, pos, env.enclClass.sym.type,
1385                                  name, true);
1386                }
1387            }
1388            if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true;
1389            env1 = env1.outer;
1390        }
1391        log.error(pos, "not.encl.class", c);
1392        return syms.errSymbol;
1393    }
1394 
1395    /**
1396     * Resolve `c.this' for an enclosing class c that contains the
1397     * named member.
1398     * @param pos           The position to use for error reporting.
1399     * @param env           The environment current at the expression.
1400     * @param member        The member that must be contained in the result.
1401     */
1402    Symbol resolveSelfContaining(DiagnosticPosition pos,
1403                                 Env<AttrContext> env,
1404                                 Symbol member) {
1405        Name name = names._this;
1406        Env<AttrContext> env1 = env;
1407        boolean staticOnly = false;
1408        while (env1.outer != null) {
1409            if (isStatic(env1)) staticOnly = true;
1410            if (env1.enclClass.sym.isSubClass(member.owner, types) &&
1411                isAccessible(env, env1.enclClass.sym.type, member)) {
1412                Symbol sym = env1.info.scope.lookup(name).sym;
1413                if (sym != null) {
1414                    if (staticOnly) sym = new StaticError(sym);
1415                    return access(sym, pos, env.enclClass.sym.type,
1416                                  name, true);
1417                }
1418            }
1419            if ((env1.enclClass.sym.flags() & STATIC) != 0)
1420                staticOnly = true;
1421            env1 = env1.outer;
1422        }
1423        log.error(pos, "encl.class.required", member);
1424        return syms.errSymbol;
1425    }
1426 
1427    /**
1428     * Resolve an appropriate implicit this instance for t's container.
1429     * JLS2 8.8.5.1 and 15.9.2
1430     */
1431    Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t) {
1432        Type thisType = (((t.tsym.owner.kind & (MTH|VAR)) != 0)
1433                         ? resolveSelf(pos, env, t.getEnclosingType().tsym, names._this)
1434                         : resolveSelfContaining(pos, env, t.tsym)).type;
1435        if (env.info.isSelfCall && thisType.tsym == env.enclClass.sym)
1436            log.error(pos, "cant.ref.before.ctor.called", "this");
1437        return thisType;
1438    }
1439 
1440/* ***************************************************************************
1441 *  Methods related to kinds
1442 ****************************************************************************/
1443 
1444    /** A localized string describing a given kind.
1445     */
1446    static JCDiagnostic kindName(int kind) {
1447        switch (kind) {
1448        case PCK: return JCDiagnostic.fragment("kindname.package");
1449        case TYP: return JCDiagnostic.fragment("kindname.class");
1450        case VAR: return JCDiagnostic.fragment("kindname.variable");
1451        case VAL: return JCDiagnostic.fragment("kindname.value");
1452        case MTH: return JCDiagnostic.fragment("kindname.method");
1453        default : return JCDiagnostic.fragment("kindname",
1454                                               Integer.toString(kind)); //debug
1455        }
1456    }
1457 
1458    static JCDiagnostic kindName(Symbol sym) {
1459        switch (sym.getKind()) {
1460        case PACKAGE:
1461            return JCDiagnostic.fragment("kindname.package");
1462 
1463        case ENUM:
1464        case ANNOTATION_TYPE:
1465        case INTERFACE:
1466        case CLASS:
1467            return JCDiagnostic.fragment("kindname.class");
1468 
1469        case TYPE_PARAMETER:
1470            return JCDiagnostic.fragment("kindname.type.variable");
1471 
1472        case ENUM_CONSTANT:
1473        case FIELD:
1474        case PARAMETER:
1475        case LOCAL_VARIABLE:
1476        case EXCEPTION_PARAMETER:
1477            return JCDiagnostic.fragment("kindname.variable");
1478 
1479        case METHOD:
1480        case CONSTRUCTOR:
1481        case STATIC_INIT:
1482        case INSTANCE_INIT:
1483            return JCDiagnostic.fragment("kindname.method");
1484 
1485        default:
1486            if (sym.kind == VAL)
1487                // I don't think this can happen but it can't harm
1488                // playing it safe --ahe
1489                return JCDiagnostic.fragment("kindname.value");
1490            else
1491                return JCDiagnostic.fragment("kindname", sym.getKind()); // debug
1492        }
1493    }
1494 
1495    /** A localized string describing a given set of kinds.
1496     */
1497    static JCDiagnostic kindNames(int kind) {
1498        StringBuffer key = new StringBuffer();
1499        key.append("kindname");
1500        if ((kind & VAL) != 0)
1501            key.append(((kind & VAL) == VAR) ? ".variable" : ".value");
1502        if ((kind & MTH) != 0) key.append(".method");
1503        if ((kind & TYP) != 0) key.append(".class");
1504        if ((kind & PCK) != 0) key.append(".package");
1505        return JCDiagnostic.fragment(key.toString(), kind);
1506    }
1507 
1508    /** A localized string describing the kind -- either class or interface --
1509     *  of a given type.
1510     */
1511    static JCDiagnostic typeKindName(Type t) {
1512        if (t.tag == TYPEVAR ||
1513            t.tag == CLASS && (t.tsym.flags() & COMPOUND) != 0)
1514            return JCDiagnostic.fragment("kindname.type.variable.bound");
1515        else if (t.tag == PACKAGE)
1516            return JCDiagnostic.fragment("kindname.package");
1517        else if ((t.tsym.flags_field & ANNOTATION) != 0)
1518            return JCDiagnostic.fragment("kindname.annotation");
1519        else if ((t.tsym.flags_field & INTERFACE) != 0)
1520            return JCDiagnostic.fragment("kindname.interface");
1521        else
1522            return JCDiagnostic.fragment("kindname.class");
1523    }
1524 
1525    /** A localized string describing the kind of a missing symbol, given an
1526     *  error kind.
1527     */
1528    static JCDiagnostic absentKindName(int kind) {
1529        switch (kind) {
1530        case ABSENT_VAR:
1531            return JCDiagnostic.fragment("kindname.variable");
1532        case WRONG_MTHS: case WRONG_MTH: case ABSENT_MTH:
1533            return JCDiagnostic.fragment("kindname.method");
1534        case ABSENT_TYP:
1535            return JCDiagnostic.fragment("kindname.class");
1536        default:
1537            return JCDiagnostic.fragment("kindname", kind);
1538        }
1539    }
1540 
1541/* ***************************************************************************
1542 *  ResolveError classes, indicating error situations when accessing symbols
1543 ****************************************************************************/
1544 
1545    public void logAccessError(Env<AttrContext> env, JCTree tree, Type type) {
1546        AccessError error = new AccessError(env, type.getEnclosingType(), type.tsym);
1547        error.report(log, tree.pos(), type.getEnclosingType(), null, null, null);
1548    }
1549 
1550    /** Root class for resolve errors.
1551     *  Instances of this class indicate "Symbol not found".
1552     *  Instances of subclass indicate other errors.
1553     */
1554    private class ResolveError extends Symbol {
1555 
1556        ResolveError(int kind, Symbol sym, String debugName) {
1557            super(kind, 0, null, null, null);
1558            this.debugName = debugName;
1559            this.sym = sym;
1560        }
1561 
1562        /** The name of the kind of error, for debugging only.
1563         */
1564        final String debugName;
1565 
1566        /** The symbol that was determined by resolution, or errSymbol if none
1567         *  was found.
1568         */
1569        final Symbol sym;
1570 
1571        /** The symbol that was a close mismatch, or null if none was found.
1572         *  wrongSym is currently set if a simgle method with the correct name, but
1573         *  the wrong parameters was found.
1574         */
1575        Symbol wrongSym;
1576 
1577        /** An auxiliary explanation set in case of instantiation errors.
1578         */
1579        JCDiagnostic explanation;
1580 
1581 
1582        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
1583            throw new AssertionError();
1584        }
1585 
1586        /** Print the (debug only) name of the kind of error.
1587         */
1588        public String toString() {
1589            return debugName + " wrongSym=" + wrongSym + " explanation=" + explanation;
1590        }
1591 
1592        /** Update wrongSym and explanation and return this.
1593         */
1594        ResolveError setWrongSym(Symbol sym, JCDiagnostic explanation) {
1595            this.wrongSym = sym;
1596            this.explanation = explanation;
1597            return this;
1598        }
1599 
1600        /** Update wrongSym and return this.
1601         */
1602        ResolveError setWrongSym(Symbol sym) {
1603            this.wrongSym = sym;
1604            this.explanation = null;
1605            return this;
1606        }
1607 
1608        public boolean exists() {
1609            switch (kind) {
1610            case HIDDEN:
1611            case ABSENT_VAR:
1612            case ABSENT_MTH:
1613            case ABSENT_TYP:
1614                return false;
1615            default:
1616                return true;
1617            }
1618        }
1619 
1620        /** Report error.
1621         *  @param log       The error log to be used for error reporting.
1622         *  @param pos       The position to be used for error reporting.
1623         *  @param site      The original type from where the selection took place.
1624         *  @param name      The name of the symbol to be resolved.
1625         *  @param argtypes  The invocation's value arguments,
1626         *                   if we looked for a method.
1627         *  @param typeargtypes  The invocation's type arguments,
1628         *                   if we looked for a method.
1629         */
1630        void report(Log log, DiagnosticPosition pos, Type site, Name name,
1631                    List<Type> argtypes, List<Type> typeargtypes) {
1632            if (name != name.table.error) {
1633                JCDiagnostic kindname = absentKindName(kind);
1634                String idname = name.toString();
1635                String args = "";
1636                String typeargs = "";
1637                if (kind >= WRONG_MTHS && kind <= ABSENT_MTH) {
1638                    if (isOperator(name)) {
1639                        log.error(pos, "operator.cant.be.applied",
1640                                  name, Type.toString(argtypes));
1641                        return;
1642                    }
1643                    if (name == name.table.init) {
1644                        kindname = JCDiagnostic.fragment("kindname.constructor");
1645                        idname = site.tsym.name.toString();
1646                    }
1647                    args = "(" + Type.toString(argtypes) + ")";
1648                    if (typeargtypes != null && typeargtypes.nonEmpty())
1649                        typeargs = "<" + Type.toString(typeargtypes) + ">";
1650                }
1651                if (kind == WRONG_MTH) {
1652                    log.error(pos,
1653                              "cant.apply.symbol" + (explanation != null ? ".1" : ""),
1654                              wrongSym.asMemberOf(site, types),
1655                              wrongSym.location(site, types),
1656                              typeargs,
1657                              Type.toString(argtypes),
1658                              explanation);
1659                } else if (site.tsym.name.len != 0) {
1660                    if (site.tsym.kind == PCK && !site.tsym.exists())
1661                        log.error(pos, "doesnt.exist", site.tsym);
1662                    else
1663                        log.error(pos, "cant.resolve.location",
1664                                  kindname, idname, args, typeargs,
1665                                  typeKindName(site), site);
1666                } else {
1667                    log.error(pos, "cant.resolve", kindname, idname, args, typeargs);
1668                }
1669            }
1670        }
1671//where
1672            /** A name designates an operator if it consists
1673             *  of a non-empty sequence of operator symbols +-~!/*%&|^<>=
1674             */
1675            boolean isOperator(Name name) {
1676                int i = 0;
1677                while (i < name.len &&
1678                       "+-~!*/%&|^<>=".indexOf(name.byteAt(i)) >= 0) i++;
1679                return i > 0 && i == name.len;
1680            }
1681    }
1682 
1683    /** Resolve error class indicating that a symbol is not accessible.
1684     */
1685    class AccessError extends ResolveError {
1686 
1687        AccessError(Symbol sym) {
1688            this(null, null, sym);
1689        }
1690 
1691        AccessError(Env<AttrContext> env, Type site, Symbol sym) {
1692            super(HIDDEN, sym, "access error");
1693            this.env = env;
1694            this.site = site;
1695            if (debugResolve)
1696                log.error("proc.messager", sym + " @ " + site + " is inaccessible.");
1697        }
1698 
1699        private Env<AttrContext> env;
1700        private Type site;
1701 
1702        /** Report error.
1703         *  @param log       The error log to be used for error reporting.
1704         *  @param pos       The position to be used for error reporting.
1705         *  @param site      The original type from where the selection took place.
1706         *  @param name      The name of the symbol to be resolved.
1707         *  @param argtypes  The invocation's value arguments,
1708         *                   if we looked for a method.
1709         *  @param typeargtypes  The invocation's type arguments,
1710         *                   if we looked for a method.
1711         */
1712        void report(Log log, DiagnosticPosition pos, Type site, Name name,
1713                    List<Type> argtypes, List<Type> typeargtypes) {
1714            if (sym.owner.type.tag != ERROR) {
1715                if (sym.name == sym.name.table.init && sym.owner != site.tsym)
1716                    new ResolveError(ABSENT_MTH, sym.owner, "absent method " + sym).report(
1717                        log, pos, site, name, argtypes, typeargtypes);
1718                if ((sym.flags() & PUBLIC) != 0
1719                    || (env != null && this.site != null
1720                        && !isAccessible(env, this.site)))
1721                    log.error(pos, "not.def.access.class.intf.cant.access",
1722                        sym, sym.location());
1723                else if ((sym.flags() & (PRIVATE | PROTECTED)) != 0)
1724                    log.error(pos, "report.access", sym,
1725                              TreeInfo.flagNames(sym.flags() & (PRIVATE | PROTECTED)),
1726                              sym.location());
1727                else
1728                    log.error(pos, "not.def.public.cant.access",
1729                              sym, sym.location());
1730            }
1731        }
1732    }
1733 
1734    /** Resolve error class indicating that an instance member was accessed
1735     *  from a static context.
1736     */
1737    class StaticError extends ResolveError {
1738        StaticError(Symbol sym) {
1739            super(STATICERR, sym, "static error");
1740        }
1741 
1742        /** Report error.
1743         *  @param log       The error log to be used for error reporting.
1744         *  @param pos       The position to be used for error reporting.
1745         *  @param site      The original type from where the selection took place.
1746         *  @param name      The name of the symbol to be resolved.
1747         *  @param argtypes  The invocation's value arguments,
1748         *                   if we looked for a method.
1749         *  @param typeargtypes  The invocation's type arguments,
1750         *                   if we looked for a method.
1751         */
1752        void report(Log log,
1753                    DiagnosticPosition pos,
1754                    Type site,
1755                    Name name,
1756                    List<Type> argtypes,
1757                    List<Type> typeargtypes) {
1758            String symstr = ((sym.kind == TYP && sym.type.tag == CLASS)
1759                ? types.erasure(sym.type)
1760                : sym).toString();
1761            log.error(pos, "non-static.cant.be.ref",
1762                      kindName(sym), symstr);
1763        }
1764    }
1765 
1766    /** Resolve error class indicating an ambiguous reference.
1767     */
1768    class AmbiguityError extends ResolveError {
1769        Symbol sym1;
1770        Symbol sym2;
1771 
1772        AmbiguityError(Symbol sym1, Symbol sym2) {
1773            super(AMBIGUOUS, sym1, "ambiguity error");
1774            this.sym1 = sym1;
1775            this.sym2 = sym2;
1776        }
1777 
1778        /** Report error.
1779         *  @param log       The error log to be used for error reporting.
1780         *  @param pos       The position to be used for error reporting.
1781         *  @param site      The original type from where the selection took place.
1782         *  @param name      The name of the symbol to be resolved.
1783         *  @param argtypes  The invocation's value arguments,
1784         *                   if we looked for a method.
1785         *  @param typeargtypes  The invocation's type arguments,
1786         *                   if we looked for a method.
1787         */
1788        void report(Log log, DiagnosticPosition pos, Type site, Name name,
1789                    List<Type> argtypes, List<Type> typeargtypes) {
1790            AmbiguityError pair = this;
1791            while (true) {
1792                if (pair.sym1.kind == AMBIGUOUS)
1793                    pair = (AmbiguityError)pair.sym1;
1794                else if (pair.sym2.kind == AMBIGUOUS)
1795                    pair = (AmbiguityError)pair.sym2;
1796                else break;
1797            }
1798            Name sname = pair.sym1.name;
1799            if (sname == sname.table.init) sname = pair.sym1.owner.name;
1800            log.error(pos, "ref.ambiguous", sname,
1801                      kindName(pair.sym1),
1802                      pair.sym1,
1803                      pair.sym1.location(site, types),
1804                      kindName(pair.sym2),
1805                      pair.sym2,
1806                      pair.sym2.location(site, types));
1807        }
1808    }
1809}

[all classes][com.sun.tools.javac.comp]
EMMA 2.0.5312 (C) Vladimir Roubtsov