From fa4f5684371d38fd11838568151b4e4c9d61ddde Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 3 Oct 2013 19:19:50 +0400 Subject: [PATCH] Delete AsmUtil.fqNameByAsmTypeUnsafe, refactor KotlinToJavaTypesMap --- .../org/jetbrains/jet/codegen/AsmUtil.java | 6 --- .../jet/codegen/state/JetTypeMapper.java | 8 ++-- .../jet/cli/jvm/repl/ReplInterpreter.java | 7 +-- .../TypeTransformingVisitor.java | 22 ++++----- .../java/mapping/KotlinToJavaTypesMap.java | 45 +++++++++++-------- .../libraries/JetSourceNavigationHelper.java | 29 +++++------- 6 files changed, 57 insertions(+), 60 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 6af2e904413..567f8ac72b8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -677,12 +677,6 @@ public class AsmUtil { return lastSlash < 0 ? internalName : internalName.substring(lastSlash + 1); } - // WARNING: this method works incorrectly for classes with dollars in their names - @NotNull - public static FqName fqNameByAsmTypeUnsafe(@NotNull Type asmType) { - return JvmClassName.byInternalName(asmType.getInternalName()).getFqName(); - } - @NotNull public static Type asmTypeByFqNameWithoutInnerClasses(@NotNull FqName fqName) { return Type.getObjectType(JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 4c0450cb628..d3d5886d7b8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; +import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -259,9 +260,10 @@ public class JetTypeMapper extends BindingTraceAware { Type known = null; DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); - if (mapBuiltinsToJava) { - if (descriptor instanceof ClassDescriptor) { - known = KotlinToJavaTypesMap.getInstance().getJavaAnalog(jetType); + if (mapBuiltinsToJava && descriptor instanceof ClassDescriptor) { + FqNameUnsafe className = DescriptorUtils.getFQName(descriptor); + if (className.isSafe()) { + known = KotlinToJavaTypesMap.getInstance().getJavaAnalog(className.toSafe(), jetType.isNullable()); } } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java index a32b1f5c26c..32ca193265f 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/repl/ReplInterpreter.java @@ -67,7 +67,7 @@ import java.net.URLClassLoader; import java.util.Collections; import java.util.List; -import static org.jetbrains.jet.codegen.AsmUtil.fqNameByAsmTypeUnsafe; +import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses; public class ReplInterpreter { @@ -184,7 +184,8 @@ public class ReplInterpreter { public LineResult eval(@NotNull String line) { ++lineNumber; - Type scriptClassType = Type.getObjectType("Line" + lineNumber); + FqName scriptFqName = new FqName("Line" + lineNumber); + Type scriptClassType = asmTypeByFqNameWithoutInnerClasses(scriptFqName); StringBuilder fullText = new StringBuilder(); for (String prevLine : previousIncompleteLines) { @@ -239,7 +240,7 @@ public class ReplInterpreter { } try { - Class scriptClass = classLoader.loadClass(fqNameByAsmTypeUnsafe(scriptClassType).asString()); + Class scriptClass = classLoader.loadClass(scriptFqName.asString()); Class[] constructorParams = new Class[earlierLines.size()]; Object[] constructorArgs = new Object[earlierLines.size()]; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java index 10961dbadd9..60581f8bfb5 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.java.kotlinSignature; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.asm4.Type; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; @@ -27,10 +26,10 @@ import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.TypeResolver; -import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap; import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -106,10 +105,11 @@ public class TypeTransformingVisitor extends JetVisitor { TypeConstructor originalTypeConstructor = originalType.getConstructor(); ClassifierDescriptor declarationDescriptor = originalTypeConstructor.getDeclarationDescriptor(); assert declarationDescriptor != null; - String fqName = DescriptorUtils.getFQName(declarationDescriptor).toSafe().asString(); - ClassDescriptor classFromLibrary = getAutoTypeAnalogWithinBuiltins(qualifiedName); - if (!isSameName(qualifiedName, fqName) && classFromLibrary == null) { - throw new AlternativeSignatureMismatchException("Alternative signature type mismatch, expected: %s, actual: %s", qualifiedName, fqName); + FqName originalClassFqName = DescriptorUtils.getFQName(declarationDescriptor).toSafe(); + ClassDescriptor classFromLibrary = getAutoTypeAnalogWithinBuiltins(originalClassFqName, qualifiedName); + if (!isSameName(qualifiedName, originalClassFqName.asString()) && classFromLibrary == null) { + throw new AlternativeSignatureMismatchException("Alternative signature type mismatch, expected: %s, actual: %s", + qualifiedName, originalClassFqName); } TypeConstructor typeConstructor; @@ -206,11 +206,11 @@ public class TypeTransformingVisitor extends JetVisitor { } @Nullable - private ClassDescriptor getAutoTypeAnalogWithinBuiltins(String qualifiedName) { - Type javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(originalType); - if (javaAnalog == null || javaAnalog.getSort() != Type.OBJECT) return null; - Collection descriptors = - JavaToKotlinClassMap.getInstance().mapPlatformClass(JvmClassName.byInternalName(javaAnalog.getInternalName()).getFqName()); + private static ClassDescriptor getAutoTypeAnalogWithinBuiltins(@NotNull FqName originalClassFqName, @NotNull String qualifiedName) { + FqName javaFqName = KotlinToJavaTypesMap.getInstance().getKotlinToJavaFqName(originalClassFqName); + if (javaFqName == null) return null; + + Collection descriptors = JavaToKotlinClassMap.getInstance().mapPlatformClass(javaFqName); for (ClassDescriptor descriptor : descriptors) { String fqName = DescriptorUtils.getFQName(descriptor).asString(); if (isSameName(qualifiedName, fqName)) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/mapping/KotlinToJavaTypesMap.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/mapping/KotlinToJavaTypesMap.java index 9f49453fa0e..04ba23b0b93 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/mapping/KotlinToJavaTypesMap.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/mapping/KotlinToJavaTypesMap.java @@ -20,14 +20,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.asm4.Type; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; -import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.PrimitiveType; @@ -49,6 +47,7 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { private final Map asmTypes = new HashMap(); private final Map asmNullableTypes = new HashMap(); + private final Map kotlinToJavaFqName = new HashMap(); private KotlinToJavaTypesMap() { init(); @@ -64,21 +63,17 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { register(fqName, asmType); - JvmClassName wrapperName = JvmClassName.byFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName()); - registerNullable(fqName, Type.getObjectType(wrapperName.getInternalName())); + FqName wrapperFqName = jvmPrimitiveType.getWrapperFqName(); + registerNullable(fqName, Type.getObjectType(JvmClassName.byFqNameWithoutInnerClasses(wrapperFqName).getInternalName())); + registerFqName(fqName, wrapperFqName); register(builtInsFqName.child(primitiveType.getArrayTypeName()), Type.getType("[" + asmType.getDescriptor())); } } @Nullable - public Type getJavaAnalog(@NotNull JetType jetType) { - ClassifierDescriptor classifier = jetType.getConstructor().getDeclarationDescriptor(); - assert classifier != null; - FqNameUnsafe className = DescriptorUtils.getFQName(classifier); - if (!className.isSafe()) return null; - FqName fqName = className.toSafe(); - if (jetType.isNullable()) { + public Type getJavaAnalog(@NotNull FqName fqName, boolean isNullable) { + if (isNullable) { Type nullableType = asmNullableTypes.get(fqName); if (nullableType != null) { return nullableType; @@ -87,10 +82,26 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { return asmTypes.get(fqName); } + /** + * E.g. + * jet.Throwable -> java.lang.Throwable + * jet.Deprecated -> java.lang.annotation.Deprecated + * jet.Int -> java.lang.Integer + * jet.IntArray -> null + */ + @Nullable + public FqName getKotlinToJavaFqName(@NotNull FqName fqName) { + return kotlinToJavaFqName.get(fqName); + } + @Override protected void register(@NotNull Class javaClass, @NotNull ClassDescriptor kotlinDescriptor, @NotNull Direction direction) { if (direction == Direction.BOTH || direction == Direction.KOTLIN_TO_JAVA) { - register(kotlinDescriptor, AsmTypeConstants.getType(javaClass)); + FqNameUnsafe fqNameUnsafe = DescriptorUtils.getFQName(kotlinDescriptor); + assert fqNameUnsafe.isSafe() : "FQ name of a mapped class should be safe: " + fqNameUnsafe; + FqName fqName = fqNameUnsafe.toSafe(); + register(fqName, AsmTypeConstants.getType(javaClass)); + registerFqName(fqName, new FqName(javaClass.getCanonicalName())); } } @@ -107,12 +118,6 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { } } - private void register(@NotNull ClassDescriptor kotlinDescriptor, @NotNull Type javaType) { - FqNameUnsafe fqName = DescriptorUtils.getFQName(kotlinDescriptor); - assert fqName.isSafe(); - register(fqName.toSafe(), javaType); - } - private void register(@NotNull FqName fqName, @NotNull Type type) { asmTypes.put(fqName, type); } @@ -120,4 +125,8 @@ public class KotlinToJavaTypesMap extends JavaToKotlinClassMapBuilder { private void registerNullable(@NotNull FqName fqName, @NotNull Type nullableType) { asmNullableTypes.put(fqName, nullableType); } + + private void registerFqName(@NotNull FqName kotlinFqName, @NotNull FqName javaFqName) { + kotlinToJavaFqName.put(kotlinFqName, javaFqName); + } } diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 756cabfe6df..2775e1b591b 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -40,9 +40,7 @@ import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import org.jetbrains.asm4.Type; import org.jetbrains.jet.asJava.LightClassUtil; -import org.jetbrains.jet.codegen.AsmUtil; import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; @@ -50,6 +48,7 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; @@ -57,8 +56,8 @@ import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedLazyResolveStorageManager; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex; @@ -70,7 +69,6 @@ import java.util.Collections; import java.util.List; import java.util.Set; -import static org.jetbrains.jet.codegen.AsmUtil.fqNameByAsmTypeUnsafe; import static org.jetbrains.jet.plugin.libraries.MemberMatching.*; public class JetSourceNavigationHelper { @@ -352,24 +350,17 @@ public class JetSourceNavigationHelper { Name className = classOrObject.getNameAsName(); assert className != null : "Class from BuiltIns should have a name"; ClassDescriptor classDescriptor = KotlinBuiltIns.getInstance().getBuiltInClassByName(className); - Type javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(classDescriptor.getDefaultType()); - if (javaAnalog != null) { - if (AsmUtil.isPrimitive(javaAnalog)) { - javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(TypeUtils.makeNullable(classDescriptor.getDefaultType())); - assert javaAnalog != null : "Java analog should exists for primitive nullable type"; + + FqNameUnsafe fqName = DescriptorUtils.getFQName(classDescriptor); + if (fqName.isSafe()) { + FqName javaFqName = KotlinToJavaTypesMap.getInstance().getKotlinToJavaFqName(fqName.toSafe()); + if (javaFqName != null) { + return JavaPsiFacade.getInstance(classOrObject.getProject()).findClass( + javaFqName.asString(), GlobalSearchScope.allScope(classOrObject.getProject())); } - if (javaAnalog.getSort() != Type.OBJECT) { - return null; - } - String fqName = fqNameByAsmTypeUnsafe(javaAnalog).asString(); - return JavaPsiFacade.getInstance(classOrObject.getProject()). - findClass(fqName, GlobalSearchScope.allScope(classOrObject.getProject())); } } - if (!JetPsiUtil.isLocalClass(classOrObject)) { - return LightClassUtil.getPsiClass(classOrObject); - } - return null; + return JetPsiUtil.isLocalClass(classOrObject) ? null : LightClassUtil.getPsiClass(classOrObject); } @Nullable