From ded824468a0662c48cf5e0097c39cef34faeee0f Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 11 May 2012 01:08:33 +0400 Subject: [PATCH] replace String with JvmClassName --- .../jetbrains/jet/codegen/ClassFileFactory.java | 2 +- .../org/jetbrains/jet/codegen/CodegenContext.java | 2 +- .../jetbrains/jet/codegen/FunctionCodegen.java | 15 ++++++++------- .../org/jetbrains/jet/codegen/JetTypeMapper.java | 8 ++++---- .../jetbrains/jet/codegen/NamespaceCodegen.java | 10 ++++++---- .../jet/lang/resolve/java/JvmClassName.java | 8 ++++++++ .../jetbrains/jet/codegen/CodegenTestCase.java | 4 ++-- .../org/jetbrains/jet/codegen/StdlibTest.java | 2 +- .../jet/plugin/debugger/JetPositionManager.java | 4 ++-- 9 files changed, 33 insertions(+), 22 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java index fda31b1f7c2..e7d37753ff4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java @@ -64,7 +64,7 @@ public class ClassFileFactory { FqName fqName = JetPsiUtil.getFQName(file); NamespaceCodegen codegen = ns2codegen.get(fqName); if (codegen == null) { - final ClassBuilder builder = newVisitor(NamespaceCodegen.getJVMClassNameForKotlinNs(fqName) + ".class"); + final ClassBuilder builder = newVisitor(NamespaceCodegen.getJVMClassNameForKotlinNs(fqName).getInternalName() + ".class"); codegen = new NamespaceCodegen(builder, fqName, state, file.getContainingFile()); ns2codegen.put(fqName, codegen); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java index 869438c59eb..c6c77561c07 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java @@ -113,7 +113,7 @@ public abstract class CodegenContext { while(!(descriptor instanceof NamespaceDescriptor)) { descriptor = descriptor.getContainingDeclaration(); } - return NamespaceCodegen.getJVMClassNameForKotlinNs(DescriptorUtils.getFQName(descriptor).toSafe()); + return NamespaceCodegen.getJVMClassNameForKotlinNs(DescriptorUtils.getFQName(descriptor).toSafe()).getInternalName(); } public OwnerKind getContextKind() { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index cc0fbb584fe..c1fe5b713bd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.objectweb.asm.Label; @@ -331,18 +332,18 @@ public class FunctionCodegen { int flags = ACC_PUBLIC | ACC_SYNTHETIC; // TODO. - String ownerInternalName; + JvmClassName ownerInternalName; if (contextClass instanceof NamespaceDescriptor) { ownerInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(DescriptorUtils.getFQName(contextClass).toSafe()); } else { - ownerInternalName = state.getInjector().getJetTypeMapper().mapType(((ClassDescriptor) contextClass).getDefaultType(), MapTypeMode.IMPL).getInternalName(); + ownerInternalName = JvmClassName.byType(state.getInjector().getJetTypeMapper().mapType(((ClassDescriptor) contextClass).getDefaultType(), MapTypeMode.IMPL)); } String descriptor = jvmSignature.getDescriptor().replace(")","I)"); boolean isConstructor = "".equals(jvmSignature.getName()); if(!isStatic && !isConstructor) - descriptor = descriptor.replace("(","(L" + ownerInternalName + ";"); + descriptor = descriptor.replace("(", "(" + ownerInternalName.getDescriptor()); final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC), isConstructor ? "" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, descriptor, null, null); InstructionAdapter iv = new InstructionAdapter(mv); if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { @@ -425,17 +426,17 @@ public class FunctionCodegen { if(!isStatic) { if(kind == OwnerKind.TRAIT_IMPL) { - iv.invokeinterface(ownerInternalName, jvmSignature.getName(), jvmSignature.getDescriptor()); + iv.invokeinterface(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor()); } else { if(!isConstructor) - iv.invokevirtual(ownerInternalName, jvmSignature.getName(), jvmSignature.getDescriptor()); + iv.invokevirtual(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor()); else - iv.invokespecial(ownerInternalName, jvmSignature.getName(), jvmSignature.getDescriptor()); + iv.invokespecial(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor()); } } else { - iv.invokestatic(ownerInternalName, jvmSignature.getName(), jvmSignature.getDescriptor()); + iv.invokestatic(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor()); } iv.areturn(jvmSignature.getReturnType()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index d5998ebd435..8fa866ed2ef 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -149,7 +149,7 @@ public class JetTypeMapper { String owner; DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); if (containingDeclaration instanceof NamespaceDescriptor) { - owner = jvmClassNameForNamespace((NamespaceDescriptor) containingDeclaration); + owner = jvmClassNameForNamespace((NamespaceDescriptor) containingDeclaration).getInternalName(); } else if (containingDeclaration instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; @@ -207,7 +207,7 @@ public class JetTypeMapper { } @NotNull - private String jvmClassNameForNamespace(@NotNull NamespaceDescriptor namespace) { + private JvmClassName jvmClassNameForNamespace(@NotNull NamespaceDescriptor namespace) { StringBuilder r = new StringBuilder(); @@ -242,7 +242,7 @@ public class JetTypeMapper { throw new IllegalStateException("internal error: failed to generate classname for " + namespace); } - return r.toString(); + return JvmClassName.byInternalName(r.toString()); } @NotNull public Type mapReturnType(@NotNull final JetType jetType) { @@ -541,7 +541,7 @@ public class JetTypeMapper { ClassDescriptor thisClass; if (functionParent instanceof NamespaceDescriptor) { assert !superCall; - owner = jvmClassNameForNamespace((NamespaceDescriptor) functionParent); + owner = jvmClassNameForNamespace((NamespaceDescriptor) functionParent).getInternalName(); ownerForDefaultImpl = ownerForDefaultParam = owner; invokeOpcode = INVOKESTATIC; thisClass = null; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 8b2e218742e..b1b4f7c6251 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; @@ -44,7 +45,7 @@ public class NamespaceCodegen { v.defineClass(sourceFile, V1_6, ACC_PUBLIC/*|ACC_SUPER*/, - getJVMClassNameForKotlinNs(fqName), + getJVMClassNameForKotlinNs(fqName).getInternalName(), null, //"jet/lang/Namespace", "java/lang/Object", @@ -137,9 +138,10 @@ public class NamespaceCodegen { v.done(); } - public static String getJVMClassNameForKotlinNs(@NotNull FqName fqName) { + @NotNull + public static JvmClassName getJVMClassNameForKotlinNs(@NotNull FqName fqName) { if (fqName.isRoot()) { - return JvmAbi.PACKAGE_CLASS; + return JvmClassName.byInternalName(JvmAbi.PACKAGE_CLASS); } String name = fqName.getFqName().replace('.', '/'); @@ -147,6 +149,6 @@ public class NamespaceCodegen { name = name.substring(JavaDescriptorResolver.JAVA_ROOT.length() + 1, name.length()); } name += "/" + JvmAbi.PACKAGE_CLASS; - return name; + return JvmClassName.byInternalName(name); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java index 4d630efd16f..ba9786826ef 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmClassName.java @@ -42,6 +42,14 @@ public class JvmClassName { return r; } + public static JvmClassName byType(@NotNull Type type) { + if (type.getSort() != Type.OBJECT) { + throw new IllegalArgumentException( + "must be an object to be converted to " + JvmClassName.class.getSimpleName()); + } + return byInternalName(type.getInternalName()); + } + @NotNull public FqName getFqName() { return fqName; diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 8cc7e6a4b01..9127ce36391 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -119,7 +119,7 @@ public abstract class CodegenTestCase extends JetLiteFixture { GeneratedClassLoader loader = createClassLoader(codegens); try { - String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).replace("/", "."); + String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).getFqName().getFqName(); Class namespaceClass = loader.loadClass(fqName); Method method = namespaceClass.getMethod("box"); return (String) method.invoke(null); @@ -163,7 +163,7 @@ public abstract class CodegenTestCase extends JetLiteFixture { } protected Class loadRootNamespaceClass(@NotNull ClassFileFactory state) { - String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).replace("/", "."); + String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).getFqName().getFqName(); try { return createClassLoader(state).loadClass(fqName); } catch (ClassNotFoundException e) { diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index b9e4440a3c0..6333a97ac2a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -146,7 +146,7 @@ public class StdlibTest extends CodegenTestCase { GeneratedClassLoader loader = createClassLoader(codegens); try { - String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).replace("/", "."); + String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile)).getFqName().getFqName(); Class namespaceClass = loader.loadClass(fqName); Method method = namespaceClass.getMethod("box", Method.class); method.setAccessible(true); diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java index 8a6701c4155..5c81d38e28c 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java +++ b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java @@ -137,10 +137,10 @@ public class JetPositionManager implements PositionManager { else { JetFile namespace = PsiTreeUtil.getParentOfType(sourcePosition.getElementAt(), JetFile.class); if (namespace != null) { - names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace))); + names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(namespace)).getInternalName()); } else { - names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(file))); + names.add(NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(file)).getInternalName()); } } }