/** Finds type with given name. */ private JavaSymbol findType(Env env, String name) { JavaSymbol bestSoFar = symbolNotFound; for (Env env1 = env; env1 != null; env1 = env1.outer) { for (JavaSymbol symbol : env1.scope.lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return symbol; } } if (env1.outer != null) { JavaSymbol symbol = findMemberType(env1, env1.enclosingClass, name, env1.enclosingClass); if (symbol.kind < JavaSymbol.ERRONEOUS) { // symbol exists return symbol; } else if (symbol.kind < bestSoFar.kind) { bestSoFar = symbol; } } } // checks predefined types JavaSymbol predefinedSymbol = findMemberType(env, symbols.predefClass, name, symbols.predefClass); if (predefinedSymbol.kind < bestSoFar.kind) { return predefinedSymbol; } // JLS8 6.4.1 Shadowing rules // named imports for (JavaSymbol symbol : env.namedImports.lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return symbol; } } // package types JavaSymbol sym = findIdentInPackage(env.packge, name, JavaSymbol.TYP); if (sym.kind < bestSoFar.kind) { return sym; } // on demand imports for (JavaSymbol symbol : env.starImports.lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return symbol; } } // java.lang JavaSymbol.PackageJavaSymbol javaLang = bytecodeCompleter.enterPackage("java.lang"); for (JavaSymbol symbol : javaLang.completedMembers().lookup(name)) { if (symbol.kind == JavaSymbol.TYP) { return symbol; } } return bestSoFar; }