Make ClassId's relative class name FqName instead of FqNameUnsafe

It was FqNameUnsafe in times when there were classes without identifier names,
specifically class objects with names like '<class-object-for-...>'
This commit is contained in:
Alexander Udalov
2015-03-18 18:20:09 +03:00
parent 31554b9fa3
commit 9a041136f2
15 changed files with 94 additions and 112 deletions
@@ -37,7 +37,7 @@ import org.jetbrains.kotlin.load.kotlin.PackageClassUtils;
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils;
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder; import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqNameUnsafe; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
@@ -150,7 +150,7 @@ public class InlineCodegenUtil {
@NotNull @NotNull
public static VirtualFile getVirtualFileForCallable(@NotNull ClassId containerClassId, @NotNull GenerationState state) { public static VirtualFile getVirtualFileForCallable(@NotNull ClassId containerClassId, @NotNull GenerationState state) {
VirtualFileFinder fileFinder = VirtualFileFinder.SERVICE.getInstance(state.getProject()); VirtualFileFinder fileFinder = VirtualFileFinder.SERVICE.getInstance(state.getProject());
VirtualFile file = fileFinder.findVirtualFileWithHeader(containerClassId.asSingleFqName().toSafe()); VirtualFile file = fileFinder.findVirtualFileWithHeader(containerClassId.asSingleFqName());
if (file == null) { if (file == null) {
throw new IllegalStateException("Couldn't find declaration file for " + containerClassId); throw new IllegalStateException("Couldn't find declaration file for " + containerClassId);
} }
@@ -193,7 +193,7 @@ public class InlineCodegenUtil {
if (containerDescriptor instanceof ClassDescriptor) { if (containerDescriptor instanceof ClassDescriptor) {
ClassId classId = DescriptorUtilPackage.getClassId((ClassDescriptor) containerDescriptor); ClassId classId = DescriptorUtilPackage.getClassId((ClassDescriptor) containerDescriptor);
if (isTrait(containerDescriptor)) { if (isTrait(containerDescriptor)) {
FqNameUnsafe relativeClassName = classId.getRelativeClassName(); FqName relativeClassName = classId.getRelativeClassName();
//TODO test nested trait fun inlining //TODO test nested trait fun inlining
classId = new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.TRAIT_IMPL_SUFFIX)); classId = new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.TRAIT_IMPL_SUFFIX));
} }
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl;
import org.jetbrains.kotlin.load.java.structure.impl.JavaPackageImpl; import org.jetbrains.kotlin.load.java.structure.impl.JavaPackageImpl;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.resolve.jvm.JavaClassFinderPostConstruct; import org.jetbrains.kotlin.resolve.jvm.JavaClassFinderPostConstruct;
import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade; import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade;
@@ -87,14 +86,14 @@ public class JavaClassFinderImpl implements JavaClassFinder {
@Nullable @Nullable
@Override @Override
public JavaClass findClass(@NotNull ClassId classId) { public JavaClass findClass(@NotNull ClassId classId) {
FqNameUnsafe fqName = classId.asSingleFqName(); FqName fqName = classId.asSingleFqName();
PsiClass psiClass = javaFacade.findClass(fqName.asString(), javaSearchScope); PsiClass psiClass = javaFacade.findClass(fqName.asString(), javaSearchScope);
if (psiClass == null) return null; if (psiClass == null) return null;
JavaClassImpl javaClass = new JavaClassImpl(psiClass); JavaClassImpl javaClass = new JavaClassImpl(psiClass);
if (!fqName.equalsTo(javaClass.getFqName())) { if (!fqName.equals(javaClass.getFqName())) {
throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName()); throw new IllegalStateException("Requested " + fqName + ", got " + javaClass.getFqName());
} }
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader;
import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor; import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.org.objectweb.asm.ClassReader; import org.jetbrains.org.objectweb.asm.ClassReader;
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.ClassVisitor;
@@ -288,7 +287,7 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
Collections.reverse(classes); Collections.reverse(classes);
FqName packageFqName = outermostClassFqName.parent(); FqName packageFqName = outermostClassFqName.parent();
FqNameUnsafe relativeClassName = FqNameUnsafe.fromSegments(classes); FqName relativeClassName = FqName.fromSegments(classes);
return new ClassId(packageFqName, relativeClassName, local); return new ClassId(packageFqName, relativeClassName, local);
} }
@@ -18,12 +18,12 @@ package org.jetbrains.kotlin.load.kotlin
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.java.structure.impl.JavaClassImpl
import org.jetbrains.kotlin.utils.sure
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.utils.sure
public abstract class VirtualFileKotlinClassFinder : VirtualFileFinder { public abstract class VirtualFileKotlinClassFinder : VirtualFileFinder {
override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? {
val file = findVirtualFileWithHeader(classId.asSingleFqName().toSafe()) ?: return null val file = findVirtualFileWithHeader(classId.asSingleFqName()) ?: return null
return KotlinBinaryClassCache.getKotlinBinaryClass(file) return KotlinBinaryClassCache.getKotlinBinaryClass(file)
} }
@@ -16,27 +16,31 @@
package org.jetbrains.kotlin.resolve package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.TypeLazinessToken
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo
import org.jetbrains.kotlin.psi.debugText.getDebugText
import org.jetbrains.kotlin.resolve.PossiblyBareType.type
import org.jetbrains.kotlin.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
import org.jetbrains.kotlin.resolve.lazy.LazyEntity
import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.resolve.scopes.JetScope
import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.resolve.PossiblyBareType.type
import org.jetbrains.kotlin.types.Variance.*
import org.jetbrains.kotlin.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider
import kotlin.platform.platformStatic
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.context.TypeLazinessToken import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.resolve.lazy.LazyEntity import org.jetbrains.kotlin.types.Variance.INVARIANT
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil import org.jetbrains.kotlin.types.Variance.IN_VARIANCE
import org.jetbrains.kotlin.types.Variance.OUT_VARIANCE
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.psi.debugText.getDebugText import kotlin.platform.platformStatic
import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo
public class TypeResolver( public class TypeResolver(
private val annotationResolver: AnnotationResolver, private val annotationResolver: AnnotationResolver,
@@ -175,7 +179,7 @@ public class TypeResolver(
result = type(ErrorUtils.createErrorTypeWithArguments("" + typeConstructor, arguments)) result = type(ErrorUtils.createErrorTypeWithArguments("" + typeConstructor, arguments))
} }
else { else {
if (Flexibility.FLEXIBLE_TYPE_CLASSIFIER.asSingleFqName() == DescriptorUtils.getFqName(classifierDescriptor) if (Flexibility.FLEXIBLE_TYPE_CLASSIFIER.asSingleFqName().toUnsafe() == DescriptorUtils.getFqName(classifierDescriptor)
&& classifierDescriptor.getTypeConstructor().getParameters().size() == 2) { && classifierDescriptor.getTypeConstructor().getParameters().size() == 2) {
// We create flexible types by convention here // We create flexible types by convention here
// This is not intended to be used in normal users' environments, only for tests and debugger etc // This is not intended to be used in normal users' environments, only for tests and debugger etc
@@ -16,25 +16,26 @@
package org.jetbrains.kotlin.load.java.lazy.descriptors package org.jetbrains.kotlin.load.java.lazy.descriptors
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.resolve.constants.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.* import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.isSpecialAnnotation
import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils
import org.jetbrains.kotlin.load.java.components.TypeUsage import org.jetbrains.kotlin.load.java.components.TypeUsage
import org.jetbrains.kotlin.utils.valuesToMap import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext
import org.jetbrains.kotlin.utils.keysToMapExceptNulls
import org.jetbrains.kotlin.load.java.lazy.types.toAttributes import org.jetbrains.kotlin.load.java.lazy.types.toAttributes
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.load.java.structure.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.constants.*
import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.resolve.jvm.PLATFORM_TYPES import org.jetbrains.kotlin.resolve.jvm.PLATFORM_TYPES
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.utils.keysToMapExceptNulls
import org.jetbrains.kotlin.utils.valuesToMap
private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument { private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument {
override val name: Name? = null override val name: Name? = null
@@ -49,13 +50,11 @@ fun LazyJavaResolverContext.resolveAnnotation(annotation: JavaAnnotation): LazyJ
class LazyJavaAnnotationDescriptor( class LazyJavaAnnotationDescriptor(
private val c: LazyJavaResolverContext, private val c: LazyJavaResolverContext,
val javaAnnotation : JavaAnnotation val javaAnnotation: JavaAnnotation
) : AnnotationDescriptor { ) : AnnotationDescriptor {
private val fqName = c.storageManager.createNullableLazyValue { private val fqName = c.storageManager.createNullableLazyValue {
javaAnnotation.getClassId().asSingleFqName().let { javaAnnotation.getClassId()?.asSingleFqName()
if (it.isSafe()) it.toSafe() else null
}
} }
private val type = c.storageManager.createLazyValue {(): JetType -> private val type = c.storageManager.createLazyValue {(): JetType ->
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.load.java.JavaVisibilities import org.jetbrains.kotlin.load.java.JavaVisibilities
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import java.lang.reflect.Array import java.lang.reflect.Array
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
@@ -43,7 +42,7 @@ public fun Class<*>.isEnumClassOrSpecializedEnumEntryClass(): Boolean =
javaClass<Enum<*>>().isAssignableFrom(this) javaClass<Enum<*>>().isAssignableFrom(this)
public val Class<*>.fqName: FqName public val Class<*>.fqName: FqName
get() = classId.asSingleFqName().toSafe() get() = classId.asSingleFqName()
public val Class<*>.classId: ClassId public val Class<*>.classId: ClassId
get() = when { get() = when {
@@ -51,7 +50,7 @@ public val Class<*>.classId: ClassId
isArray() -> throw IllegalArgumentException("Can't compute ClassId for array type: $this") isArray() -> throw IllegalArgumentException("Can't compute ClassId for array type: $this")
getEnclosingMethod() != null, getEnclosingConstructor() != null, getSimpleName().isEmpty() -> { getEnclosingMethod() != null, getEnclosingConstructor() != null, getSimpleName().isEmpty() -> {
val fqName = FqName(getName()) val fqName = FqName(getName())
ClassId(fqName.parent(), FqNameUnsafe.topLevel(fqName.shortName()), /* local = */ true) ClassId(fqName.parent(), FqName.topLevel(fqName.shortName()), /* local = */ true)
} }
else -> getDeclaringClass()?.classId?.createNestedClassId(Name.identifier(getSimpleName())) ?: ClassId.topLevel(FqName(getName())) else -> getDeclaringClass()?.classId?.createNestedClassId(Name.identifier(getSimpleName())) ?: ClassId.topLevel(FqName(getName()))
} }
@@ -34,10 +34,10 @@ public final class ClassId {
} }
private final FqName packageFqName; private final FqName packageFqName;
private final FqNameUnsafe relativeClassName; private final FqName relativeClassName;
private final boolean local; private final boolean local;
public ClassId(@NotNull FqName packageFqName, @NotNull FqNameUnsafe relativeClassName, boolean local) { public ClassId(@NotNull FqName packageFqName, @NotNull FqName relativeClassName, boolean local) {
this.packageFqName = packageFqName; this.packageFqName = packageFqName;
assert !relativeClassName.isRoot() : assert !relativeClassName.isRoot() :
"Class name must not be root: " + packageFqName + (local ? " (local)" : ""); "Class name must not be root: " + packageFqName + (local ? " (local)" : "");
@@ -46,7 +46,7 @@ public final class ClassId {
} }
public ClassId(@NotNull FqName packageFqName, @NotNull Name topLevelName) { public ClassId(@NotNull FqName packageFqName, @NotNull Name topLevelName) {
this(packageFqName, FqNameUnsafe.topLevel(topLevelName), false); this(packageFqName, FqName.topLevel(topLevelName), false);
} }
@NotNull @NotNull
@@ -55,7 +55,7 @@ public final class ClassId {
} }
@NotNull @NotNull
public FqNameUnsafe getRelativeClassName() { public FqName getRelativeClassName() {
return relativeClassName; return relativeClassName;
} }
@@ -83,9 +83,9 @@ public final class ClassId {
} }
@NotNull @NotNull
public FqNameUnsafe asSingleFqName() { public FqName asSingleFqName() {
if (packageFqName.isRoot()) return relativeClassName; if (packageFqName.isRoot()) return relativeClassName;
return new FqNameUnsafe(packageFqName.asString() + "." + relativeClassName.asString()); return new FqName(packageFqName.asString() + "." + relativeClassName.asString());
} }
@Override @Override
@@ -120,7 +120,7 @@ public final class ClassId {
if (lastSlash == -1) { if (lastSlash == -1) {
throw new IllegalArgumentException("Class id should contain slash: " + string); throw new IllegalArgumentException("Class id should contain slash: " + string);
} }
FqNameUnsafe relativeClassName = new FqNameUnsafe(string.substring(lastSlash + 1)); FqName relativeClassName = new FqName(string.substring(lastSlash + 1));
FqName packageFqName = new FqName(string.substring(0, lastSlash).replace('/', '.')); FqName packageFqName = new FqName(string.substring(0, lastSlash).replace('/', '.'));
return new ClassId(packageFqName, relativeClassName, false); return new ClassId(packageFqName, relativeClassName, false);
} }
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.serialization.deserialization;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.FqNameUnsafe;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.serialization.ProtoBuf; import org.jetbrains.kotlin.serialization.ProtoBuf;
@@ -85,7 +84,7 @@ public class NameResolver {
index = proto.getParentQualifiedName(); index = proto.getParentQualifiedName();
} }
return new ClassId(FqName.fromSegments(packageFqName), FqNameUnsafe.fromSegments(relativeClassName), local); return new ClassId(FqName.fromSegments(packageFqName), FqName.fromSegments(relativeClassName), local);
} }
@NotNull @NotNull
@@ -16,19 +16,16 @@
package org.jetbrains.kotlin.serialization.deserialization package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.name.FqNameUnsafe
public data class ProtoContainer(val classProto: ProtoBuf.Class?, val packageFqName: FqName?) { public data class ProtoContainer(val classProto: ProtoBuf.Class?, val packageFqName: FqName?) {
{ init {
assert(classProto != null || packageFqName != null) assert((classProto != null) xor (packageFqName != null))
assert(classProto == null || packageFqName == null)
} }
fun getFqName(nameResolver: NameResolver): FqNameUnsafe { fun getFqName(nameResolver: NameResolver): FqName {
if (packageFqName != null) return packageFqName.toUnsafe() if (packageFqName != null) return packageFqName
return nameResolver.getClassId(classProto!!.getFqName()).asSingleFqName() return nameResolver.getClassId(classProto!!.getFqName()).asSingleFqName()
} }
@@ -61,7 +61,7 @@ private class ClassClsStubBuilder(
}.let { }.let {
supertypeIds -> supertypeIds ->
//empty supertype list if single supertype is Any //empty supertype list if single supertype is Any
if (supertypeIds.singleOrNull()?.let { KotlinBuiltIns.isAny(it.asSingleFqName()) } ?: false) { if (supertypeIds.singleOrNull()?.let { KotlinBuiltIns.isAny(it.asSingleFqName().toUnsafe()) } ?: false) {
listOf() listOf()
} }
else { else {
@@ -108,7 +108,8 @@ private class ClassClsStubBuilder(
val shortName = fqName.shortName().ref() val shortName = fqName.shortName().ref()
val superTypeRefs = supertypeIds.filter { val superTypeRefs = supertypeIds.filter {
//TODO: filtering function types should go away //TODO: filtering function types should go away
!KotlinBuiltIns.isExactFunctionType(it.asSingleFqName()) && !KotlinBuiltIns.isExactExtensionFunctionType(it.asSingleFqName()) !KotlinBuiltIns.isExactFunctionType(it.asSingleFqName().toUnsafe()) &&
!KotlinBuiltIns.isExactExtensionFunctionType(it.asSingleFqName().toUnsafe())
}.map { it.getShortClassName().ref() }.copyToArray() }.map { it.getShortClassName().ref() }.copyToArray()
return when (classKind) { return when (classKind) {
ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.CLASS_OBJECT -> { ProtoBuf.Class.Kind.OBJECT, ProtoBuf.Class.Kind.CLASS_OBJECT -> {
@@ -16,42 +16,27 @@
package org.jetbrains.kotlin.idea.decompiler.stubBuilder package org.jetbrains.kotlin.idea.decompiler.stubBuilder
import com.intellij.psi.stubs.StubElement
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.name.FqName
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.psi.stubs.impl.KotlinPlaceHolderStubImpl import com.intellij.psi.stubs.StubElement
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.psi.stubs.impl.KotlinNameReferenceExpressionStubImpl
import org.jetbrains.kotlin.psi.JetTypeReference
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetParameterList
import org.jetbrains.kotlin.psi.stubs.impl.KotlinParameterStubImpl
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.JetNullableType
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.psi.JetTypeArgumentList
import org.jetbrains.kotlin.psi.stubs.impl.KotlinTypeProjectionStubImpl
import org.jetbrains.kotlin.psi.JetFunctionType
import org.jetbrains.kotlin.psi.JetFunctionTypeReceiver
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
import org.jetbrains.kotlin.psi.JetTypeParameterList
import org.jetbrains.kotlin.serialization.ProtoBuf.Type
import org.jetbrains.kotlin.psi.stubs.impl.KotlinTypeParameterStubImpl
import org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.Variance
import org.jetbrains.kotlin.psi.JetTypeConstraintList
import org.jetbrains.kotlin.psi.stubs.impl.KotlinTypeConstraintStubImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import java.util.ArrayList import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.stubs.impl.KotlinModifierListStubImpl
import org.jetbrains.kotlin.psi.stubs.impl.ModifierMaskUtils
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub
import org.jetbrains.kotlin.psi.stubs.elements.JetStubElementTypes
import org.jetbrains.kotlin.psi.stubs.impl.*
import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable.CallableKind
import org.jetbrains.kotlin.serialization.ProtoBuf.Type
import org.jetbrains.kotlin.serialization.ProtoBuf.Type.Argument.Projection import org.jetbrains.kotlin.serialization.ProtoBuf.Type.Argument.Projection
import org.jetbrains.kotlin.psi.JetProjectionKind import org.jetbrains.kotlin.serialization.ProtoBuf.TypeParameter.Variance
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
import java.util.ArrayList
class TypeClsStubBuilder(private val c: ClsStubBuilderContext) { class TypeClsStubBuilder(private val c: ClsStubBuilderContext) {
@@ -76,7 +61,7 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) {
private fun createClassReferenceTypeStub(parent: StubElement<out PsiElement>, type: Type) { private fun createClassReferenceTypeStub(parent: StubElement<out PsiElement>, type: Type) {
val classId = c.nameResolver.getClassId(type.getConstructor().getId()) val classId = c.nameResolver.getClassId(type.getConstructor().getId())
val fqName = classId.asSingleFqName() val fqName = classId.asSingleFqName().toUnsafe()
val isFunctionType = KotlinBuiltIns.isExactFunctionType(fqName) val isFunctionType = KotlinBuiltIns.isExactFunctionType(fqName)
val isExtensionFunctionType = KotlinBuiltIns.isExactExtensionFunctionType(fqName) val isExtensionFunctionType = KotlinBuiltIns.isExactExtensionFunctionType(fqName)
if (isFunctionType || isExtensionFunctionType) { if (isFunctionType || isExtensionFunctionType) {
@@ -237,6 +222,6 @@ class TypeClsStubBuilder(private val c: ClsStubBuilderContext) {
return false return false
} }
val classId = c.nameResolver.getClassId(constructor.getId()) val classId = c.nameResolver.getClassId(constructor.getId())
return KotlinBuiltIns.isAny(classId.asSingleFqName()) && this.getNullable() return KotlinBuiltIns.isAny(classId.asSingleFqName().toUnsafe()) && this.getNullable()
} }
} }
@@ -175,7 +175,7 @@ fun createAnnotationStubs(annotationIds: List<ClassId>, modifierList: KotlinModi
annotationClassId -> annotationClassId ->
val annotationEntryStubImpl = KotlinAnnotationEntryStubImpl( val annotationEntryStubImpl = KotlinAnnotationEntryStubImpl(
modifierList, modifierList,
shortName = annotationClassId.asSingleFqName().shortName().ref(), shortName = annotationClassId.getShortClassName().ref(),
hasValueArguments = false hasValueArguments = false
) )
val constructorCallee = KotlinPlaceHolderStubImpl<JetConstructorCalleeExpression>(annotationEntryStubImpl, JetStubElementTypes.CONSTRUCTOR_CALLEE) val constructorCallee = KotlinPlaceHolderStubImpl<JetConstructorCalleeExpression>(annotationEntryStubImpl, JetStubElementTypes.CONSTRUCTOR_CALLEE)
@@ -73,7 +73,7 @@ public final class KotlinClassFileIndex extends ScalarIndexExtension<FqName> {
try { try {
KotlinJvmBinaryClass kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(inputData.getFile()); KotlinJvmBinaryClass kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(inputData.getFile());
if (kotlinClass != null && kotlinClass.getClassHeader().getIsCompatibleAbiVersion()) { if (kotlinClass != null && kotlinClass.getClassHeader().getIsCompatibleAbiVersion()) {
return Collections.singletonMap(kotlinClass.getClassId().asSingleFqName().toSafe(), null); return Collections.singletonMap(kotlinClass.getClassId().asSingleFqName(), null);
} }
} }
catch (Throwable e) { catch (Throwable e) {
@@ -16,27 +16,27 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder package org.jetbrains.kotlin.idea.decompiler.textBuilder
import org.jetbrains.kotlin.idea.JetLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.JetWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.name.FqName
import org.junit.Assert
import org.jetbrains.kotlin.idea.PluginTestCaseBase
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.GlobalContext
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.idea.JetLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.idea.JetWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.PluginTestCaseBase
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.BindingTraceContext
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM
import com.intellij.psi.search.GlobalSearchScope import org.junit.Assert
public class DecompiledTextConsistencyTest : JetLightCodeInsightFixtureTestCase() { public class DecompiledTextConsistencyTest : JetLightCodeInsightFixtureTestCase() {
@@ -70,7 +70,7 @@ class ProjectBasedResolverForDecompiler(project: Project) : ResolverForDecompile
} }
override fun resolveTopLevelClass(classId: ClassId): ClassDescriptor? { override fun resolveTopLevelClass(classId: ClassId): ClassDescriptor? {
return module.resolveTopLevelClass(classId.asSingleFqName().toSafe()) return module.resolveTopLevelClass(classId.asSingleFqName())
} }
override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection<DeclarationDescriptor> { override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection<DeclarationDescriptor> {