diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index a1b241edd99..97345407289 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -134,7 +134,7 @@ public class FunctionCodegen { av.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NULLABLE_FIELD, true); } 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(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 549a4b9e0ed..46dd32c5894 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -662,7 +662,7 @@ public class JavaDescriptorResolver { } JetType outType; - if (typeFromAnnotation != null) { + if (typeFromAnnotation != null && typeFromAnnotation.length() > 0) { outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation); } else { outType = semanticServices.getTypeTransformer().transformToType(psiType); @@ -858,7 +858,7 @@ public class JavaDescriptorResolver { } } JetType transformedType; - if (returnTypeFromAnnotation != null) { + if (returnTypeFromAnnotation != null && returnTypeFromAnnotation.length() > 0) { transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation); } else { transformedType = semanticServices.getTypeTransformer().transformToType(returnType); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java index 2984dc9e057..ec5b1b2a7ee 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JetTypeJetSignatureReader.java @@ -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 public void visitEnd() { JetType jetType = new JetTypeImpl( diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index 9714d54f0c3..483903af1de 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -107,6 +107,7 @@ public class ReadClassDataTest extends UsefulTestCase { jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdk(myTestRootDisposable); jetCoreEnvironment.addToClasspath(tmpdir); + jetCoreEnvironment.addToClasspath(new File("out/production/stdlib")); JetSemanticServices jetSemanticServices = JetSemanticServices.createSemanticServices(jetCoreEnvironment.getProject()); JavaSemanticServices semanticServices = new JavaSemanticServices(jetCoreEnvironment.getProject(), jetSemanticServices, new BindingTraceContext()); @@ -139,264 +140,290 @@ public class ReadClassDataTest extends UsefulTestCase { } private void compareClassifiers(@NotNull ClassifierDescriptor a, @NotNull ClassifierDescriptor b) { - String as = serializeContent((ClassDescriptor) a); - String bs = serializeContent((ClassDescriptor) b); + StringBuilder sba = new StringBuilder(); + 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); System.out.println(as); } - private String serializeContent(ClassDescriptor klass) { - - StringBuilder sb = new StringBuilder(); - - serialize(klass.getModality(), sb); - sb.append(" "); - - serialize(klass.getKind(), sb); - sb.append(" "); - - serialize(klass, sb); - - if (!klass.getTypeConstructor().getParameters().isEmpty()) { - sb.append("<"); - serializeCommaSeparated(klass.getTypeConstructor().getParameters(), sb); - sb.append(">"); - } - - // TODO: supers - // TODO: constructors - - sb.append(" {\n"); - - List typeArguments = new ArrayList(); - for (TypeParameterDescriptor param : klass.getTypeConstructor().getParameters()) { - typeArguments.add(new TypeProjection(Variance.INVARIANT, param.getDefaultType())); - } - - JetScope memberScope = klass.getMemberScope(typeArguments); - for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { - // TODO - if (member.getName().equals("equals") || member.getName().equals("hashCode") - || member.getName().equals("wait") || member.getName().equals("notify") || member.getName().equals("notifyAll") - || member.getName().equals("toString") || member.getName().equals("getClass") - || member.getName().equals("clone") || member.getName().equals("finalize") - || member.getName().equals("getTypeInfo") || member.getName().equals("$setTypeInfo") || member.getName().equals("$typeInfo") - ) - { - continue; - } - sb.append(" "); - serialize(member, sb); - sb.append("\n"); - } - - sb.append("}\n"); - return sb.toString(); - } - - private void serialize(ClassKind kind, StringBuilder sb) { - switch (kind) { - case CLASS: - sb.append("class"); - break; - case TRAIT: - sb.append("trait"); - break; - default: - throw new IllegalStateException(); - } - } - - private void compareFunctions(@NotNull FunctionDescriptor a, @NotNull FunctionDescriptor b) { - String as = serialize(a); - String bs = serialize(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 Object invoke(Method method, Object thiz, Object... args) { - try { - return method.invoke(thiz, args); - } catch (Exception e) { - throw new RuntimeException("failed to invoke " + method + ": " + e, e); - } - } - - - private void serialize(FunctionDescriptor fun, StringBuilder sb) { - serialize(fun.getModality(), sb); - sb.append(" "); - sb.append("fun "); - if (!fun.getTypeParameters().isEmpty()) { - sb.append("<"); - serializeCommaSeparated(fun.getTypeParameters(), sb); - sb.append(">"); + + + private static class Serializer { + + protected final StringBuilder sb; + + public Serializer(StringBuilder sb) { + this.sb = sb; } - if (fun.getReceiverParameter().exists()) { - serialize(fun.getReceiverParameter(), sb); - sb.append("."); - } + private String serializeContent(ClassDescriptor klass) { - sb.append(fun.getName()); - sb.append("("); - serializeCommaSeparated(fun.getValueParameters(), sb); - sb.append("): "); - serialize(fun.getReturnType(), sb); - } - - private void serialize(ExtensionReceiver extensionReceiver, StringBuilder sb) { - serialize(extensionReceiver.getType(), sb); - } - - private void serialize(PropertyDescriptor prop, StringBuilder sb) { - if (prop.isVar()) { - sb.append("var "); - } else { - sb.append("val "); - } - sb.append(prop.getName()); - sb.append(": "); - serialize(prop.getOutType(), sb); - } - - private void serialize(ValueParameterDescriptor valueParameter, StringBuilder sb) { - if (valueParameter.getVarargElementType() != null) { - sb.append("vararg "); - } - sb.append(valueParameter.getName()); - sb.append(": "); - if (valueParameter.getVarargElementType() != null) { - serialize(valueParameter.getVarargElementType(), sb); - } else { - serialize(valueParameter.getOutType(), sb); - } - if (valueParameter.hasDefaultValue()) { - sb.append(" = ?"); - } - } - - private void serialize(Variance variance, StringBuilder sb) { - if (variance == Variance.INVARIANT) { + serialize(klass.getModality()); + sb.append(" "); - } else { - sb.append(variance); - sb.append(' '); - } - } - - private void serialize(Modality modality, StringBuilder sb) { - sb.append(modality.name().toLowerCase()); - } - - private void serialize(JetType type, StringBuilder sb) { - serialize(type.getConstructor().getDeclarationDescriptor(), sb); - if (!type.getArguments().isEmpty()) { - sb.append("<"); - boolean first = true; - for (TypeProjection proj : type.getArguments()) { - serialize(proj.getProjectionKind(), sb); - serialize(proj.getType(), sb); - if (!first) { - sb.append(", "); + serialize(klass.getKind()); + sb.append(" "); + + serialize(klass); + + if (!klass.getTypeConstructor().getParameters().isEmpty()) { + sb.append("<"); + serializeCommaSeparated(klass.getTypeConstructor().getParameters()); + sb.append(">"); + } + + // TODO: supers + // TODO: constructors + + sb.append(" {\n"); + + List typeArguments = new ArrayList(); + for (TypeParameterDescriptor param : klass.getTypeConstructor().getParameters()) { + typeArguments.add(new TypeProjection(Variance.INVARIANT, param.getDefaultType())); + } + + JetScope memberScope = klass.getMemberScope(typeArguments); + for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { + // TODO + if (member.getName().equals("equals") || member.getName().equals("hashCode") + || member.getName().equals("wait") || member.getName().equals("notify") || member.getName().equals("notifyAll") + || member.getName().equals("toString") || member.getName().equals("getClass") + || member.getName().equals("clone") || member.getName().equals("finalize") + || member.getName().equals("getTypeInfo") || member.getName().equals("$setTypeInfo") || member.getName().equals("$typeInfo") + ) + { + continue; } + sb.append(" "); + new Serializer(sb).serialize(member); + sb.append("\n"); + } + + sb.append("}\n"); + return sb.toString(); + } + + public void serialize(ClassKind kind) { + switch (kind) { + case CLASS: + sb.append("class"); + break; + case TRAIT: + sb.append("trait"); + break; + default: + throw new IllegalStateException(); + } + } + + + private static Object invoke(Method method, Object thiz, Object... args) { + try { + return method.invoke(thiz, args); + } catch (Exception e) { + throw new RuntimeException("failed to invoke " + method + ": " + e, e); + } + } + + + public void serialize(FunctionDescriptor fun) { + serialize(fun.getModality()); + sb.append(" "); + + sb.append("fun "); + if (!fun.getTypeParameters().isEmpty()) { + sb.append("<"); + serializeCommaSeparated(fun.getTypeParameters()); + sb.append(">"); + } + + if (fun.getReceiverParameter().exists()) { + serialize(fun.getReceiverParameter()); + sb.append("."); + } + + sb.append(fun.getName()); + sb.append("("); + new ValueParameterSerializer(sb).serializeCommaSeparated(fun.getValueParameters()); + sb.append("): "); + serialize(fun.getReturnType()); + } + + public void serialize(ExtensionReceiver extensionReceiver) { + serialize(extensionReceiver.getType()); + } + + public void serialize(PropertyDescriptor prop) { + if (prop.isVar()) { + sb.append("var "); + } else { + sb.append("val "); + } + sb.append(prop.getName()); + sb.append(": "); + serialize(prop.getOutType()); + } + + public void serialize(ValueParameterDescriptor valueParameter) { + if (valueParameter.getVarargElementType() != null) { + sb.append("vararg "); + } + sb.append(valueParameter.getName()); + sb.append(": "); + if (valueParameter.getVarargElementType() != null) { + serialize(valueParameter.getVarargElementType()); + } else { + serialize(valueParameter.getOutType()); + } + if (valueParameter.hasDefaultValue()) { + sb.append(" = ?"); + } + } + + public void serialize(Variance variance) { + if (variance == Variance.INVARIANT) { + + } else { + sb.append(variance); + sb.append(' '); + } + } + + public void serialize(Modality modality) { + sb.append(modality.name().toLowerCase()); + } + + public void serialize(JetType type) { + serialize(type.getConstructor().getDeclarationDescriptor()); + if (!type.getArguments().isEmpty()) { + sb.append("<"); + boolean first = true; + for (TypeProjection proj : type.getArguments()) { + serialize(proj.getProjectionKind()); + serialize(proj.getType()); + if (!first) { + sb.append(", "); + } + first = false; + } + sb.append(">"); + } + } + + public void serializeCommaSeparated(List list) { + serializeSeparated(list, ", "); + } + + public void serializeSeparated(List list, String sep) { + boolean first = true; + for (Object o : list) { + if (!first) { + sb.append(sep); + } + serialize(o); first = false; } - sb.append(">"); } - } - - private String serialize(Object o) { - StringBuilder sb = new StringBuilder(); - serialize(o, sb); - return sb.toString(); - } - - private void serializeCommaSeparated(List list, StringBuilder sb) { - serializeSeparated(list, sb, ", "); - } - private void serializeSeparated(List list, StringBuilder sb, String sep) { - boolean first = true; - for (Object o : list) { - if (!first) { - sb.append(sep); + private Method getMethodToSerialize(Object o) { + // TODO: cache + for (Method method : this.getClass().getMethods()) { + if (!method.getName().equals("serialize")) { + continue; + } + if (method.getParameterTypes().length != 1) { + continue; + } + if (method.getParameterTypes()[0].equals(Object.class)) { + continue; + } + if (method.getParameterTypes()[0].isInstance(o)) { + method.setAccessible(true); + return method; + } } - serialize(o, sb); - first = false; + throw new IllegalStateException("don't know how to serialize " + o + " (of " + o.getClass() + ")"); } - } - private Method getMethodToSerialize(Object o) { - // TODO: cache - for (Method method : ReadClassDataTest.class.getDeclaredMethods()) { - if (!method.getName().equals("serialize")) { - continue; - } - if (method.getParameterTypes().length != 2) { - continue; - } - if (!method.getParameterTypes()[1].equals(StringBuilder.class)) { - continue; - } - if (method.getParameterTypes()[0].equals(Object.class)) { - continue; - } - if (method.getParameterTypes()[0].isInstance(o)) { - method.setAccessible(true); - return method; - } + public void serialize(Object o) { + Method method = getMethodToSerialize(o); + invoke(method, this, o); } - throw new IllegalStateException("don't know how to serialize " + o + " (of " + o.getClass() + ")"); - } - - private void serialize(Object o, StringBuilder sb) { - Method method = getMethodToSerialize(o); - invoke(method, this, o, sb); - } - - private void serialize(String s, StringBuilder sb) { - sb.append(s); - } - private void serialize(ModuleDescriptor module, StringBuilder sb) { - // nop - } - - private void serialize(ClassDescriptor clazz, StringBuilder sb) { - serialize(clazz.getContainingDeclaration(), sb); - sb.append("."); - sb.append(clazz.getName()); - } - - private void serialize(NamespaceDescriptor ns, StringBuilder sb) { - if (ns.getContainingDeclaration() == null) { - // root ns - return; + public void serialize(String s) { + sb.append(s); } - serialize(ns.getContainingDeclaration(), sb); - sb.append("."); - sb.append(ns.getName()); - } - private void serialize(TypeParameterDescriptor param, StringBuilder sb) { - serialize(param.getVariance(), sb); - sb.append(param.getName()); - if (!param.getUpperBounds().isEmpty()) { - sb.append(" : "); - List list = new ArrayList(); - for (JetType upper : param.getUpperBounds()) { - list.add(serialize(upper)); - } - Collections.sort(list); - serializeSeparated(list, sb, " & "); // TODO: use where + public void serialize(ModuleDescriptor module) { + // nop + } + + public void serialize(ClassDescriptor clazz) { + serialize(clazz.getContainingDeclaration()); + sb.append("."); + sb.append(clazz.getName()); + } + + public void serialize(NamespaceDescriptor ns) { + if (ns.getContainingDeclaration() == null) { + // root ns + return; + } + serialize(ns.getContainingDeclaration()); + sb.append("."); + sb.append(ns.getName()); + } + + public void serialize(TypeParameterDescriptor param) { + serialize(param.getVariance()); + sb.append(param.getName()); + if (!param.getUpperBounds().isEmpty()) { + sb.append(" : "); + List list = new ArrayList(); + for (JetType upper : param.getUpperBounds()) { + StringBuilder sb = new StringBuilder(); + new Serializer(sb).serialize(upper); + list.add(sb.toString()); + } + Collections.sort(list); + serializeSeparated(list, " & "); // TODO: use where + } + // 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()); } - // TODO: lower bounds } diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java index bda1063e04c..44112938959 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -107,6 +107,10 @@ public class JetSignatureReader { int pos, final JetSignatureVisitor v) { + if (signature.length() == 0) { + throw new IllegalStateException(); + } + char c; int start, end; boolean visited, inner;