ReadClassDataTest, working on generics

This commit is contained in:
Stepan Koltsov
2011-12-21 22:28:23 +04:00
parent fea25e629f
commit a50067f6cf
5 changed files with 269 additions and 232 deletions
@@ -134,7 +134,7 @@ public class FunctionCodegen {
av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true); av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true);
} }
if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(i) != null) { if (jvmSignature.getKotlinParameterTypes() != null && jvmSignature.getKotlinParameterTypes().get(i) != null) {
av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_TYPE_FIELD, jvmSignature.getKotlinParameterTypes().get(i)); av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_TYPE_FIELD, jvmSignature.getKotlinParameterTypes().get(i + start));
} }
av.visitEnd(); av.visitEnd();
} }
@@ -662,7 +662,7 @@ public class JavaDescriptorResolver {
} }
JetType outType; JetType outType;
if (typeFromAnnotation != null) { if (typeFromAnnotation != null && typeFromAnnotation.length() > 0) {
outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation); outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation);
} else { } else {
outType = semanticServices.getTypeTransformer().transformToType(psiType); outType = semanticServices.getTypeTransformer().transformToType(psiType);
@@ -858,7 +858,7 @@ public class JavaDescriptorResolver {
} }
} }
JetType transformedType; JetType transformedType;
if (returnTypeFromAnnotation != null) { if (returnTypeFromAnnotation != null && returnTypeFromAnnotation.length() > 0) {
transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation); transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation);
} else { } else {
transformedType = semanticServices.getTypeTransformer().transformToType(returnType); transformedType = semanticServices.getTypeTransformer().transformToType(returnType);
@@ -131,6 +131,12 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
}; };
} }
@Override
public void visitTypeVariable(String name, boolean nullable) {
// TODO: need a way to get type TypeParameterDescriptor by name
throw new IllegalStateException();
}
@Override @Override
public void visitEnd() { public void visitEnd() {
JetType jetType = new JetTypeImpl( JetType jetType = new JetTypeImpl(
@@ -107,6 +107,7 @@ public class ReadClassDataTest extends UsefulTestCase {
jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdk(myTestRootDisposable); jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdk(myTestRootDisposable);
jetCoreEnvironment.addToClasspath(tmpdir); jetCoreEnvironment.addToClasspath(tmpdir);
jetCoreEnvironment.addToClasspath(new File("out/production/stdlib"));
JetSemanticServices jetSemanticServices = JetSemanticServices.createSemanticServices(jetCoreEnvironment.getProject()); JetSemanticServices jetSemanticServices = JetSemanticServices.createSemanticServices(jetCoreEnvironment.getProject());
JavaSemanticServices semanticServices = new JavaSemanticServices(jetCoreEnvironment.getProject(), jetSemanticServices, new BindingTraceContext()); JavaSemanticServices semanticServices = new JavaSemanticServices(jetCoreEnvironment.getProject(), jetSemanticServices, new BindingTraceContext());
@@ -139,28 +140,56 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
private void compareClassifiers(@NotNull ClassifierDescriptor a, @NotNull ClassifierDescriptor b) { private void compareClassifiers(@NotNull ClassifierDescriptor a, @NotNull ClassifierDescriptor b) {
String as = serializeContent((ClassDescriptor) a); StringBuilder sba = new StringBuilder();
String bs = serializeContent((ClassDescriptor) b); StringBuilder sbb = new StringBuilder();
new Serializer(sba).serializeContent((ClassDescriptor) a);
new Serializer(sbb).serializeContent((ClassDescriptor) b);
String as = sba.toString();
String bs = sbb.toString();
Assert.assertEquals(as, bs); Assert.assertEquals(as, bs);
System.out.println(as); System.out.println(as);
} }
private void compareFunctions(@NotNull FunctionDescriptor a, @NotNull FunctionDescriptor b) {
StringBuilder sba = new StringBuilder();
StringBuilder sbb = new StringBuilder();
new Serializer(sba).serialize(a);
new Serializer(sbb).serialize(b);
String as = sba.toString();
String bs = sbb.toString();
Assert.assertEquals(as, bs);
System.out.println(as);
}
private static class Serializer {
protected final StringBuilder sb;
public Serializer(StringBuilder sb) {
this.sb = sb;
}
private String serializeContent(ClassDescriptor klass) { private String serializeContent(ClassDescriptor klass) {
StringBuilder sb = new StringBuilder(); serialize(klass.getModality());
serialize(klass.getModality(), sb);
sb.append(" "); sb.append(" ");
serialize(klass.getKind(), sb); serialize(klass.getKind());
sb.append(" "); sb.append(" ");
serialize(klass, sb); serialize(klass);
if (!klass.getTypeConstructor().getParameters().isEmpty()) { if (!klass.getTypeConstructor().getParameters().isEmpty()) {
sb.append("<"); sb.append("<");
serializeCommaSeparated(klass.getTypeConstructor().getParameters(), sb); serializeCommaSeparated(klass.getTypeConstructor().getParameters());
sb.append(">"); sb.append(">");
} }
@@ -187,7 +216,7 @@ public class ReadClassDataTest extends UsefulTestCase {
continue; continue;
} }
sb.append(" "); sb.append(" ");
serialize(member, sb); new Serializer(sb).serialize(member);
sb.append("\n"); sb.append("\n");
} }
@@ -195,7 +224,7 @@ public class ReadClassDataTest extends UsefulTestCase {
return sb.toString(); return sb.toString();
} }
private void serialize(ClassKind kind, StringBuilder sb) { public void serialize(ClassKind kind) {
switch (kind) { switch (kind) {
case CLASS: case CLASS:
sb.append("class"); sb.append("class");
@@ -209,15 +238,6 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
private void compareFunctions(@NotNull FunctionDescriptor a, @NotNull FunctionDescriptor b) {
String as = serialize(a);
String bs = serialize(b);
Assert.assertEquals(as, bs);
System.out.println(as);
}
private static Object invoke(Method method, Object thiz, Object... args) { private static Object invoke(Method method, Object thiz, Object... args) {
try { try {
return method.invoke(thiz, args); return method.invoke(thiz, args);
@@ -227,34 +247,34 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
private void serialize(FunctionDescriptor fun, StringBuilder sb) { public void serialize(FunctionDescriptor fun) {
serialize(fun.getModality(), sb); serialize(fun.getModality());
sb.append(" "); sb.append(" ");
sb.append("fun "); sb.append("fun ");
if (!fun.getTypeParameters().isEmpty()) { if (!fun.getTypeParameters().isEmpty()) {
sb.append("<"); sb.append("<");
serializeCommaSeparated(fun.getTypeParameters(), sb); serializeCommaSeparated(fun.getTypeParameters());
sb.append(">"); sb.append(">");
} }
if (fun.getReceiverParameter().exists()) { if (fun.getReceiverParameter().exists()) {
serialize(fun.getReceiverParameter(), sb); serialize(fun.getReceiverParameter());
sb.append("."); sb.append(".");
} }
sb.append(fun.getName()); sb.append(fun.getName());
sb.append("("); sb.append("(");
serializeCommaSeparated(fun.getValueParameters(), sb); new ValueParameterSerializer(sb).serializeCommaSeparated(fun.getValueParameters());
sb.append("): "); sb.append("): ");
serialize(fun.getReturnType(), sb); serialize(fun.getReturnType());
} }
private void serialize(ExtensionReceiver extensionReceiver, StringBuilder sb) { public void serialize(ExtensionReceiver extensionReceiver) {
serialize(extensionReceiver.getType(), sb); serialize(extensionReceiver.getType());
} }
private void serialize(PropertyDescriptor prop, StringBuilder sb) { public void serialize(PropertyDescriptor prop) {
if (prop.isVar()) { if (prop.isVar()) {
sb.append("var "); sb.append("var ");
} else { } else {
@@ -262,26 +282,26 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
sb.append(prop.getName()); sb.append(prop.getName());
sb.append(": "); sb.append(": ");
serialize(prop.getOutType(), sb); serialize(prop.getOutType());
} }
private void serialize(ValueParameterDescriptor valueParameter, StringBuilder sb) { public void serialize(ValueParameterDescriptor valueParameter) {
if (valueParameter.getVarargElementType() != null) { if (valueParameter.getVarargElementType() != null) {
sb.append("vararg "); sb.append("vararg ");
} }
sb.append(valueParameter.getName()); sb.append(valueParameter.getName());
sb.append(": "); sb.append(": ");
if (valueParameter.getVarargElementType() != null) { if (valueParameter.getVarargElementType() != null) {
serialize(valueParameter.getVarargElementType(), sb); serialize(valueParameter.getVarargElementType());
} else { } else {
serialize(valueParameter.getOutType(), sb); serialize(valueParameter.getOutType());
} }
if (valueParameter.hasDefaultValue()) { if (valueParameter.hasDefaultValue()) {
sb.append(" = ?"); sb.append(" = ?");
} }
} }
private void serialize(Variance variance, StringBuilder sb) { public void serialize(Variance variance) {
if (variance == Variance.INVARIANT) { if (variance == Variance.INVARIANT) {
} else { } else {
@@ -290,18 +310,18 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
} }
private void serialize(Modality modality, StringBuilder sb) { public void serialize(Modality modality) {
sb.append(modality.name().toLowerCase()); sb.append(modality.name().toLowerCase());
} }
private void serialize(JetType type, StringBuilder sb) { public void serialize(JetType type) {
serialize(type.getConstructor().getDeclarationDescriptor(), sb); serialize(type.getConstructor().getDeclarationDescriptor());
if (!type.getArguments().isEmpty()) { if (!type.getArguments().isEmpty()) {
sb.append("<"); sb.append("<");
boolean first = true; boolean first = true;
for (TypeProjection proj : type.getArguments()) { for (TypeProjection proj : type.getArguments()) {
serialize(proj.getProjectionKind(), sb); serialize(proj.getProjectionKind());
serialize(proj.getType(), sb); serialize(proj.getType());
if (!first) { if (!first) {
sb.append(", "); sb.append(", ");
} }
@@ -311,37 +331,28 @@ public class ReadClassDataTest extends UsefulTestCase {
} }
} }
private String serialize(Object o) { public void serializeCommaSeparated(List<?> list) {
StringBuilder sb = new StringBuilder(); serializeSeparated(list, ", ");
serialize(o, sb);
return sb.toString();
} }
private void serializeCommaSeparated(List<?> list, StringBuilder sb) { public void serializeSeparated(List<?> list, String sep) {
serializeSeparated(list, sb, ", ");
}
private void serializeSeparated(List<?> list, StringBuilder sb, String sep) {
boolean first = true; boolean first = true;
for (Object o : list) { for (Object o : list) {
if (!first) { if (!first) {
sb.append(sep); sb.append(sep);
} }
serialize(o, sb); serialize(o);
first = false; first = false;
} }
} }
private Method getMethodToSerialize(Object o) { private Method getMethodToSerialize(Object o) {
// TODO: cache // TODO: cache
for (Method method : ReadClassDataTest.class.getDeclaredMethods()) { for (Method method : this.getClass().getMethods()) {
if (!method.getName().equals("serialize")) { if (!method.getName().equals("serialize")) {
continue; continue;
} }
if (method.getParameterTypes().length != 2) { if (method.getParameterTypes().length != 1) {
continue;
}
if (!method.getParameterTypes()[1].equals(StringBuilder.class)) {
continue; continue;
} }
if (method.getParameterTypes()[0].equals(Object.class)) { if (method.getParameterTypes()[0].equals(Object.class)) {
@@ -355,50 +366,66 @@ public class ReadClassDataTest extends UsefulTestCase {
throw new IllegalStateException("don't know how to serialize " + o + " (of " + o.getClass() + ")"); throw new IllegalStateException("don't know how to serialize " + o + " (of " + o.getClass() + ")");
} }
private void serialize(Object o, StringBuilder sb) { public void serialize(Object o) {
Method method = getMethodToSerialize(o); Method method = getMethodToSerialize(o);
invoke(method, this, o, sb); invoke(method, this, o);
} }
private void serialize(String s, StringBuilder sb) { public void serialize(String s) {
sb.append(s); sb.append(s);
} }
private void serialize(ModuleDescriptor module, StringBuilder sb) { public void serialize(ModuleDescriptor module) {
// nop // nop
} }
private void serialize(ClassDescriptor clazz, StringBuilder sb) { public void serialize(ClassDescriptor clazz) {
serialize(clazz.getContainingDeclaration(), sb); serialize(clazz.getContainingDeclaration());
sb.append("."); sb.append(".");
sb.append(clazz.getName()); sb.append(clazz.getName());
} }
private void serialize(NamespaceDescriptor ns, StringBuilder sb) { public void serialize(NamespaceDescriptor ns) {
if (ns.getContainingDeclaration() == null) { if (ns.getContainingDeclaration() == null) {
// root ns // root ns
return; return;
} }
serialize(ns.getContainingDeclaration(), sb); serialize(ns.getContainingDeclaration());
sb.append("."); sb.append(".");
sb.append(ns.getName()); sb.append(ns.getName());
} }
private void serialize(TypeParameterDescriptor param, StringBuilder sb) { public void serialize(TypeParameterDescriptor param) {
serialize(param.getVariance(), sb); serialize(param.getVariance());
sb.append(param.getName()); sb.append(param.getName());
if (!param.getUpperBounds().isEmpty()) { if (!param.getUpperBounds().isEmpty()) {
sb.append(" : "); sb.append(" : ");
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
for (JetType upper : param.getUpperBounds()) { for (JetType upper : param.getUpperBounds()) {
list.add(serialize(upper)); StringBuilder sb = new StringBuilder();
new Serializer(sb).serialize(upper);
list.add(sb.toString());
} }
Collections.sort(list); Collections.sort(list);
serializeSeparated(list, sb, " & "); // TODO: use where serializeSeparated(list, " & "); // TODO: use where
} }
// TODO: lower bounds // TODO: lower bounds
} }
}
private static class ValueParameterSerializer extends Serializer {
public ValueParameterSerializer(StringBuilder sb) {
super(sb);
}
@Override
public void serialize(TypeParameterDescriptor param) {
sb.append(param.getName());
}
}
public static Test suite() { public static Test suite() {
return JetTestCaseBuilder.suiteForDirectory(JetTestCaseBuilder.getTestDataPathBase(), "/readClass", true, new JetTestCaseBuilder.NamedTestFactory() { return JetTestCaseBuilder.suiteForDirectory(JetTestCaseBuilder.getTestDataPathBase(), "/readClass", true, new JetTestCaseBuilder.NamedTestFactory() {
@@ -107,6 +107,10 @@ public class JetSignatureReader {
int pos, int pos,
final JetSignatureVisitor v) final JetSignatureVisitor v)
{ {
if (signature.length() == 0) {
throw new IllegalStateException();
}
char c; char c;
int start, end; int start, end;
boolean visited, inner; boolean visited, inner;