src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java
changeset 50539 7bf4f1b5e438
parent 50374 2d0647b9ac18
child 50592 dddf078c242f
equal deleted inserted replaced
50538:f36d08a3e700 50539:7bf4f1b5e438
  2010                     } catch (CompletionFailure cf) {
  2010                     } catch (CompletionFailure cf) {
  2011                         //ignore
  2011                         //ignore
  2012                     }
  2012                     }
  2013                 }
  2013                 }
  2014                 return null;
  2014                 return null;
  2015             }, sym -> sym.kind == Kind.TYP, false, typeNotFound);
  2015             }, sym -> sym.kind == Kind.TYP, typeNotFound);
  2016         }
  2016         }
  2017     };
  2017     };
  2018 
  2018 
  2019     private final RecoveryLoadClass namedImportScopeRecovery = (env, name) -> {
  2019     private final RecoveryLoadClass namedImportScopeRecovery = (env, name) -> {
  2020         Scope importScope = env.toplevel.namedImportScope;
  2020         Scope importScope = env.toplevel.namedImportScope;
  2047 
  2047 
  2048     Symbol lookupPackage(Env<AttrContext> env, Name name) {
  2048     Symbol lookupPackage(Env<AttrContext> env, Name name) {
  2049         PackageSymbol pack = syms.lookupPackage(env.toplevel.modle, name);
  2049         PackageSymbol pack = syms.lookupPackage(env.toplevel.modle, name);
  2050 
  2050 
  2051         if (allowModules && isImportOnDemand(env, name)) {
  2051         if (allowModules && isImportOnDemand(env, name)) {
  2052             pack.complete();
  2052             if (pack.members().isEmpty()) {
  2053             if (!pack.exists()) {
       
  2054                 Name nameAndDot = name.append('.', names.empty);
       
  2055                 boolean prefixOfKnown =
       
  2056                         env.toplevel.modle.visiblePackages.values()
       
  2057                                                           .stream()
       
  2058                                                           .anyMatch(p -> p.fullname.startsWith(nameAndDot));
       
  2059 
       
  2060                 return lookupInvisibleSymbol(env, name, syms::getPackagesForName, syms::enterPackage, sym -> {
  2053                 return lookupInvisibleSymbol(env, name, syms::getPackagesForName, syms::enterPackage, sym -> {
  2061                     sym.complete();
  2054                     sym.complete();
  2062                     return sym.exists();
  2055                     return !sym.members().isEmpty();
  2063                 }, prefixOfKnown, pack);
  2056                 }, pack);
  2064             }
  2057             }
  2065         }
  2058         }
  2066 
  2059 
  2067         return pack;
  2060         return pack;
  2068     }
  2061     }
  2085     private <S extends Symbol> Symbol lookupInvisibleSymbol(Env<AttrContext> env,
  2078     private <S extends Symbol> Symbol lookupInvisibleSymbol(Env<AttrContext> env,
  2086                                                             Name name,
  2079                                                             Name name,
  2087                                                             Function<Name, Iterable<S>> get,
  2080                                                             Function<Name, Iterable<S>> get,
  2088                                                             BiFunction<ModuleSymbol, Name, S> load,
  2081                                                             BiFunction<ModuleSymbol, Name, S> load,
  2089                                                             Predicate<S> validate,
  2082                                                             Predicate<S> validate,
  2090                                                             boolean suppressError,
       
  2091                                                             Symbol defaultResult) {
  2083                                                             Symbol defaultResult) {
  2092         //even if a class/package cannot be found in the current module and among packages in modules
  2084         //even if a class/package cannot be found in the current module and among packages in modules
  2093         //it depends on that are exported for any or this module, the class/package may exist internally
  2085         //it depends on that are exported for any or this module, the class/package may exist internally
  2094         //in some of these modules, or may exist in a module on which this module does not depend.
  2086         //in some of these modules, or may exist in a module on which this module does not depend.
  2095         //Provide better diagnostic in such cases by looking for the class in any module:
  2087         //Provide better diagnostic in such cases by looking for the class in any module:
  2096         Iterable<? extends S> candidates = get.apply(name);
  2088         Iterable<? extends S> candidates = get.apply(name);
  2097 
  2089 
  2098         for (S sym : candidates) {
  2090         for (S sym : candidates) {
  2099             if (validate.test(sym))
  2091             if (validate.test(sym))
  2100                 return createInvisibleSymbolError(env, suppressError, sym);
  2092                 return createInvisibleSymbolError(env, sym);
  2101         }
  2093         }
  2102 
  2094 
  2103         Set<ModuleSymbol> recoverableModules = new HashSet<>(syms.getAllModules());
  2095         Set<ModuleSymbol> recoverableModules = new HashSet<>(syms.getAllModules());
  2104 
  2096 
  2105         recoverableModules.add(syms.unnamedModule);
  2097         recoverableModules.add(syms.unnamedModule);
  2115 
  2107 
  2116                 if (ms.kind != ERR) {
  2108                 if (ms.kind != ERR) {
  2117                     S sym = load.apply(ms, name);
  2109                     S sym = load.apply(ms, name);
  2118 
  2110 
  2119                     if (sym != null && validate.test(sym)) {
  2111                     if (sym != null && validate.test(sym)) {
  2120                         return createInvisibleSymbolError(env, suppressError, sym);
  2112                         return createInvisibleSymbolError(env, sym);
  2121                     }
  2113                     }
  2122                 }
  2114                 }
  2123             }
  2115             }
  2124         }
  2116         }
  2125 
  2117 
  2126         return defaultResult;
  2118         return defaultResult;
  2127     }
  2119     }
  2128 
  2120 
  2129     private Symbol createInvisibleSymbolError(Env<AttrContext> env, boolean suppressError, Symbol sym) {
  2121     private Symbol createInvisibleSymbolError(Env<AttrContext> env, Symbol sym) {
  2130         if (symbolPackageVisible(env, sym)) {
  2122         if (symbolPackageVisible(env, sym)) {
  2131             return new AccessError(env, null, sym);
  2123             return new AccessError(env, null, sym);
  2132         } else {
  2124         } else {
  2133             return new InvisibleSymbolError(env, suppressError, sym);
  2125             return new InvisibleSymbolError(env, false, sym);
  2134         }
  2126         }
  2135     }
  2127     }
  2136 
  2128 
  2137     private boolean symbolPackageVisible(Env<AttrContext> env, Symbol sym) {
  2129     private boolean symbolPackageVisible(Env<AttrContext> env, Symbol sym) {
  2138         ModuleSymbol envMod = env.toplevel.modle;
  2130         ModuleSymbol envMod = env.toplevel.modle;