diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 8f8a89364e5..cb7078f5321 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -17,15 +17,18 @@ package org.jetbrains.jet.codegen; import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; +import java.util.BitSet; import java.util.Collections; import java.util.Collection; import java.util.Random; @@ -105,4 +108,15 @@ public class CodegenUtil { return name; } + + public static @NotNull BitSet getFlagsForVisibility(@NotNull Visibility visibility) { + BitSet flags = new BitSet(); + if (visibility == Visibilities.INTERNAL) { + flags.set(JvmStdlibNames.FLAG_INTERNAL_BIT); + } + else if (visibility == Visibilities.PRIVATE) { + flags.set(JvmStdlibNames.FLAG_PRIVATE_BIT); + } + return flags; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 489aeff5c62..95040cc8f21 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -555,11 +555,17 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { constructorMethod = JvmMethodSignature.simple("", Type.VOID_TYPE, consArgTypes); } - int flags = ACC_PUBLIC; // TODO + int flags = JetTypeMapper.getAccessModifiers(constructorDescriptor, 0); final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null); if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return; AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true); + + int flagsValue = BitSetUtils.toInt(CodegenUtil.getFlagsForVisibility(constructorDescriptor.getVisibility())); + if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flagsValue) { + jetConstructorVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, flagsValue); + } + if (constructorDescriptor == null) { jetConstructorVisitor.visit(JvmStdlibNames.JET_CONSTRUCTOR_HIDDEN_FIELD, true); } @@ -944,8 +950,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { throw new UnsupportedOperationException("failed to get descriptor for secondary constructor"); } CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); - int flags = ACC_PUBLIC; // TODO + int flags = JetTypeMapper.getAccessModifiers(constructorDescriptor, 0); final MethodVisitor mv = v.newMethod(constructor, flags, "", method.getSignature().getAsmMethod().getDescriptor(), null, null); + + AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true); + int flagsValue = BitSetUtils.toInt(CodegenUtil.getFlagsForVisibility(constructorDescriptor.getVisibility())); + if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flagsValue) { + jetConstructorVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, flagsValue); + } + jetConstructorVisitor.visitEnd(); + if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { StubCodegen.generateStubCode(mv); }