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 9bde734e3ba..88689127062 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 @@ -17,6 +17,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.plugin.JetFileType; +import org.jetbrains.jet.rt.signature.JetSignatureAdapter; import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter; import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureVisitor; @@ -124,9 +125,9 @@ public class JavaDescriptorResolver { resolveParentDescriptor(psiClass), psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS ); classDescriptor.setName(name); - + List supertypes = new ArrayList(); - List typeParameters = makeUninitializedTypeParameters(classDescriptor, psiClass.getTypeParameters()); + List typeParameters = resolveClassTypeParameters(psiClass, classDescriptor); classDescriptor.setTypeConstructor(new TypeConstructorImpl( classDescriptor, Collections.emptyList(), // TODO @@ -144,8 +145,11 @@ public class JavaDescriptorResolver { classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor); classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false)); - // UGLY HACK - initializeTypeParameters(psiClass); + // TODO: initialize + if (psiClass.getModifierList().findAnnotation(StdlibNames.JET_CLASS.getFqName()) == null) { + // UGLY HACK (Andrey Breslav is not sure what did he mean) + initializeTypeParameters(psiClass); + } supertypes.addAll(getSupertypes(psiClass)); if (psiClass.isInterface()) { @@ -197,6 +201,82 @@ public class JavaDescriptorResolver { return classDescriptor; } + private List resolveClassTypeParameters(PsiClass psiClass, JavaClassDescriptor classDescriptor) { + for (PsiAnnotation annotation : psiClass.getModifierList().getAnnotations()) { + if (annotation.getQualifiedName().equals(StdlibNames.JET_CLASS.getFqName())) { + PsiLiteralExpression attributeValue = (PsiLiteralExpression) annotation.findAttributeValue(StdlibNames.JET_CLASS_SIGNATURE); + if (attributeValue != null) { + String typeParametersString = (String) attributeValue.getValue(); + if (typeParametersString != null) { + return resolveClassTypeParametersFromJetSignature(typeParametersString, classDescriptor); + } + } + } + } + return makeUninitializedTypeParameters(classDescriptor, psiClass.getTypeParameters()); + } + + /** + * @see #resolveMethodTypeParametersFromJetSignature(String, FunctionDescriptor) + */ + private List resolveClassTypeParametersFromJetSignature(String jetSignature, final JavaClassDescriptor classDescriptor) { + final List r = new ArrayList(); + new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() { + @Override + public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) { + return new JetSignatureExceptionsAdapter() { + int index = 0; + + @Override + public JetSignatureVisitor visitClassBound() { + return new JetTypeJetSignatureReader(JavaDescriptorResolver.this, semanticServices.getJetSemanticServices().getStandardLibrary()) { + @Override + protected void done(@NotNull JetType jetType) { + // TODO + } + }; + } + + @Override + public JetSignatureVisitor visitInterfaceBound() { + return new JetTypeJetSignatureReader(JavaDescriptorResolver.this, semanticServices.getJetSemanticServices().getStandardLibrary()) { + @Override + protected void done(@NotNull JetType jetType) { + // TODO + } + }; + } + + @Override + public void visitFormalTypeParameterEnd() { + TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification( + classDescriptor, + Collections.emptyList(), // TODO: wrong + true, // TODO: wrong + JetSignatureUtils.translateVariance(variance), + name, + ++index); + r.add(typeParameter); + } + + }; + } + + @Override + public JetSignatureVisitor visitSuperclass() { + // TODO + return new JetSignatureAdapter(); + } + + @Override + public JetSignatureVisitor visitInterface() { + // TODO + return new JetSignatureAdapter(); + } + }); + return r; + } + private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) { PsiClass containingClass = psiClass.getContainingClass(); if (containingClass != null) { @@ -546,7 +626,10 @@ public class JavaDescriptorResolver { initializeTypeParameters(method); return typeParameters; } - + + /** + * @see #resolveClassTypeParametersFromJetSignature(String, JavaClassDescriptor) + */ private List resolveMethodTypeParametersFromJetSignature(String jetSignature, final FunctionDescriptor functionDescriptor) { final List r = new ArrayList(); new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() { diff --git a/compiler/testData/readClass/class/ClassInParam.kt b/compiler/testData/readClass/class/ClassInParam.kt new file mode 100644 index 00000000000..a1a3ec98d39 --- /dev/null +++ b/compiler/testData/readClass/class/ClassInParam.kt @@ -0,0 +1,3 @@ +namespace test + +class Wine diff --git a/compiler/testData/readClass/class/ClassOutParam.kt b/compiler/testData/readClass/class/ClassOutParam.kt new file mode 100644 index 00000000000..83195ecae37 --- /dev/null +++ b/compiler/testData/readClass/class/ClassOutParam.kt @@ -0,0 +1,3 @@ +namespace test + +class Juice diff --git a/compiler/testData/readClass/class/ClassParam.kt b/compiler/testData/readClass/class/ClassParam.kt new file mode 100644 index 00000000000..7457e5a7ffe --- /dev/null +++ b/compiler/testData/readClass/class/ClassParam.kt @@ -0,0 +1,3 @@ +namespace test + +class Beer diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index 7ee0f1b23e9..83e7f8d13c4 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -153,16 +153,22 @@ public class ReadClassDataTest extends UsefulTestCase { String bs = serializeContent((ClassDescriptor) b); Assert.assertEquals(as, bs); - System.out.println(a); + System.out.println(as); } private String serializeContent(ClassDescriptor klass) { StringBuilder sb = new StringBuilder(); sb.append("class "); - + serialize(klass, sb); + if (!klass.getTypeConstructor().getParameters().isEmpty()) { + sb.append("<"); + serializeCommaSeparated(klass.getTypeConstructor().getParameters(), sb); + sb.append(">"); + } + // TODO: supers // TODO: constructors diff --git a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java index a163c8c6d4d..bda1063e04c 100644 --- a/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java +++ b/stdlib/src/org/jetbrains/jet/rt/signature/JetSignatureReader.java @@ -36,6 +36,10 @@ public class JetSignatureReader { pos = parseType(signature, pos, v.visitInterface()); } } + + if (pos != signature.length()) { + throw new IllegalStateException(); + } } public int acceptFormalTypeParameters(JetSignatureVisitor v) {