From cbccb68948362725e3295798bd6c40d42a1bdc13 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 8 Mar 2017 18:46:37 +0100 Subject: [PATCH] Fix logic for searching inner classes in LazyResolveBasedCache.findInPackageFragments() #KT-14058 Fixed --- .../java/components/LazyResolveBasedCache.kt | 30 ++++++++++++------- .../multiFileHighlighting/dependencies/A.java | 14 +++++++++ .../dependencies/sealedClass.kt | 5 ++++ .../missingDependencyClass.kt | 5 ++++ .../MultiFileHighlightingTestGenerated.java | 6 ++++ 5 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 idea/testData/multiFileHighlighting/dependencies/A.java create mode 100644 idea/testData/multiFileHighlighting/dependencies/sealedClass.kt create mode 100644 idea/testData/multiFileHighlighting/missingDependencyClass.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/LazyResolveBasedCache.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/LazyResolveBasedCache.kt index 745b63f6907..a5b149c3d69 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/LazyResolveBasedCache.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/LazyResolveBasedCache.kt @@ -16,17 +16,25 @@ package org.jetbrains.kotlin.load.java.components -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.load.java.structure.* -import org.jetbrains.kotlin.load.java.structure.impl.* -import org.jetbrains.kotlin.resolve.lazy.ResolveSession -import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor +import org.jetbrains.kotlin.load.java.structure.JavaClass +import org.jetbrains.kotlin.load.java.structure.JavaElement +import org.jetbrains.kotlin.load.java.structure.JavaField +import org.jetbrains.kotlin.load.java.structure.JavaMethod +import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl +import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl +import org.jetbrains.kotlin.load.java.structure.impl.JavaFieldImpl +import org.jetbrains.kotlin.load.java.structure.impl.JavaMethodImpl import org.jetbrains.kotlin.name.FqName -import kotlin.properties.Delegates import org.jetbrains.kotlin.name.tail import org.jetbrains.kotlin.resolve.BindingContext.* -import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingContextUtils +import org.jetbrains.kotlin.resolve.BindingTrace +import org.jetbrains.kotlin.resolve.lazy.ResolveSession +import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils class LazyResolveBasedCache(private val resolveSession: ResolveSession) : JavaResolverCache { @@ -57,10 +65,10 @@ class LazyResolveBasedCache(private val resolveSession: ResolveSession) : JavaRe while (true) { val packageDescriptor = resolveSession.getPackageFragment(fqName) - if (packageDescriptor == null) break - - val result = ResolveSessionUtils.findClassByRelativePath(packageDescriptor.getMemberScope(), fullFqName.tail(fqName)) - if (result != null) return result + if (packageDescriptor != null) { + val result = ResolveSessionUtils.findClassByRelativePath(packageDescriptor.getMemberScope(), fullFqName.tail(fqName)) + if (result != null) return result + } if (fqName.isRoot) break fqName = fqName.parent() diff --git a/idea/testData/multiFileHighlighting/dependencies/A.java b/idea/testData/multiFileHighlighting/dependencies/A.java new file mode 100644 index 00000000000..8818eaeeeb3 --- /dev/null +++ b/idea/testData/multiFileHighlighting/dependencies/A.java @@ -0,0 +1,14 @@ +package dependencies; + +import sealedClass.Foo; + +public class A { + public static class B { + } + + public static B myList = null; + + public static T bar(B tb) { + return null; + } +} diff --git a/idea/testData/multiFileHighlighting/dependencies/sealedClass.kt b/idea/testData/multiFileHighlighting/dependencies/sealedClass.kt new file mode 100644 index 00000000000..d39a0e08d88 --- /dev/null +++ b/idea/testData/multiFileHighlighting/dependencies/sealedClass.kt @@ -0,0 +1,5 @@ +package sealedClass + +sealed class Foo { + class Bar : Foo() +} diff --git a/idea/testData/multiFileHighlighting/missingDependencyClass.kt b/idea/testData/multiFileHighlighting/missingDependencyClass.kt new file mode 100644 index 00000000000..74d17f51262 --- /dev/null +++ b/idea/testData/multiFileHighlighting/missingDependencyClass.kt @@ -0,0 +1,5 @@ +package dependencies + +fun test() { + val bar = A.bar(A.myList) // MISSING_DEPENDENCY_CLASS foo.Foo.Bar +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/MultiFileHighlightingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/MultiFileHighlightingTestGenerated.java index 140c2de69e5..b970088583e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/MultiFileHighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/MultiFileHighlightingTestGenerated.java @@ -60,6 +60,12 @@ public class MultiFileHighlightingTestGenerated extends AbstractMultiFileHighlig doTest(fileName); } + @TestMetadata("missingDependencyClass.kt") + public void testMissingDependencyClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiFileHighlighting/missingDependencyClass.kt"); + doTest(fileName); + } + @TestMetadata("referencesFunWithUnspecifiedType.kt") public void testReferencesFunWithUnspecifiedType() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/multiFileHighlighting/referencesFunWithUnspecifiedType.kt");