From 1260ba7a5f13c0d05e55b4257a11338684ff857b Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sun, 11 Dec 2011 23:04:01 +0400 Subject: [PATCH] writing class signature P. S. I'm going to refactor/cleanup code after feature is implemented --- .../codegen/ImplementationBodyCodegen.java | 30 ++++++++++++++++++- .../jetbrains/jet/codegen/JetTypeMapper.java | 4 +-- .../class/Simple.java | 7 +++++ .../compileJavaAgainstKotlin/class/Simple.kt | 1 + 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/compileJavaAgainstKotlin/class/Simple.java create mode 100644 compiler/testData/compileJavaAgainstKotlin/class/Simple.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index e40e22d5a47..312f297acc6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -16,6 +16,9 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.Method; +import org.objectweb.asm.signature.SignatureVisitor; +import org.objectweb.asm.signature.SignatureWriter; +import org.objectweb.asm.util.CheckSignatureAdapter; import java.util.*; @@ -75,7 +78,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ? Opcodes.ACC_INTERFACE : 0/*Opcodes.ACC_SUPER*/), jvmName(), - null, + genericSignature(), superClass, interfaces.toArray(new String[interfaces.size()]) ); @@ -92,6 +95,31 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } + @Nullable + private String genericSignature() { + List typeParameters = descriptor.getTypeConstructor().getParameters(); + + SignatureWriter signatureWriter = new SignatureWriter(); + SignatureVisitor signatureVisitor = JetTypeMapper.DEBUG_SIGNATURE_WRITER + ? new CheckSignatureAdapter(CheckSignatureAdapter.CLASS_SIGNATURE, signatureWriter) + : signatureWriter; + for (TypeParameterDescriptor typeParameter : typeParameters) { + signatureVisitor.visitFormalTypeParameter(typeParameter.getName()); + SignatureVisitor classBoundVisitor = signatureVisitor.visitClassBound(); + // TODO: wrong + JetTypeMapper.visitAsmType(classBoundVisitor, JetTypeMapper.TYPE_OBJECT); + } + SignatureVisitor superclassSignatureVisitor = signatureVisitor.visitSuperclass(); + // TODO: wrong + superclassSignatureVisitor.visitClassType("java/lang/Object"); + // TODO: add interfaces + superclassSignatureVisitor.visitEnd(); + + // TODO: return null if class is not generic and does not have generic superclasses + + return signatureWriter.toString(); + } + private String jvmName() { return typeMapper.mapType(descriptor.getDefaultType(), kind).getInternalName(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index f92f8dc16bc..06b23293f82 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -307,7 +307,7 @@ public class JetTypeMapper { return asmType; } - private void visitAsmType(SignatureVisitor visitor, Type asmType) { + public static void visitAsmType(SignatureVisitor visitor, Type asmType) { switch (asmType.getSort()) { case Type.OBJECT: visitor.visitClassType(asmType.getInternalName()); @@ -379,7 +379,7 @@ public class JetTypeMapper { return asmType; } - private static final boolean DEBUG_SIGNATURE_WRITER = true; + public static final boolean DEBUG_SIGNATURE_WRITER = true; public CallableMethod mapToCallableMethod(FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) { if(functionDescriptor == null) diff --git a/compiler/testData/compileJavaAgainstKotlin/class/Simple.java b/compiler/testData/compileJavaAgainstKotlin/class/Simple.java new file mode 100644 index 00000000000..0a211b69295 --- /dev/null +++ b/compiler/testData/compileJavaAgainstKotlin/class/Simple.java @@ -0,0 +1,7 @@ + +class Simple { + { + jet.typeinfo.TypeInfo blabla = null; + new Impossible(blabla); + } +} diff --git a/compiler/testData/compileJavaAgainstKotlin/class/Simple.kt b/compiler/testData/compileJavaAgainstKotlin/class/Simple.kt new file mode 100644 index 00000000000..854e4e56c6f --- /dev/null +++ b/compiler/testData/compileJavaAgainstKotlin/class/Simple.kt @@ -0,0 +1 @@ +class Impossible

()