diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 1417c32108ae9958e15b42e3b0294794e287fa8d..7c98cd97d681d5b90675171f3cb76f26852ad497 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -393,9 +393,35 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } int flags = Opcodes.ACC_PUBLIC; // TODO - final MethodVisitor mv = v.newMethod(myClass, flags, "", constructorMethod.getDescriptor(), null, null); + final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getDescriptor(), null, null); if (!v.generateCode()) return; + AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true); + if (constructorDescriptor == null) { + jetConstructorVisitor.visit(JvmStdlibNames.JET_CONSTRUCTOR_HIDDEN_FIELD, true); + } + jetConstructorVisitor.visitEnd(); + + if (constructorDescriptor != null) { + int i = 0; + + if (CodegenUtil.hasThis0(descriptor)) { + i++; + } + + if (CodegenUtil.requireTypeInfoConstructorArg(descriptor.getDefaultType())) { + // TODO + i++; + } + + for (ValueParameterDescriptor valueParameter : constructorDescriptor.getValueParameters()) { + AnnotationVisitor jetValueParameterAnnotation = + mv.visitParameterAnnotation(i++, JvmStdlibNames.JET_VALUE_PARAMETER.getDescriptor(), true); + jetValueParameterAnnotation.visit(JvmStdlibNames.JET_VALUE_PARAMETER_NAME_FIELD, valueParameter.getName()); + jetValueParameterAnnotation.visitEnd(); + } + } + mv.visitCode(); List paramDescrs = constructorDescriptor != null 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 dd239673dfe54a5ec8e2f63b5faecf1db4d2b290..7b0a23e941a8c5f1b98c8ac58f581ab10f8029b0 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 @@ -260,6 +260,18 @@ public class JavaDescriptorResolver { } else { for (PsiMethod constructor : psiConstructors) { + PsiAnnotation jetConstructorAnnotation = + constructor.getModifierList().findAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getFqName()); + if (jetConstructorAnnotation != null) { + PsiLiteralExpression hiddenExpresson = (PsiLiteralExpression) jetConstructorAnnotation.findAttributeValue(JvmStdlibNames.JET_CONSTRUCTOR_HIDDEN_FIELD); + if (hiddenExpresson != null) { + boolean hidden = (Boolean) hiddenExpresson.getValue(); + if (hidden) { + continue; + } + } + } + ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl( classData.classDescriptor, Collections.emptyList(), // TODO diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index 8d5a561e22c898e0c226da87f2d6ca5897817faf..66cc4a16bb9ada0ddf87b2c4433f08614984991a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -29,6 +29,10 @@ public class JvmStdlibNames { public static final JvmClassName JET_PROPERTY = new JvmClassName("jet.runtime.typeinfo.JetProperty"); + public static final JvmClassName JET_CONSTRUCTOR = new JvmClassName("jet.runtime.typeinfo.JetConstructor"); + + public static final String JET_CONSTRUCTOR_HIDDEN_FIELD = "hidden"; + public static final JvmClassName JET_CLASS = new JvmClassName("jet.runtime.typeinfo.JetClass"); diff --git a/compiler/testData/readClass/constructor/Constructor0.kt b/compiler/testData/readClass/constructor/Constructor0.kt new file mode 100644 index 0000000000000000000000000000000000000000..17befd3d8588c02627300a016ef88d3c92380898 --- /dev/null +++ b/compiler/testData/readClass/constructor/Constructor0.kt @@ -0,0 +1,3 @@ +package test + +class ClassWithConstructor0() diff --git a/compiler/testData/readClass/constructor/Constructor1.kt b/compiler/testData/readClass/constructor/Constructor1.kt new file mode 100644 index 0000000000000000000000000000000000000000..df57f73723b29cb4f642d1418ed3aceaf680f6cb --- /dev/null +++ b/compiler/testData/readClass/constructor/Constructor1.kt @@ -0,0 +1,3 @@ +package test + +class ClassWithConstructor1(p: Int) diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index b6757e3c31151a0bed5753110685510bf8f9d992..bc6ae1e349ecad0c03fc768b3db6d8b23c36484b 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -186,6 +186,12 @@ public class ReadClassDataTest extends TestCaseWithTmpdir { } List memberStrings = new ArrayList(); + + for (ConstructorDescriptor constructor : klass.getConstructors()) { + StringBuilder constructorSb = new StringBuilder(); + new Serializer(constructorSb).serialize(constructor); + memberStrings.add(constructorSb.toString()); + } JetScope memberScope = klass.getMemberScope(typeArguments); for (DeclarationDescriptor member : memberScope.getAllDescriptors()) { @@ -244,6 +250,9 @@ public class ReadClassDataTest extends TestCaseWithTmpdir { serialize(fun.getModality()); sb.append(" "); + if (fun instanceof ConstructorDescriptor) { + sb.append("/*constructor*/ "); + } sb.append("fun "); if (!fun.getTypeParameters().isEmpty()) { sb.append("<"); diff --git a/stdlib/src/jet/runtime/typeinfo/JetConstructor.java b/stdlib/src/jet/runtime/typeinfo/JetConstructor.java new file mode 100644 index 0000000000000000000000000000000000000000..7b56c9c9c140f333159e920dbbf7c3cc123fab04 --- /dev/null +++ b/stdlib/src/jet/runtime/typeinfo/JetConstructor.java @@ -0,0 +1,7 @@ +package jet.runtime.typeinfo; + +/** + * @author Stepan Koltsov + */ +public @interface JetConstructor { +}