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'
This commit is contained in:
Pavel V. Talanov
2016-07-28 16:46:37 +03:00
parent d402a15049
commit 30892e0154
12 changed files with 51 additions and 21 deletions
@@ -14,7 +14,10 @@
* limitations under the License. * 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
} }
@@ -24,7 +24,7 @@ import com.intellij.psi.search.DelegatingGlobalSearchScope;
import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.idea.KotlinFileType;
import org.jetbrains.kotlin.load.java.structure.JavaClass; import org.jetbrains.kotlin.load.java.structure.JavaClass;
import org.jetbrains.kotlin.load.java.structure.JavaPackage; 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()); 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); throw new IllegalStateException("Kotlin light classes should not be found by JavaPsiFacade, resolving: " + fqName);
} }
@@ -22,7 +22,7 @@ import kotlin.collections.CollectionsKt;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.descriptors.Visibility;
import org.jetbrains.kotlin.load.java.structure.*; import org.jetbrains.kotlin.load.java.structure.*;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
@@ -154,9 +154,14 @@ public class JavaClassImpl extends JavaClassifierImpl<PsiClass> implements JavaC
return JavaElementUtil.getVisibility(this); return JavaElementUtil.getVisibility(this);
} }
@Nullable
@Override @Override
public boolean isKotlinLightClass() { public LightClassOriginKind getLightClassOriginKind() {
return getPsi() instanceof KtJavaMirrorMarker; PsiClass psiClass = getPsi();
if (psiClass instanceof KtLightClassMarker) {
return ((KtLightClassMarker) psiClass).getOriginKind();
}
return null;
} }
@Nullable @Nullable
@@ -23,9 +23,9 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.light.AbstractLightClass; import com.intellij.psi.impl.light.AbstractLightClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker;
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder; import org.jetbrains.kotlin.asJava.finder.JavaElementFinder;
import org.jetbrains.kotlin.idea.KotlinLanguage; 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.KtClassOrObject;
import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.psi.KtFile;
@@ -37,7 +37,7 @@ import org.jetbrains.kotlin.psi.KtFile;
* <p/> * <p/>
* See {@link LineBreakpoint#findClassCandidatesInSourceContent} for the primary usage this was introduced * 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 KtLightClassForFacade delegate;
private final KtFile file; private final KtFile file;
@@ -105,4 +105,10 @@ public class FakeLightClassForFileOfPackage extends AbstractLightClass implement
public int hashCode() { public int hashCode() {
return file.hashCode() * 31 + delegate.hashCode(); return file.hashCode() * 31 + delegate.hashCode();
} }
@NotNull
@Override
public LightClassOriginKind getOriginKind() {
return LightClassOriginKind.SOURCE;
}
} }
@@ -17,8 +17,8 @@
package org.jetbrains.kotlin.asJava.classes package org.jetbrains.kotlin.asJava.classes
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.asJava.KtLightClassMarker
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
interface KtLightClass : PsiClass, KtLightDeclaration<KtClassOrObject, PsiClass> interface KtLightClass : PsiClass, KtLightDeclaration<KtClassOrObject, PsiClass>, KtLightClassMarker
@@ -29,7 +29,6 @@ import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.PsiModificationTracker
import com.intellij.util.containers.SLRUCache import com.intellij.util.containers.SLRUCache
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.builder.KotlinFacadeLightClassData import org.jetbrains.kotlin.asJava.builder.KotlinFacadeLightClassData
import org.jetbrains.kotlin.asJava.builder.LightClassDataProviderForFileFacade 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.JvmFileClassUtil
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.KotlinLanguage 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
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils.fileHasTopLevelCallables import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils.fileHasTopLevelCallables
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -52,8 +52,7 @@ class KtLightClassForFacade private constructor(
private val facadeClassFqName: FqName, private val facadeClassFqName: FqName,
private val lightClassDataCache: CachedValue<KotlinFacadeLightClassData>, private val lightClassDataCache: CachedValue<KotlinFacadeLightClassData>,
files: Collection<KtFile> files: Collection<KtFile>
) : KtLightClassBase(manager), KtJavaMirrorMarker { ) : KtLightClassBase(manager) {
private data class StubCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope) private data class StubCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope)
class FacadeStubCache(private val project: Project) { class FacadeStubCache(private val project: Project) {
@@ -264,4 +263,7 @@ class KtLightClassForFacade private constructor(
return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file)) return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file))
} }
} }
override val originKind: LightClassOriginKind
get() = LightClassOriginKind.SOURCE
} }
@@ -32,7 +32,6 @@ import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.ContainerUtil
import org.jetbrains.annotations.NonNls import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.KtJavaMirrorMarker
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory.getOriginalElement 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.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.lexer.KtTokens.* 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.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
@@ -61,7 +61,7 @@ import java.util.*
import javax.swing.Icon import javax.swing.Icon
abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject) abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject)
: KtLightClassBase(classOrObject.manager), KtJavaMirrorMarker, StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> { : KtLightClassBase(classOrObject.manager), StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
private val lightIdentifier = KtLightIdentifier(this, classOrObject) private val lightIdentifier = KtLightIdentifier(this, classOrObject)
private val _extendsList by lazy(LazyThreadSafetyMode.PUBLICATION) { 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) private val LOG = Logger.getInstance(KtLightClassForSourceDeclaration::class.java)
} }
override val originKind: LightClassOriginKind
get() = LightClassOriginKind.SOURCE
} }
@@ -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.lazy.LazyJavaResolverContext
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaPackage 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.KotlinJvmBinaryClass
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -130,7 +131,7 @@ class LazyJavaPackageScope(
if (!kindFilter.acceptsKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK)) return listOf() if (!kindFilter.acceptsKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK)) return listOf()
return jPackage.getClasses(nameFilter).mapNotNull { klass -> return jPackage.getClasses(nameFilter).mapNotNull { klass ->
if (klass.isKotlinLightClass) null else klass.name if (klass.lightClassOriginKind == LightClassOriginKind.SOURCE) null else klass.name
} }
} }
@@ -71,13 +71,17 @@ interface JavaClass : JavaClassifier, JavaTypeParameterListOwner, JavaModifierLi
val isInterface: Boolean val isInterface: Boolean
val isAnnotationType: Boolean val isAnnotationType: Boolean
val isEnum: Boolean val isEnum: Boolean
val isKotlinLightClass: Boolean val lightClassOriginKind: LightClassOriginKind?
val methods: Collection<JavaMethod> val methods: Collection<JavaMethod>
val fields: Collection<JavaField> val fields: Collection<JavaField>
val constructors: Collection<JavaConstructor> val constructors: Collection<JavaConstructor>
} }
enum class LightClassOriginKind {
SOURCE, BINARY
}
interface JavaMember : JavaModifierListOwner, JavaAnnotationOwner, JavaNamedElement { interface JavaMember : JavaModifierListOwner, JavaAnnotationOwner, JavaNamedElement {
val containingClass: JavaClass val containingClass: JavaClass
} }
@@ -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.components.JavaResolverCache
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
class JavaDescriptorResolver( class JavaDescriptorResolver(
val packageFragmentProvider: LazyJavaPackageFragmentProvider, val packageFragmentProvider: LazyJavaPackageFragmentProvider,
@@ -28,7 +29,7 @@ class JavaDescriptorResolver(
) { ) {
fun resolveClass(javaClass: JavaClass): ClassDescriptor? { fun resolveClass(javaClass: JavaClass): ClassDescriptor? {
val fqName = javaClass.fqName val fqName = javaClass.fqName
if (fqName != null && javaClass.isKotlinLightClass) { if (fqName != null && javaClass.lightClassOriginKind == LightClassOriginKind.SOURCE) {
return javaResolverCache.getClassResolvedFromSource(fqName) return javaResolverCache.getClassResolvedFromSource(fqName)
} }
@@ -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.JavaClass
import org.jetbrains.kotlin.load.java.structure.JavaClassifierType 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.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import java.lang.reflect.Method import java.lang.reflect.Method
@@ -89,8 +90,8 @@ class ReflectJavaClass(
.map(::ReflectJavaConstructor) .map(::ReflectJavaConstructor)
.toList() .toList()
override val isKotlinLightClass: Boolean override val lightClassOriginKind: LightClassOriginKind?
get() = false get() = null
override val name: Name override val name: Name
get() = Name.identifier(klass.simpleName) get() = Name.identifier(klass.simpleName)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassBase
import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl
import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl
import org.jetbrains.kotlin.idea.decompiler.classFile.KtClsFile 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.name.FqName
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -62,5 +63,8 @@ class KtLightClassForDecompiledDeclaration(
override fun hashCode(): Int = override fun hashCode(): Int =
fqName.hashCode() fqName.hashCode()
override val originKind: LightClassOriginKind
get() = LightClassOriginKind.BINARY
} }