java.lang.String in signature should serialized and mapped back to java.lang.String
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+6
-4
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user