java.lang.String in signature should serialized and mapped back to java.lang.String

This commit is contained in:
Stepan Koltsov
2012-01-24 00:38:26 +04:00
parent f21ad2f536
commit 614ee5d690
20 changed files with 82 additions and 20 deletions
@@ -142,7 +142,7 @@ public class BothSignatureWriter {
public void writeAsmType(Type asmType, boolean nullable) { public void writeAsmType(Type asmType, boolean nullable) {
switch (asmType.getSort()) { switch (asmType.getSort()) {
case Type.OBJECT: case Type.OBJECT:
writeClassBegin(asmType.getInternalName(), nullable); writeClassBegin(asmType.getInternalName(), nullable, false);
writeClassEnd(); writeClassEnd();
return; return;
case Type.ARRAY: case Type.ARRAY:
@@ -182,9 +182,9 @@ public class BothSignatureWriter {
} }
} }
public void writeClassBegin(String internalName, boolean nullable) { public void writeClassBegin(String internalName, boolean nullable, boolean real) {
signatureVisitor().visitClassType(internalName); signatureVisitor().visitClassType(internalName);
jetSignatureWriter.visitClassType(internalName, nullable); jetSignatureWriter.visitClassType(internalName, nullable, real);
writeAsmType0(Type.getObjectType(internalName)); writeAsmType0(Type.getObjectType(internalName));
} }
@@ -144,7 +144,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
{ // superclass { // superclass
signatureVisitor.writeSuperclass(); signatureVisitor.writeSuperclass();
if (superClassType == null) { if (superClassType == null) {
signatureVisitor.writeClassBegin(superClass, false); signatureVisitor.writeClassBegin(superClass, false, false);
signatureVisitor.writeClassEnd(); signatureVisitor.writeClassEnd();
} else { } else {
typeMapper.mapType(superClassType, OwnerKind.IMPLEMENTATION, signatureVisitor, true); typeMapper.mapType(superClassType, OwnerKind.IMPLEMENTATION, signatureVisitor, true);
@@ -13,7 +13,9 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.JavaNamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
@@ -160,6 +162,13 @@ public class JetTypeMapper {
return null; return null;
} }
public JvmClassName getClassFQName(ClassDescriptor classDescriptor) {
return JvmClassName.byInternalName(getFQName(classDescriptor));
}
/**
* @return Internal name
*/
public String getFQName(DeclarationDescriptor descriptor) { public String getFQName(DeclarationDescriptor descriptor) {
descriptor = descriptor.getOriginal(); descriptor = descriptor.getOriginal();
@@ -285,6 +294,7 @@ public class JetTypeMapper {
if (descriptor instanceof ClassDescriptor) { if (descriptor instanceof ClassDescriptor) {
Type asmType; Type asmType;
boolean forceReal;
if (standardLibrary.getComparable().equals(descriptor)) { if (standardLibrary.getComparable().equals(descriptor)) {
if (jetType.getArguments().size() != 1) { if (jetType.getArguments().size() != 1) {
@@ -292,13 +302,15 @@ public class JetTypeMapper {
} }
asmType = JL_COMPARABLE_TYPE; asmType = JL_COMPARABLE_TYPE;
forceReal = false;
} else { } else {
String name = getFQName(descriptor); JvmClassName name = getClassFQName((ClassDescriptor) descriptor);
asmType = Type.getObjectType(name + (kind == OwnerKind.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); asmType = Type.getObjectType(name.getInternalName() + (kind == OwnerKind.TRAIT_IMPL ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
forceReal = isForceReal(name);
} }
if (signatureVisitor != null) { if (signatureVisitor != null) {
signatureVisitor.writeClassBegin(asmType.getInternalName(), jetType.isNullable()); signatureVisitor.writeClassBegin(asmType.getInternalName(), jetType.isNullable(), forceReal);
for (TypeProjection proj : jetType.getArguments()) { for (TypeProjection proj : jetType.getArguments()) {
// TODO: +- // TODO: +-
signatureVisitor.writeTypeArgument(proj.getProjectionKind()); signatureVisitor.writeTypeArgument(proj.getProjectionKind());
@@ -790,6 +802,11 @@ public class JetTypeMapper {
knowTypes.put(standardLibrary.getNullablePrimitiveArrayJetType(primitiveType), jvmPrimitiveType.getAsmArrayType()); knowTypes.put(standardLibrary.getNullablePrimitiveArrayJetType(primitiveType), jvmPrimitiveType.getAsmArrayType());
} }
} }
private boolean isForceReal(JvmClassName className) {
return JvmPrimitiveType.getByWrapperClass(className) != null
|| className.getFqName().equals("java.lang.String") || className.getFqName().equals("java.lang.Object");
}
public String isKnownTypeInfo(JetType jetType) { public String isKnownTypeInfo(JetType jetType) {
return knowTypeNames.get(jetType); return knowTypeNames.get(jetType);
@@ -3,7 +3,6 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -73,12 +72,15 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
private List<TypeProjection> typeArguments; private List<TypeProjection> typeArguments;
@Override @Override
public void visitClassType(String name, boolean nullable) { public void visitClassType(String name, boolean nullable, boolean forceReal) {
String ourName = name.replace('/', '.'); String ourName = name.replace('/', '.');
this.classDescriptor = this.javaSemanticServices.getTypeTransformer().getPrimitiveWrappersClassDescriptorMap().get(ourName); this.classDescriptor = null;
if (this.classDescriptor == null && !forceReal) {
this.classDescriptor = this.javaSemanticServices.getTypeTransformer().getPrimitiveWrappersClassDescriptorMap().get(ourName);
}
if (this.classDescriptor == null && ourName.equals("java.lang.Object")) { if (this.classDescriptor == null && ourName.equals("java.lang.Object") && !forceReal) {
this.classDescriptor = JetStandardClasses.getAny(); this.classDescriptor = JetStandardClasses.getAny();
} }
@@ -13,6 +13,12 @@ public class JvmClassName {
public JvmClassName(@NotNull String fqName) { public JvmClassName(@NotNull String fqName) {
this.fqName = fqName; this.fqName = fqName;
} }
public static JvmClassName byInternalName(@NotNull String internalName) {
JvmClassName r = new JvmClassName(internalName.replace('/', '.'));
r.internalName = internalName;
return r;
}
public String getFqName() { public String getFqName() {
return fqName; return fqName;
@@ -108,4 +108,9 @@ public enum JvmPrimitiveType {
public static JvmPrimitiveType getByWrapperAsmType(Type type) { public static JvmPrimitiveType getByWrapperAsmType(Type type) {
return MapByWrapperAsmTypeHolder.map.get(type); return MapByWrapperAsmTypeHolder.map.get(type);
} }
@Nullable
public static JvmPrimitiveType getByWrapperClass(JvmClassName className) {
return getByWrapperAsmType(className.getAsmType());
}
} }
@@ -0,0 +1,3 @@
package test
fun listOfJlString(): java.util.List<java.lang.String> = throw Exception()
@@ -0,0 +1,3 @@
package test
fun integer(): java.lang.Integer = throw Exception()
@@ -0,0 +1,3 @@
package test
fun integerq(): java.lang.Integer? = throw Exception()
@@ -0,0 +1,3 @@
package test
fun obj(): java.lang.Object = throw Exception()
@@ -0,0 +1,3 @@
package test
fun objq(): java.lang.Object? = throw Exception()
@@ -0,0 +1,3 @@
package test
fun fff(): java.lang.String = throw Exception()
@@ -0,0 +1,3 @@
package test
fun fff(): java.lang.String? = null
@@ -0,0 +1,6 @@
fun string(): java.lang.String = throw Exception()
// method: namespace::string
// jvm signature: ()Ljava/lang/String;
// generic signature: null
// kotlin signature: ()Mjava/lang/String;
@@ -167,8 +167,9 @@ class TypeInfoParser {
private List<TypeInfoProjection> projections; private List<TypeInfoProjection> projections;
@Override @Override
public void visitClassType(String name, boolean nullable) { public void visitClassType(String name, boolean nullable, boolean forceReal) {
try { try {
// TODO: real flag
klass = classLoader.loadClass(name.replace('/', '.')); klass = classLoader.loadClass(name.replace('/', '.'));
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new RuntimeException(); throw new RuntimeException();
@@ -64,7 +64,7 @@ public class JetSignatureAdapter implements JetSignatureVisitor {
} }
@Override @Override
public void visitClassType(String name, boolean nullable) { public void visitClassType(String name, boolean nullable, boolean forceReal) {
} }
@Override @Override
@@ -67,7 +67,7 @@ public class JetSignatureExceptionsAdapter implements JetSignatureVisitor {
} }
@Override @Override
public void visitClassType(String name, boolean nullable) { public void visitClassType(String name, boolean nullable, boolean forceReal) {
throw new IllegalStateException(); throw new IllegalStateException();
} }
@@ -149,7 +149,9 @@ public class JetSignatureReader {
v.visitTypeVariable(signature.substring(pos, end), nullable); v.visitTypeVariable(signature.substring(pos, end), nullable);
return end + 1; return end + 1;
default: // case 'L': case 'L':
case 'M':
boolean forceReal = signature.charAt(pos - 1) == 'M';
start = pos; start = pos;
visited = false; visited = false;
inner = false; inner = false;
@@ -162,7 +164,7 @@ public class JetSignatureReader {
if (inner) { if (inner) {
v.visitInnerClassType(name, nullable); v.visitInnerClassType(name, nullable);
} else { } else {
v.visitClassType(name, nullable); v.visitClassType(name, nullable, forceReal);
} }
} }
if (c == ';') { if (c == ';') {
@@ -179,7 +181,7 @@ public class JetSignatureReader {
if (inner) { if (inner) {
v.visitInnerClassType(name, nullable); v.visitInnerClassType(name, nullable);
} else { } else {
v.visitClassType(name, nullable); v.visitClassType(name, nullable, forceReal);
} }
visited = true; visited = true;
top: for (;;) { top: for (;;) {
@@ -205,6 +207,8 @@ public class JetSignatureReader {
} }
} }
} }
default:
throw new IllegalStateException();
} }
} }
@@ -113,7 +113,7 @@ public interface JetSignatureVisitor {
* *
* @param name the internal name of the class or interface. * @param name the internal name of the class or interface.
*/ */
void visitClassType(String name, boolean nullable); void visitClassType(String name, boolean nullable, boolean forceReal);
/** /**
* Visits an inner class. * Visits an inner class.
@@ -145,9 +145,9 @@ public class JetSignatureWriter implements JetSignatureVisitor {
} }
@Override @Override
public void visitClassType(final String name, boolean nullable) { public void visitClassType(final String name, boolean nullable, boolean forceReal) {
visitNullabe(nullable); visitNullabe(nullable);
buf.append('L'); buf.append(forceReal ? 'M' : 'L');
buf.append(name); buf.append(name);
argumentStack *= 2; argumentStack *= 2;
} }