From 30892e01542641876786f9378ad6579f20730f9a Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 28 Jul 2016 16:46:37 +0300 Subject: [PATCH] KtLightClassForDecompiledDeclaration is now marked by KtLightClassMarker Rename: KtJavaMirrorMarker -> KtLightClassMarker Introduce code to be able to tell light classes from source and binaries apart in 'frontend.java' --- ...{KtJavaMirrorMarker.java => KtLightClassMarker.kt} | 7 +++++-- .../kotlin/load/java/JavaClassFinderImpl.java | 4 ++-- .../load/java/structure/impl/JavaClassImpl.java | 11 ++++++++--- .../classes/FakeLightClassForFileOfPackage.java | 10 ++++++++-- .../jetbrains/kotlin/asJava/classes/KtLightClass.kt | 4 ++-- .../kotlin/asJava/classes/KtLightClassForFacade.kt | 8 +++++--- .../classes/KtLightClassForSourceDeclaration.kt | 7 +++++-- .../java/lazy/descriptors/LazyJavaPackageScope.kt | 3 ++- .../kotlin/load/java/structure/javaElements.kt | 6 +++++- .../kotlin/resolve/jvm/JavaDescriptorResolver.kt | 3 ++- .../load/java/structure/reflect/ReflectJavaClass.kt | 5 +++-- .../resolve/KtLightClassForDecompiledDeclaration.kt | 4 ++++ 12 files changed, 51 insertions(+), 21 deletions(-) rename compiler/frontend.java/src/org/jetbrains/kotlin/asJava/{KtJavaMirrorMarker.java => KtLightClassMarker.kt} (77%) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtJavaMirrorMarker.java b/compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtLightClassMarker.kt similarity index 77% rename from compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtJavaMirrorMarker.java rename to compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtLightClassMarker.kt index e9b6cdef1b9..ac054518235 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtJavaMirrorMarker.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/asJava/KtLightClassMarker.kt @@ -14,7 +14,10 @@ * limitations under the License. */ -package org.jetbrains.kotlin.asJava; +package org.jetbrains.kotlin.asJava -public interface KtJavaMirrorMarker { +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind + +interface KtLightClassMarker { + val originKind: LightClassOriginKind } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java index 222b45bbf98..085ea7a05a8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/JavaClassFinderImpl.java @@ -24,7 +24,7 @@ import com.intellij.psi.search.DelegatingGlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker; +import org.jetbrains.kotlin.asJava.KtLightClassMarker; import org.jetbrains.kotlin.idea.KotlinFileType; import org.jetbrains.kotlin.load.java.structure.JavaClass; import org.jetbrains.kotlin.load.java.structure.JavaPackage; @@ -107,7 +107,7 @@ public class JavaClassFinderImpl implements JavaClassFinder { throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName()); } - if (psiClass instanceof KtJavaMirrorMarker) { + if (psiClass instanceof KtLightClassMarker) { throw new IllegalStateException("Kotlin light classes should not be found by JavaPsiFacade, resolving: " + fqName); } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.java index 84057adc231..29c5569cd81 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassImpl.java @@ -22,7 +22,7 @@ import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker; +import org.jetbrains.kotlin.asJava.KtLightClassMarker; import org.jetbrains.kotlin.descriptors.Visibility; import org.jetbrains.kotlin.load.java.structure.*; import org.jetbrains.kotlin.name.FqName; @@ -154,9 +154,14 @@ public class JavaClassImpl extends JavaClassifierImpl implements JavaC return JavaElementUtil.getVisibility(this); } + @Nullable @Override - public boolean isKotlinLightClass() { - return getPsi() instanceof KtJavaMirrorMarker; + public LightClassOriginKind getLightClassOriginKind() { + PsiClass psiClass = getPsi(); + if (psiClass instanceof KtLightClassMarker) { + return ((KtLightClassMarker) psiClass).getOriginKind(); + } + return null; } @Nullable diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FakeLightClassForFileOfPackage.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FakeLightClassForFileOfPackage.java index fff2a5b1fc4..adaf67bcd59 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FakeLightClassForFileOfPackage.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/FakeLightClassForFileOfPackage.java @@ -23,9 +23,9 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.impl.light.AbstractLightClass; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker; import org.jetbrains.kotlin.asJava.finder.JavaElementFinder; import org.jetbrains.kotlin.idea.KotlinLanguage; +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtFile; @@ -37,7 +37,7 @@ import org.jetbrains.kotlin.psi.KtFile; *

* See {@link LineBreakpoint#findClassCandidatesInSourceContent} for the primary usage this was introduced */ -public class FakeLightClassForFileOfPackage extends AbstractLightClass implements KtLightClass, KtJavaMirrorMarker { +public class FakeLightClassForFileOfPackage extends AbstractLightClass implements KtLightClass { private final KtLightClassForFacade delegate; private final KtFile file; @@ -105,4 +105,10 @@ public class FakeLightClassForFileOfPackage extends AbstractLightClass implement public int hashCode() { return file.hashCode() * 31 + delegate.hashCode(); } + + @NotNull + @Override + public LightClassOriginKind getOriginKind() { + return LightClassOriginKind.SOURCE; + } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClass.kt index aff3fcf4efd..5594fbd06b2 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClass.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.asJava.classes import com.intellij.psi.PsiClass +import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject -interface KtLightClass : PsiClass, KtLightDeclaration +interface KtLightClass : PsiClass, KtLightDeclaration, KtLightClassMarker diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt index 8fd42294491..776e09d0b0b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt @@ -29,7 +29,6 @@ import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.SLRUCache import org.jetbrains.annotations.NonNls -import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.builder.KotlinFacadeLightClassData import org.jetbrains.kotlin.asJava.builder.LightClassDataProviderForFileFacade @@ -37,6 +36,7 @@ import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils.fileHasTopLevelCallables import org.jetbrains.kotlin.name.FqName @@ -52,8 +52,7 @@ class KtLightClassForFacade private constructor( private val facadeClassFqName: FqName, private val lightClassDataCache: CachedValue, files: Collection -) : KtLightClassBase(manager), KtJavaMirrorMarker { - +) : KtLightClassBase(manager) { private data class StubCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope) class FacadeStubCache(private val project: Project) { @@ -264,4 +263,7 @@ class KtLightClassForFacade private constructor( return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file)) } } + + override val originKind: LightClassOriginKind + get() = LightClassOriginKind.SOURCE } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index cbdbfc6df0f..e158e6fff56 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -32,7 +32,6 @@ import com.intellij.psi.util.CachedValuesManager import com.intellij.util.IncorrectOperationException import com.intellij.util.containers.ContainerUtil import org.jetbrains.annotations.NonNls -import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory.getOriginalElement @@ -48,6 +47,7 @@ import org.jetbrains.kotlin.asJava.hasInterfaceDefaultImpls import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.lexer.KtTokens.* +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.platform.JavaToKotlinClassMap @@ -61,7 +61,7 @@ import java.util.* import javax.swing.Icon abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject) -: KtLightClassBase(classOrObject.manager), KtJavaMirrorMarker, StubBasedPsiElement> { +: KtLightClassBase(classOrObject.manager), StubBasedPsiElement> { private val lightIdentifier = KtLightIdentifier(this, classOrObject) private val _extendsList by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -433,4 +433,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC private val LOG = Logger.getInstance(KtLightClassForSourceDeclaration::class.java) } + + override val originKind: LightClassOriginKind + get() = LightClassOriginKind.SOURCE } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt index 33604b7254d..7162e642f82 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaPackageScope.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindEx import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaPackage +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.ClassId @@ -130,7 +131,7 @@ class LazyJavaPackageScope( if (!kindFilter.acceptsKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK)) return listOf() return jPackage.getClasses(nameFilter).mapNotNull { klass -> - if (klass.isKotlinLightClass) null else klass.name + if (klass.lightClassOriginKind == LightClassOriginKind.SOURCE) null else klass.name } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt index a357b9ce868..e10a98855c0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/structure/javaElements.kt @@ -71,13 +71,17 @@ interface JavaClass : JavaClassifier, JavaTypeParameterListOwner, JavaModifierLi val isInterface: Boolean val isAnnotationType: Boolean val isEnum: Boolean - val isKotlinLightClass: Boolean + val lightClassOriginKind: LightClassOriginKind? val methods: Collection val fields: Collection val constructors: Collection } +enum class LightClassOriginKind { + SOURCE, BINARY +} + interface JavaMember : JavaModifierListOwner, JavaAnnotationOwner, JavaNamedElement { val containingClass: JavaClass } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JavaDescriptorResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JavaDescriptorResolver.kt index 6ceab0b3ac8..ca962f13ba7 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JavaDescriptorResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/resolve/jvm/JavaDescriptorResolver.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.components.JavaResolverCache import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider import org.jetbrains.kotlin.load.java.structure.JavaClass +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind class JavaDescriptorResolver( val packageFragmentProvider: LazyJavaPackageFragmentProvider, @@ -28,7 +29,7 @@ class JavaDescriptorResolver( ) { fun resolveClass(javaClass: JavaClass): ClassDescriptor? { val fqName = javaClass.fqName - if (fqName != null && javaClass.isKotlinLightClass) { + if (fqName != null && javaClass.lightClassOriginKind == LightClassOriginKind.SOURCE) { return javaResolverCache.getClassResolvedFromSource(fqName) } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClass.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClass.kt index 65480efaa95..1bde0358b05 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClass.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClass.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.java.structure.reflect import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClassifierType +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import java.lang.reflect.Method @@ -89,8 +90,8 @@ class ReflectJavaClass( .map(::ReflectJavaConstructor) .toList() - override val isKotlinLightClass: Boolean - get() = false + override val lightClassOriginKind: LightClassOriginKind? + get() = null override val name: Name get() = Name.identifier(klass.simpleName) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtLightClassForDecompiledDeclaration.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtLightClassForDecompiledDeclaration.kt index e19da5b4721..3d6480447fc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtLightClassForDecompiledDeclaration.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtLightClassForDecompiledDeclaration.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassBase import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl import org.jetbrains.kotlin.idea.decompiler.classFile.KtClsFile +import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject @@ -62,5 +63,8 @@ class KtLightClassForDecompiledDeclaration( override fun hashCode(): Int = fqName.hashCode() + + override val originKind: LightClassOriginKind + get() = LightClassOriginKind.BINARY }