Store FqName in LightClassDataForKotlinClass rather than a String

It was also mistakenly named "jvmInternalName" while in fact it was holding the
result of Type#getClassName() which is not an internal name
This commit is contained in:
Alexander Udalov
2014-09-02 18:06:08 +04:00
parent c57441b51b
commit c1125402bd
4 changed files with 25 additions and 21 deletions
@@ -54,7 +54,9 @@ import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
import org.jetbrains.jet.lang.resolve.Diagnostics;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.org.objectweb.asm.Type;
import java.util.Collection;
import java.util.Collections;
@@ -157,12 +159,12 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classOrObject);
if (classDescriptor == null) {
return new OutermostKotlinClassLightClassData(
javaFileStub, extraDiagnostics,
"", classOrObject, null, Collections.<JetClassOrObject, InnerKotlinClassLightClassData>emptyMap()
javaFileStub, extraDiagnostics, FqName.ROOT, classOrObject,
null, Collections.<JetClassOrObject, InnerKotlinClassLightClassData>emptyMap()
);
}
String jvmInternalName = CodegenBinding.getJvmInternalName(bindingContext, classDescriptor);
FqName fqName = predictClassFqName(bindingContext, classDescriptor);
Collection<ClassDescriptor> allInnerClasses = CodegenBinding.getAllInnerClasses(bindingContext, classDescriptor);
Map<JetClassOrObject, InnerKotlinClassLightClassData> innerClassesMap = ContainerUtil.newHashMap();
@@ -171,7 +173,7 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
if (innerClass == null) continue;
InnerKotlinClassLightClassData innerLightClassData = new InnerKotlinClassLightClassData(
CodegenBinding.getJvmInternalName(bindingContext, innerClassDescriptor),
predictClassFqName(bindingContext, innerClassDescriptor),
innerClass,
innerClassDescriptor
);
@@ -182,13 +184,20 @@ public class KotlinJavaFileStubProvider<T extends WithFileStubAndExtraDiagnostic
return new OutermostKotlinClassLightClassData(
javaFileStub,
extraDiagnostics,
jvmInternalName,
fqName,
classOrObject,
classDescriptor,
innerClassesMap
);
}
@NotNull
private FqName predictClassFqName(BindingContext bindingContext, ClassDescriptor classDescriptor) {
Type asmType = CodegenBinding.getAsmType(bindingContext, classDescriptor);
//noinspection ConstantConditions
return JvmClassName.byInternalName(asmType.getClassName().replace('.', '/')).getFqNameForClassNameWithoutDollars();
}
@NotNull
@Override
public Collection<JetFile> getFiles() {
@@ -70,10 +70,8 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
return null;
}
String jvmInternalName = getJvmInternalName(classOrObject);
if (jvmInternalName == null) return null;
FqName fqName = JvmClassName.byInternalName(jvmInternalName).getFqNameForClassNameWithoutDollars();
FqName fqName = predictFqName(classOrObject);
if (fqName == null) return null;
if (classOrObject instanceof JetObjectDeclaration && ((JetObjectDeclaration) classOrObject).isObjectLiteral()) {
return new KotlinLightClassForAnonymousDeclaration(manager, fqName, classOrObject);
@@ -81,12 +79,14 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
return new KotlinLightClassForExplicitDeclaration(manager, fqName, classOrObject);
}
private static String getJvmInternalName(JetClassOrObject classOrObject) {
@Nullable
private static FqName predictFqName(@NotNull JetClassOrObject classOrObject) {
if (classOrObject.isLocal()) {
LightClassDataForKotlinClass data = getLightClassDataExactly(classOrObject);
return data != null ? data.getJvmInternalName() : "";
return data == null ? null : data.getJvmQualifiedName();
}
return PsiCodegenPredictor.getPredefinedJvmInternalName(classOrObject);
String internalName = PsiCodegenPredictor.getPredefinedJvmInternalName(classOrObject);
return internalName == null ? null : JvmClassName.byInternalName(internalName).getFqNameForClassNameWithoutDollars();
}
private final FqName classFqName; // FqName of (possibly inner) class
@@ -19,8 +19,8 @@ package org.jetbrains.jet.asJava
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.psi.JetClassOrObject
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.resolve.Diagnostics
import org.jetbrains.jet.lang.resolve.name.FqName
trait LightClassData
@@ -32,7 +32,7 @@ trait WithFileStubAndExtraDiagnostics {
trait LightClassDataForKotlinClass: LightClassData {
val classOrObject: JetClassOrObject
val descriptor: ClassDescriptor?
val jvmInternalName: String
val jvmQualifiedName: FqName
}
data class KotlinPackageLightClassData(
@@ -41,7 +41,7 @@ data class KotlinPackageLightClassData(
): LightClassData, WithFileStubAndExtraDiagnostics
data class InnerKotlinClassLightClassData(
override val jvmInternalName: String,
override val jvmQualifiedName: FqName,
override val classOrObject: JetClassOrObject,
override val descriptor: ClassDescriptor?
): LightClassDataForKotlinClass
@@ -49,7 +49,7 @@ data class InnerKotlinClassLightClassData(
data class OutermostKotlinClassLightClassData(
override val javaFileStub: PsiJavaFileStub,
override val extraDiagnostics: Diagnostics,
override val jvmInternalName: String,
override val jvmQualifiedName: FqName,
override val classOrObject: JetClassOrObject,
override val descriptor: ClassDescriptor?,
val allInnerClasses: Map<JetClassOrObject, InnerKotlinClassLightClassData>