Introduce isFromSourceCodeInScope function

See `VirtualFileBoundJavaClass` interface
This commit is contained in:
baratynskiy
2017-05-15 12:48:04 +03:00
committed by Mikhail Glukhikh
parent 91412b0ee9
commit eb85e9f5f3
7 changed files with 29 additions and 8 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiTypeParameter import com.intellij.psi.PsiTypeParameter
import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.asJava.KtLightClassMarker
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
@@ -113,6 +114,8 @@ class JavaClassImpl(psiClass: PsiClass) : JavaClassifierImpl<PsiClass>(psiClass)
override val virtualFile: VirtualFile? override val virtualFile: VirtualFile?
get() = psi.containingFile?.virtualFile get() = psi.containingFile?.virtualFile
override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = psi.containingFile.virtualFile in scope
override fun getAnnotationOwnerPsi() = psi.modifierList override fun getAnnotationOwnerPsi() = psi.modifierList
private fun assertNotLightClass() { private fun assertNotLightClass() {
@@ -17,8 +17,11 @@
package org.jetbrains.kotlin.load.java.structure.impl package org.jetbrains.kotlin.load.java.structure.impl
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
interface VirtualFileBoundJavaClass : JavaClass { interface VirtualFileBoundJavaClass : JavaClass {
val virtualFile: VirtualFile? val virtualFile: VirtualFile?
fun isFromSourceCodeInScope(scope: SearchScope): Boolean
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.structure.impl.classFiles package org.jetbrains.kotlin.load.java.structure.impl.classFiles
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.SearchScope
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
import gnu.trove.THashMap import gnu.trove.THashMap
import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.PrimitiveType
@@ -60,6 +61,8 @@ class BinaryJavaClass(
override val isEnum get() = isSet(Opcodes.ACC_ENUM) override val isEnum get() = isSet(Opcodes.ACC_ENUM)
override val lightClassOriginKind: LightClassOriginKind? get() = null override val lightClassOriginKind: LightClassOriginKind? get() = null
override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = false
override fun visitEnd() { override fun visitEnd() {
methods.trimToSize() methods.trimToSize()
fields.trimToSize() fields.trimToSize()
@@ -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.initJvmBuiltInsForTopDownAnalysis
import org.jetbrains.kotlin.frontend.java.di.initialize import org.jetbrains.kotlin.frontend.java.di.initialize
import org.jetbrains.kotlin.incremental.components.LookupTracker 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.lazy.ModuleClassResolver
import org.jetbrains.kotlin.load.java.structure.JavaClass 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.DeserializationComponentsForJava
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider 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.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.storage.StorageManager 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.* import java.util.*
object TopDownAnalyzerFacadeForJVM { object TopDownAnalyzerFacadeForJVM {
@@ -247,8 +245,7 @@ object TopDownAnalyzerFacadeForJVM {
lateinit var sourceCodeResolver: JavaDescriptorResolver lateinit var sourceCodeResolver: JavaDescriptorResolver
override fun resolveClass(javaClass: JavaClass): ClassDescriptor? { override fun resolveClass(javaClass: JavaClass): ClassDescriptor? {
val resolver = if (javaClass is JavaClassImpl && javaClass.psi.containingFile.virtualFile in sourceScope val resolver = if (javaClass is VirtualFileBoundJavaClass && javaClass.isFromSourceCodeInScope(sourceScope))
|| javaClass is TreeBasedClass || javaClass is MockKotlinClassifier)
sourceCodeResolver sourceCodeResolver
else else
compiledCodeResolver compiledCodeResolver
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.javac 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.descriptors.Visibility
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.load.java.structure.* 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.findInner
import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveByFqName import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveByFqName
import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveInJavaLang import org.jetbrains.kotlin.javac.wrappers.trees.tryToResolveInJavaLang
import org.jetbrains.kotlin.load.java.structure.impl.VirtualFileBoundJavaClass
class KotlinClassifiersCache(sourceFiles: Collection<KtFile>, class KotlinClassifiersCache(sourceFiles: Collection<KtFile>,
private val javac: JavacWrapper) { private val javac: JavacWrapper) {
@@ -58,7 +61,7 @@ class KotlinClassifiersCache(sourceFiles: Collection<KtFile>,
class MockKotlinClassifier(override val fqName: FqName, class MockKotlinClassifier(override val fqName: FqName,
private val classOrObject: KtClassOrObject, private val classOrObject: KtClassOrObject,
val hasTypeParameters: Boolean, val hasTypeParameters: Boolean,
private val javac: JavacWrapper) : JavaClass { private val javac: JavacWrapper) : VirtualFileBoundJavaClass {
override val isAbstract: Boolean override val isAbstract: Boolean
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
@@ -114,6 +117,9 @@ class MockKotlinClassifier(override val fqName: FqName,
override val lightClassOriginKind override val lightClassOriginKind
get() = LightClassOriginKind.SOURCE get() = LightClassOriginKind.SOURCE
override val virtualFile: VirtualFile?
get() = null
override val methods: Collection<JavaMethod> override val methods: Collection<JavaMethod>
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
@@ -132,6 +138,8 @@ class MockKotlinClassifier(override val fqName: FqName,
override val isDeprecatedInJavaDoc: Boolean override val isDeprecatedInJavaDoc: Boolean
get() = throw UnsupportedOperationException("Should not be called") get() = throw UnsupportedOperationException("Should not be called")
override fun isFromSourceCodeInScope(scope: SearchScope) = true
override fun findAnnotation(fqName: FqName) = override fun findAnnotation(fqName: FqName) =
throw UnsupportedOperationException("Should not be called") throw UnsupportedOperationException("Should not be called")
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.javac.wrappers.symbols
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.CommonClassNames import com.intellij.psi.CommonClassNames
import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.structure.* import org.jetbrains.kotlin.load.java.structure.*
@@ -116,6 +117,8 @@ class SymbolBasedClass(
file?.let { javac.toVirtualFile(it) } file?.let { javac.toVirtualFile(it) }
} }
override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = false
override fun findInnerClass(name: Name) = innerClasses[name] override fun findInnerClass(name: Name) = innerClasses[name]
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.javac.wrappers.trees package org.jetbrains.kotlin.javac.wrappers.trees
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.SearchScope
import com.sun.source.tree.Tree import com.sun.source.tree.Tree
import com.sun.source.util.TreePath import com.sun.source.util.TreePath
import com.sun.tools.javac.code.Flags 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.descriptors.Visibility
import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.javac.JavacWrapper
import org.jetbrains.kotlin.load.java.structure.* 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import javax.tools.JavaFileObject import javax.tools.JavaFileObject
@@ -35,7 +37,7 @@ class TreeBasedClass(
treePath: TreePath, treePath: TreePath,
javac: JavacWrapper, javac: JavacWrapper,
val file: JavaFileObject val file: JavaFileObject
) : TreeBasedElement<JCTree.JCClassDecl>(tree, treePath, javac), JavaClass { ) : TreeBasedElement<JCTree.JCClassDecl>(tree, treePath, javac), VirtualFileBoundJavaClass {
override val name: Name override val name: Name
get() = Name.identifier(tree.simpleName.toString()) get() = Name.identifier(tree.simpleName.toString())
@@ -144,10 +146,12 @@ class TreeBasedClass(
override val innerClassNames: Collection<Name> override val innerClassNames: Collection<Name>
get() = innerClasses.keys get() = innerClasses.keys
val virtualFile: VirtualFile? by lazy { override val virtualFile: VirtualFile? by lazy {
javac.toVirtualFile(file) javac.toVirtualFile(file)
} }
override fun isFromSourceCodeInScope(scope: SearchScope): Boolean = true
override fun findInnerClass(name: Name) = innerClasses[name] override fun findInnerClass(name: Name) = innerClasses[name]
} }