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; |