diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 58f8af4482b..44aa64ede02 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -127,6 +127,51 @@ public class AsmUtil { } } + public static boolean isAbstract(FunctionDescriptor functionDescriptor, OwnerKind kind) { + return (functionDescriptor.getModality() == Modality.ABSTRACT + || isInterface(functionDescriptor.getContainingDeclaration())) + && !isStatic(kind) + && kind != OwnerKind.TRAIT_IMPL; + } + + public static boolean isStatic(OwnerKind kind) { + return kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind; + } + + public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind) { + boolean isStatic = isStatic(kind); + boolean isAbstract = isAbstract(functionDescriptor, kind); + + int flags = getCommonCallableFlags(functionDescriptor); + + if (functionDescriptor.getModality() == Modality.FINAL) { + DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); + if (!(containingDeclaration instanceof ClassDescriptor) || + ((ClassDescriptor) containingDeclaration).getKind() != ClassKind.TRAIT) { + flags |= ACC_FINAL; + } + } + + if (isStatic || kind == OwnerKind.TRAIT_IMPL) { + flags |= ACC_STATIC; + } + + if (isAbstract) flags |= ACC_ABSTRACT; + + return flags; + } + + public static int getConstructorAsmFlags(FunctionDescriptor functionDescriptor) { + return getCommonCallableFlags(functionDescriptor); + } + + private static int getCommonCallableFlags(FunctionDescriptor functionDescriptor) { + int flags = getVisibilityAccessFlag(functionDescriptor); + flags |= getVarargsFlag(functionDescriptor); + flags |= getDeprecatedAccessFlag(functionDescriptor); + return flags; + } + //TODO: move mapping logic to front-end java public static int getVisibilityAccessFlag(@NotNull MemberDescriptor descriptor) { Integer specialCase = specialCaseVisibility(descriptor); @@ -175,6 +220,15 @@ public class AsmUtil { return 0; } + private static int getVarargsFlag(FunctionDescriptor functionDescriptor) { + if (!functionDescriptor.getValueParameters().isEmpty() + && functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1) + .getVarargElementType() != null) { + return ACC_VARARGS; + } + return 0; + } + @Nullable private static Integer specialCaseVisibility(@NotNull MemberDescriptor memberDescriptor) { DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index e79eae3c44b..2a2ccbdf2d4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -338,50 +338,6 @@ public class FunctionCodegen extends GenerationStateAware { iv.areturn(asmMethod.getReturnType()); } - private static boolean isAbstract(FunctionDescriptor functionDescriptor, OwnerKind kind) { - return (functionDescriptor.getModality() == Modality.ABSTRACT - || isInterface(functionDescriptor.getContainingDeclaration()) - ) - && !isStatic(kind) - && kind != OwnerKind.TRAIT_IMPL; - } - - public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind) { - boolean isStatic = isStatic(kind); - boolean isAbstract = isAbstract(functionDescriptor, kind); - - int flags = getVisibilityAccessFlag(functionDescriptor); - - if (!functionDescriptor.getValueParameters().isEmpty() - && functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1) - .getVarargElementType() != null) { - flags |= ACC_VARARGS; - } - - if (functionDescriptor.getModality() == Modality.FINAL) { - DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); - if (!(containingDeclaration instanceof ClassDescriptor) || - ((ClassDescriptor) containingDeclaration).getKind() != ClassKind.TRAIT) { - flags |= ACC_FINAL; - } - } - - if (isStatic || kind == OwnerKind.TRAIT_IMPL) { - flags |= ACC_STATIC; - } - - if (isAbstract) flags |= ACC_ABSTRACT; - - if (KotlinBuiltIns.getInstance().isDeprecated(functionDescriptor)) { - flags |= ACC_DEPRECATED; - } - return flags; - } - - private static boolean isStatic(OwnerKind kind) { - return kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind; - } - public static void genJetAnnotations( @NotNull GenerationState state, @NotNull FunctionDescriptor functionDescriptor, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 2bd3fd2d392..55cbab2a240 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -629,7 +629,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { final String desc = "()" + componentType.getDescriptor(); MethodVisitor mv = v.newMethod(myClass, - FunctionCodegen.getMethodAsmFlags(function, OwnerKind.IMPLEMENTATION), + AsmUtil.getMethodAsmFlags(function, OwnerKind.IMPLEMENTATION), function.getName().getName(), desc, null, null); @@ -654,7 +654,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JvmMethodSignature methodSignature = typeMapper.mapSignature(function.getName(), function); final String methodDesc = methodSignature.getAsmMethod().getDescriptor(); - MethodVisitor mv = v.newMethod(myClass, FunctionCodegen.getMethodAsmFlags(function, OwnerKind.IMPLEMENTATION), + MethodVisitor mv = v.newMethod(myClass, AsmUtil.getMethodAsmFlags(function, OwnerKind.IMPLEMENTATION), function.getName().getName(), methodDesc, null, null); @@ -931,7 +931,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { final JvmMethodSignature constructorMethod = callableMethod.getSignature(); assert constructorDescriptor != null; - int flags = getVisibilityAccessFlag(constructorDescriptor); + int flags = getConstructorAsmFlags(constructorDescriptor); final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null); if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) { diff --git a/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.A.kt b/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.A.kt new file mode 100644 index 00000000000..03961d4fa8e --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.A.kt @@ -0,0 +1,3 @@ +class A(vararg s: String) { + +} diff --git a/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.B.kt b/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.B.kt new file mode 100644 index 00000000000..af77493983f --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.B.kt @@ -0,0 +1,5 @@ +fun main(args: Array) { + A() + A("a") + A("a", "b") +} diff --git a/compiler/testData/loadKotlin/constructor/ConstructorVararg.kt b/compiler/testData/loadKotlin/constructor/ConstructorVararg.kt new file mode 100644 index 00000000000..d29453e0f51 --- /dev/null +++ b/compiler/testData/loadKotlin/constructor/ConstructorVararg.kt @@ -0,0 +1,3 @@ +package test + +class A(vararg a: Int) {} \ No newline at end of file diff --git a/compiler/testData/loadKotlin/constructor/ConstructorVararg.txt b/compiler/testData/loadKotlin/constructor/ConstructorVararg.txt new file mode 100644 index 00000000000..3b3d2621378 --- /dev/null +++ b/compiler/testData/loadKotlin/constructor/ConstructorVararg.txt @@ -0,0 +1,5 @@ +package test + +internal final class A { + /*primary*/ public constructor A(/*0*/ vararg a : jet.Int /*jet.IntArray*/) +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java index 9f8ac29e978..beabbb6f5ec 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/CompileKotlinAgainstKotlinTestGenerated.java @@ -38,6 +38,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest("compiler/testData/compileKotlinAgainstKotlin/ClassObjectMember.A.kt"); } + @TestMetadata("ConstructorVararg.A.kt") + public void testConstructorVararg_A() throws Exception { + doTest("compiler/testData/compileKotlinAgainstKotlin/ConstructorVararg.A.kt"); + } + @TestMetadata("DefaultConstructor.A.kt") public void testDefaultConstructor_A() throws Exception { doTest("compiler/testData/compileKotlinAgainstKotlin/DefaultConstructor.A.kt"); diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java index 934dd5f4b99..18498c26c6d 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java @@ -269,6 +269,11 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT doTest("compiler/testData/loadKotlin/constructor/ConstructorCollectionParameter.kt"); } + @TestMetadata("ConstructorVararg.kt") + public void testConstructorVararg() throws Exception { + doTest("compiler/testData/loadKotlin/constructor/ConstructorVararg.kt"); + } + @TestMetadata("ConstructorWithTwoDefArgs.kt") public void testConstructorWithTwoDefArgs() throws Exception { doTest("compiler/testData/loadKotlin/constructor/ConstructorWithTwoDefArgs.kt"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index cfa0c74362a..43f45c029c3 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -271,6 +271,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/constructor/ConstructorCollectionParameter.kt"); } + @TestMetadata("ConstructorVararg.kt") + public void testConstructorVararg() throws Exception { + doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/constructor/ConstructorVararg.kt"); + } + @TestMetadata("ConstructorWithTwoDefArgs.kt") public void testConstructorWithTwoDefArgs() throws Exception { doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/constructor/ConstructorWithTwoDefArgs.kt");