diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt index a64a50716c8..03abaee1a01 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiClass import com.intellij.psi.PsiTypeParameter +import com.intellij.psi.search.SearchScope import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.load.java.structure.* @@ -113,6 +114,8 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl(psiClass) override val virtualFile: VirtualFile? get() = psi.containingFile?.virtualFile + override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = psi.containingFile.virtualFile in scope + override fun getAnnotationOwnerPsi() = psi.modifierList private fun assertNotLightClass() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt index 3df909ac2e4..bd197c0f33a 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/VirtualFileBoundJavaClass.kt @@ -17,8 +17,11 @@ package org.jetbrains.kotlin.load.java.structure.impl import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.search.SearchScope import org.jetbrains.kotlin.load.java.structure.JavaClass interface VirtualFileBoundJavaClass : JavaClass { val virtualFile: VirtualFile? + + fun isFromSourceCodeInScope(scope: SearchScope): Boolean } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt index 067f091d1cc..ef4fbce7dcf 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/classFiles/BinaryJavaClass.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.load.java.structure.impl.classFiles import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.search.SearchScope import com.intellij.util.containers.ContainerUtil import gnu.trove.THashMap import org.jetbrains.kotlin.builtins.PrimitiveType @@ -60,6 +61,8 @@ class BinaryJavaClass( override val isEnum get() = isSet(Opcodes.ACC_ENUM) override val lightClassOriginKind: LightClassOriginKind? get() = null + override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = false + override fun visitEnd() { methods.trimToSize() fields.trimToSize() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt index a32e2ac16a2..e36c7c897e4 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt @@ -41,10 +41,8 @@ import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerFo import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis import org.jetbrains.kotlin.frontend.java.di.initialize import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.javac.MockKotlinClassifier import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver import org.jetbrains.kotlin.load.java.structure.JavaClass -import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider @@ -62,7 +60,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.javac.wrappers.trees.TreeBasedClass +import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import java.util.* object TopDownAnalyzerFacadeForJVM { @@ -247,8 +245,7 @@ object TopDownAnalyzerFacadeForJVM { lateinit var sourceCodeResolver: JavaDescriptorResolver override fun resolveClass(javaClass: JavaClass): ClassDescriptor? { - val resolver = if (javaClass is JavaClassImpl && javaClass.psi.containingFile.virtualFile in sourceScope - || javaClass is TreeBasedClass || javaClass is MockKotlinClassifier) + val resolver = if (javaClass is VirtualFileBoundJavaClass && javaClass.isFromSourceCodeInScope(sourceScope)) sourceCodeResolver else compiledCodeResolver diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/KotlinClassifiersCache.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/KotlinClassifiersCache.kt index 225896733a8..d9e5e12ea22 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/KotlinClassifiersCache.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/KotlinClassifiersCache.kt @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.javac +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.search.SearchScope import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.load.java.structure.* @@ -29,6 +31,7 @@ import org.jetbrains.kotlin.javac.wrappers.trees.find import org.jetbrains.kotlin.javac.wrappers.trees.findInner import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveByFqName import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveInJavaLang +import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass class KotlinClassifiersCache(sourceFiles: Collection, private val javac: JavacWrapper) { @@ -58,7 +61,7 @@ class KotlinClassifiersCache(sourceFiles: Collection, class MockKotlinClassifier(override val fqName: FqName, private val classOrObject: KtClassOrObject, val hasTypeParameters: Boolean, - private val javac: JavacWrapper) : JavaClass { + private val javac: JavacWrapper) : VirtualFileBoundJavaClass { override val isAbstract: Boolean get() = throw UnsupportedOperationException("Should not be called") @@ -114,6 +117,9 @@ class MockKotlinClassifier(override val fqName: FqName, override val lightClassOriginKind get() = LightClassOriginKind.SOURCE + override val virtualFile: VirtualFile? + get() = null + override val methods: Collection get() = throw UnsupportedOperationException("Should not be called") @@ -132,6 +138,8 @@ class MockKotlinClassifier(override val fqName: FqName, override val isDeprecatedInJavaDoc: Boolean get() = throw UnsupportedOperationException("Should not be called") + override fun isFromSourceCodeInScope(scope: SearchScope) = true + override fun findAnnotation(fqName: FqName) = throw UnsupportedOperationException("Should not be called") diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt index 5dbb2c51fa7..45ef3e17016 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/symbols/SymbolBasedClass.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.javac.wrappers.symbols import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.CommonClassNames +import com.intellij.psi.search.SearchScope import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.load.java.structure.* @@ -116,6 +117,8 @@ class SymbolBasedClass( file?.let { javac.toVirtualFile(it) } } + override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = false + override fun findInnerClass(name: Name) = innerClasses[name] } diff --git a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt index a3f9b4f63b5..153fe189ee2 100644 --- a/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt +++ b/compiler/javac-wrapper/src/org/jetbrains/kotlin/javac/wrappers/trees/TreeBasedClass.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.javac.wrappers.trees import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.search.SearchScope import com.sun.source.tree.Tree import com.sun.source.util.TreePath import com.sun.tools.javac.code.Flags @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities.PUBLIC import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.load.java.structure.* +import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import javax.tools.JavaFileObject @@ -35,7 +37,7 @@ class TreeBasedClass( treePath: TreePath, javac: JavacWrapper, val file: JavaFileObject -) : TreeBasedElement(tree, treePath, javac), JavaClass { +) : TreeBasedElement(tree, treePath, javac), VirtualFileBoundJavaClass { override val name: Name get() = Name.identifier(tree.simpleName.toString()) @@ -144,10 +146,12 @@ class TreeBasedClass( override val innerClassNames: Collection get() = innerClasses.keys - val virtualFile: VirtualFile? by lazy { + override val virtualFile: VirtualFile? by lazy { javac.toVirtualFile(file) } + override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = true + override fun findInnerClass(name: Name) = innerClasses[name] } \ No newline at end of file