CompilerReferenceServiceImpl do not check ambiguity for lib classes (ex: Runnable)

This commit is contained in:
Dmitry Batkovich
2016-10-07 13:48:13 +03:00
parent 75e90b5b12
commit 5a90c7ac89
2 changed files with 11 additions and 7 deletions
@@ -45,12 +45,14 @@ public class CompilerReferenceReader {
}
@Nullable
public TIntHashSet findReferentFileIds(@NotNull CompilerElement element, @NotNull CompilerSearchAdapter adapter) {
public TIntHashSet findReferentFileIds(@NotNull CompilerElement element,
@NotNull CompilerSearchAdapter adapter,
boolean checkBaseClassAmbiguity) {
LightUsage usage = asLightUsage(element);
TIntHashSet set = new TIntHashSet();
if (adapter.needOverrideElement()) {
final LightUsage[] hierarchy = getWholeHierarchy(usage.getOwner());
final LightUsage[] hierarchy = getWholeHierarchy(usage.getOwner(), checkBaseClassAmbiguity);
if (hierarchy == null) return null;
for (LightUsage aClass : hierarchy) {
final LightUsage overriderUsage = usage.override(aClass);
@@ -116,16 +118,18 @@ public class CompilerReferenceReader {
}
@Nullable("return null if the class hierarchy contains ambiguous qualified names")
private LightUsage[] getWholeHierarchy(LightUsage aClass) {
private LightUsage[] getWholeHierarchy(LightUsage aClass, boolean checkBaseClassAmbiguity) {
Set<LightUsage> result = new THashSet<>();
Queue<LightUsage> q = new Queue<>(10);
q.addLast(aClass);
while (!q.isEmpty()) {
LightUsage curClass = q.pullFirst();
if (result.add(curClass)) {
final Collection<Integer> definitionFiles = myIndex.getBackwardClassDefinitionMap().get(curClass);
if (definitionFiles.size() != 1) {
return null;
if (checkBaseClassAmbiguity || curClass != aClass) {
final Collection<Integer> definitionFiles = myIndex.getBackwardClassDefinitionMap().get(curClass);
if (definitionFiles.size() != 1) {
return null;
}
}
final Collection<CompilerBackwardReferenceIndex.LightDefinition> subClassDefs = myIndex.getBackwardHierarchyMap().get(curClass);
if (subClassDefs != null) {
@@ -201,7 +201,7 @@ public class CompilerReferenceServiceImpl extends CompilerReferenceService imple
if (myReader == null) return null;
TIntHashSet referentFileIds = new TIntHashSet();
for (CompilerElement compilerElement : compilerElements) {
final TIntHashSet referents = myReader.findReferentFileIds(compilerElement, adapter);
final TIntHashSet referents = myReader.findReferentFileIds(compilerElement, adapter, place == ElementPlace.SRC);
if (referents == null) return null;
referentFileIds.addAll(referents.toArray());
}