From 5b4f10e6986ceb4781ae36913929b0507fc99164 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 9 Dec 2014 14:11:11 +0300 Subject: [PATCH] Made vararg parameters have Array type instead of simply Array #KT-1638 Fixed #KT-2163 Fixed #KT-3213 Fixed #KT-4172 Fixed #KT-5534 Fixed --- .../codegen/ImplementationBodyCodegen.java | 15 ++-- .../jvm/compiler/CommandLineScriptUtils.java | 5 +- .../AlternativeMethodSignatureData.java | 2 +- .../SignaturesPropagationData.java | 6 +- .../jet/lang/resolve/AnnotationResolver.java | 13 ++-- .../jet/lang/resolve/DescriptorResolver.java | 2 +- ...ReifiedTypeParameterSubstitutionCheck.java | 5 +- .../codegen/box/diagnostics/vararg/kt4172.kt | 14 ++++ .../codegen/box/diagnostics/vararg/kt4172.txt | 21 ++++++ .../testData/codegen/box/vararg/kt796_797.kt | 2 +- .../testData/diagnostics/tests/VarargTypes.kt | 2 +- .../tests/inference/mapFunction.kt | 2 +- .../tests/inference/regressions/kt2200.kt | 2 +- .../tests/inference/regressions/kt2294.kt | 2 +- .../diagnostics/tests/varargs/kt2163.kt | 7 ++ .../diagnostics/tests/varargs/kt2163.txt | 4 ++ .../tests/varargs/varargsAndOut1.kt | 13 ++++ .../tests/varargs/varargsAndOut1.txt | 5 ++ .../tests/varargs/varargsAndOut2.kt | 9 +++ .../tests/varargs/varargsAndOut2.txt | 4 ++ .../{inference => }/varargs/varargsAndPair.kt | 0 .../varargs/varargsAndPair.txt | 0 .../array.kt | 2 +- .../vararg.kt | 2 +- .../testsWithStdLib/varargs/kt3213.kt | 7 ++ .../testsWithStdLib/varargs/kt3213.txt | 3 + .../testsWithStdLib/varargs/kt4172j.kt | 9 +++ .../testsWithStdLib/varargs/kt4172j.txt | 13 ++++ .../testsWithStdLib/varargs/kt5534.kt | 6 ++ .../testsWithStdLib/varargs/kt5534.txt | 4 ++ .../checkers/JetDiagnosticsTestGenerated.java | 70 +++++++++++++------ ...JetDiagnosticsTestWithStdLibGenerated.java | 29 +++++++- .../jet/codegen/CodegenTestFiles.java | 3 +- .../BlackBoxCodegenTestGenerated.java | 17 ++++- .../java/lazy/types/LazyJavaTypeResolver.kt | 5 +- .../jet/lang/resolve/DescriptorFactory.java | 3 +- .../resolve/calls/inference/TypeBoundsImpl.kt | 5 ++ .../org/jetbrains/jet/lang/types/TypeUtils.kt | 4 ++ .../jet/lang/types/lang/KotlinBuiltIns.java | 5 -- .../serialization/AnnotationDeserializer.kt | 4 +- .../plugin/refactoring/JetNameSuggester.java | 3 +- .../src/kotlin/collections/ArraysJVM.kt | 2 +- 42 files changed, 266 insertions(+), 65 deletions(-) create mode 100644 compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt create mode 100644 compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt create mode 100644 compiler/testData/diagnostics/tests/varargs/kt2163.kt create mode 100644 compiler/testData/diagnostics/tests/varargs/kt2163.txt create mode 100644 compiler/testData/diagnostics/tests/varargs/varargsAndOut1.kt create mode 100644 compiler/testData/diagnostics/tests/varargs/varargsAndOut1.txt create mode 100644 compiler/testData/diagnostics/tests/varargs/varargsAndOut2.kt create mode 100644 compiler/testData/diagnostics/tests/varargs/varargsAndOut2.txt rename compiler/testData/diagnostics/tests/{inference => }/varargs/varargsAndPair.kt (100%) rename compiler/testData/diagnostics/tests/{inference => }/varargs/varargsAndPair.txt (100%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.txt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 26275615fd1..0d45a72f249 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -58,6 +58,7 @@ import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodParameterSignat import org.jetbrains.jet.lang.resolve.java.jvmSignature.JvmMethodSignature; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; @@ -78,6 +79,7 @@ import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; import static org.jetbrains.jet.lang.resolve.java.diagnostics.DiagnosticsPackage.*; import static org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; +import static org.jetbrains.jet.lang.types.Variance.INVARIANT; import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class ImplementationBodyCodegen extends ClassBodyCodegen { @@ -460,12 +462,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { continue; } - JetType arrayType = KotlinBuiltIns.getInstance().getArrayType(function.getTypeParameters().get(0).getDefaultType()); JetType returnType = function.getReturnType(); assert returnType != null : function.toString(); JetType paramType = function.getValueParameters().get(0).getType(); - if (JetTypeChecker.DEFAULT.equalTypes(arrayType, returnType) && JetTypeChecker.DEFAULT.equalTypes(arrayType, paramType)) { - return true; + if (KotlinBuiltIns.isArray(returnType) && KotlinBuiltIns.isArray(paramType)) { + JetType elementType = function.getTypeParameters().get(0).getDefaultType(); + if (JetTypeChecker.DEFAULT.equalTypes(elementType, KotlinBuiltIns.getInstance().getArrayElementType(returnType)) + && JetTypeChecker.DEFAULT.equalTypes(elementType, KotlinBuiltIns.getInstance().getArrayElementType(paramType))) { + return true; + } } } return false; @@ -818,7 +823,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private void generateEnumValuesMethod() { - Type type = typeMapper.mapType(KotlinBuiltIns.getInstance().getArrayType(descriptor.getDefaultType())); + Type type = typeMapper.mapType(KotlinBuiltIns.getInstance().getArrayType(INVARIANT, descriptor.getDefaultType())); FunctionDescriptor valuesFunction = KotlinPackage.single(descriptor.getStaticScope().getFunctions(ENUM_VALUES), new Function1() { @@ -1554,7 +1559,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ExpressionCodegen codegen = createOrGetClInitCodegen(); InstructionAdapter iv = codegen.v; - Type arrayAsmType = typeMapper.mapType(KotlinBuiltIns.getInstance().getArrayType(descriptor.getDefaultType())); + Type arrayAsmType = typeMapper.mapType(KotlinBuiltIns.getInstance().getArrayType(INVARIANT, descriptor.getDefaultType())); v.newField(OtherOrigin(myClass), ACC_PRIVATE | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC, ENUM_VALUES_FIELD_NAME, arrayAsmType.getDescriptor(), null, null); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CommandLineScriptUtils.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CommandLineScriptUtils.java index 9bb34659c73..7f3eb8546cf 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CommandLineScriptUtils.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CommandLineScriptUtils.java @@ -19,11 +19,14 @@ package org.jetbrains.jet.cli.jvm.compiler; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Collections; import java.util.List; +import static org.jetbrains.jet.lang.types.Variance.INVARIANT; + public class CommandLineScriptUtils { private static final Name ARGS_NAME = Name.identifier("args"); @@ -31,7 +34,7 @@ public class CommandLineScriptUtils { } public static List scriptParameters() { - JetType arrayOfStrings = KotlinBuiltIns.getInstance().getArrayType(KotlinBuiltIns.getInstance().getStringType()); + JetType arrayOfStrings = KotlinBuiltIns.getInstance().getArrayType(INVARIANT, KotlinBuiltIns.getInstance().getStringType()); AnalyzerScriptParameter argsParameter = new AnalyzerScriptParameter(ARGS_NAME, arrayOfStrings); return Collections.singletonList(argsParameter); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java index 03a69a65ab8..e8423d3068f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java @@ -215,7 +215,7 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD alternativeVarargElementType = TypeTransformingVisitor.computeType(alternativeTypeElement, originalParamVarargElementType, originalToAltTypeParameters, MEMBER_SIGNATURE_CONTRAVARIANT); - alternativeType = KotlinBuiltIns.getInstance().getArrayType(alternativeVarargElementType); + alternativeType = KotlinBuiltIns.getInstance().getArrayType(Variance.OUT_VARIANCE, alternativeVarargElementType); } Name altName = annotationValueParameter.getNameAsName(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java index 55286aaa56f..319ea3b4e8f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java @@ -50,6 +50,7 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName; import static org.jetbrains.jet.lang.resolve.java.resolver.TypeUsage.*; import static org.jetbrains.jet.lang.types.Variance.INVARIANT; +import static org.jetbrains.jet.lang.types.Variance.OUT_VARIANCE; public class SignaturesPropagationData { @@ -368,6 +369,7 @@ public class SignaturesPropagationData { } KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance(); + // todo simplify (with respect to platform types) if (someSupersVararg && originalVarargElementType == null) { // convert to vararg @@ -393,10 +395,8 @@ public class SignaturesPropagationData { } // replace Array with Array? - return new VarargCheckResult(TypeUtils.makeNullable(builtIns.getArrayType(Variance.OUT_VARIANCE, originalVarargElementType)), - false); + return new VarargCheckResult(TypeUtils.makeNullable(builtIns.getArrayType(OUT_VARIANCE, originalVarargElementType)), false); } - return new VarargCheckResult(originalType, originalVarargElementType != null); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java index d9b413c7152..1f07dfb8019 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java @@ -46,11 +46,11 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.storage.StorageManager; import javax.inject.Inject; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -58,6 +58,7 @@ import java.util.Map; import static org.jetbrains.jet.lang.diagnostics.Errors.NOT_AN_ANNOTATION_CLASS; import static org.jetbrains.jet.lang.resolve.BindingContext.ANNOTATION_DESCRIPTOR_TO_PSI_ELEMENT; import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE; +import static org.jetbrains.jet.lang.types.Variance.OUT_VARIANCE; public class AnnotationResolver { @@ -244,9 +245,8 @@ public class AnnotationResolver { ) { JetType varargElementType = parameterDescriptor.getVarargElementType(); boolean argumentsAsVararg = varargElementType != null && !hasSpread(resolvedArgument); - List> constants = resolveValueArguments(resolvedArgument, - argumentsAsVararg ? varargElementType : parameterDescriptor.getType(), - trace); + List> constants = resolveValueArguments( + resolvedArgument, argumentsAsVararg ? varargElementType : parameterDescriptor.getType(), trace); if (argumentsAsVararg) { @@ -259,9 +259,10 @@ public class AnnotationResolver { JetType arrayType = KotlinBuiltIns.getInstance().getPrimitiveArrayJetTypeByPrimitiveJetType(varargElementType); if (arrayType == null) { - arrayType = KotlinBuiltIns.getInstance().getArrayType(varargElementType); + arrayType = KotlinBuiltIns.getInstance().getArrayType(OUT_VARIANCE, varargElementType); } + //todo use parameterDescriptor.getType() instead of arrayType return new ArrayValue(constants, arrayType, true, usesVariableAsConstant); } else { @@ -277,7 +278,7 @@ public class AnnotationResolver { ) { JetType expressionType = trace.get(BindingContext.EXPRESSION_TYPE, argumentExpression); - if (expressionType == null || !expressionType.equals(expectedType)) { + if (expressionType == null || !JetTypeChecker.DEFAULT.isSubtypeOf(expressionType, expectedType)) { // TYPE_MISMATCH should be reported otherwise return; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index e3ae5f995ff..b26330328fd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -588,7 +588,7 @@ public class DescriptorResolver { if (primitiveArrayType != null) { return primitiveArrayType; } - return builtIns.getArrayType(Variance.INVARIANT, elementType); + return builtIns.getArrayType(Variance.OUT_VARIANCE, elementType); } public List resolveTypeParametersForCallableDescriptor( diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java index 2714ba31b73..9d843750634 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ReifiedTypeParameterSubstitutionCheck.java @@ -26,8 +26,7 @@ import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypesPackage; -import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.lang.types.typeUtil.TypeUtilPackage; import java.util.Map; @@ -50,7 +49,7 @@ public class ReifiedTypeParameterSubstitutionCheck implements CallResolverExtens Errors.TYPE_PARAMETER_AS_REIFIED.on(getCallElement(context), parameter) ); } - else if (KotlinBuiltIns.isNothingOrNullableNothing(argument) || TypesPackage.isDynamic(argument)) { + else if (TypeUtilPackage.cannotBeReified(argument)) { context.trace.report(Errors.REIFIED_TYPE_FORBIDDEN_SUBSTITUTION.on(getCallElement(context), argument)); } } diff --git a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt new file mode 100644 index 00000000000..1bf761f1a15 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt @@ -0,0 +1,14 @@ +fun box(): String { + main(array()) + return "OK" +} + +fun main(args: Array) { + D.foo(array()) +} + +object D { + fun foo(array: Array) = array +} + +inline fun array(vararg t : T) : Array = t as Array \ No newline at end of file diff --git a/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt new file mode 100644 index 00000000000..42769675ae4 --- /dev/null +++ b/compiler/testData/codegen/box/diagnostics/vararg/kt4172.txt @@ -0,0 +1,21 @@ +package + +kotlin.inline() internal fun array(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Array +internal fun box(): kotlin.String +internal fun main(/*0*/ args: kotlin.Array): kotlin.Unit + +internal object D { + private constructor D() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final fun foo(/*0*/ array: kotlin.Array): kotlin.Array + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public class object : D { + private constructor () + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + internal final override /*1*/ /*fake_override*/ fun foo(/*0*/ array: kotlin.Array): kotlin.Array + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/codegen/box/vararg/kt796_797.kt b/compiler/testData/codegen/box/vararg/kt796_797.kt index 865a7bba790..be848790975 100644 --- a/compiler/testData/codegen/box/vararg/kt796_797.kt +++ b/compiler/testData/codegen/box/vararg/kt796_797.kt @@ -1,5 +1,5 @@ fun Array?.get(i : Int?) = this!!.get(i!!) -fun array(vararg t : T) : Array = t +fun array(vararg t : T) : Array = t as Array fun box() : String { val a : Array? = array("Str", "Str2") diff --git a/compiler/testData/diagnostics/tests/VarargTypes.kt b/compiler/testData/diagnostics/tests/VarargTypes.kt index 379dc14bf04..66e2f692ab9 100644 --- a/compiler/testData/diagnostics/tests/VarargTypes.kt +++ b/compiler/testData/diagnostics/tests/VarargTypes.kt @@ -10,7 +10,7 @@ fun fool(vararg a : Long) : LongArray = a fun food(vararg a : Double) : DoubleArray = a fun foof(vararg a : Float) : FloatArray = a fun foob(vararg a : Boolean) : BooleanArray = a -fun foos(vararg a : String) : Array = a +fun foos(vararg a : String) : Array = a fun test() { Arrays.asList(1, 2, 3) diff --git a/compiler/testData/diagnostics/tests/inference/mapFunction.kt b/compiler/testData/diagnostics/tests/inference/mapFunction.kt index 7e9cf3eea8a..6c60d680482 100644 --- a/compiler/testData/diagnostics/tests/inference/mapFunction.kt +++ b/compiler/testData/diagnostics/tests/inference/mapFunction.kt @@ -25,7 +25,7 @@ fun foo() { // --------------------- // copy from kotlin util -fun array(vararg t : T) : Array = t +fun array(vararg t : T) : Array = t as Array fun Array.map(transform : (T) -> R) : List {} diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt index f5e0fc6d331..628c798adce 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2200.kt @@ -11,4 +11,4 @@ fun main(args: Array) { } //from library -fun array(vararg t : T) : Array = t \ No newline at end of file +fun array(vararg t : T) : Array = t as Array \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt index aaf50e72945..938d5cc4d6b 100644 --- a/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt2294.kt @@ -13,4 +13,4 @@ public fun test() //-------------------- -fun array(vararg t : T) : Array = t +fun array(vararg t : T) : Array = t as Array diff --git a/compiler/testData/diagnostics/tests/varargs/kt2163.kt b/compiler/testData/diagnostics/tests/varargs/kt2163.kt new file mode 100644 index 00000000000..de27add96ab --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt2163.kt @@ -0,0 +1,7 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun printAll(vararg a : Any) {} + +fun main(args: Array) { + printAll(*args) // Shouldn't be an error +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/kt2163.txt b/compiler/testData/diagnostics/tests/varargs/kt2163.txt new file mode 100644 index 00000000000..e16cff8f7bd --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/kt2163.txt @@ -0,0 +1,4 @@ +package + +internal fun main(/*0*/ args: kotlin.Array): kotlin.Unit +internal fun printAll(/*0*/ vararg a: kotlin.Any /*kotlin.Array*/): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.kt b/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.kt new file mode 100644 index 00000000000..b5ea82abc39 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.kt @@ -0,0 +1,13 @@ +// !CHECK_TYPE + +fun test(vararg a: String) { + a checkType { it : _> } + + foo(a) checkType { it : _> } +} + +fun test1(vararg t: T) { + t checkType { it : _> } +} + +fun foo(a: Array): Array = a \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.txt b/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.txt new file mode 100644 index 00000000000..cbd9c210224 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/varargsAndOut1.txt @@ -0,0 +1,5 @@ +package + +internal fun foo(/*0*/ a: kotlin.Array): kotlin.Array +internal fun test(/*0*/ vararg a: kotlin.String /*kotlin.Array*/): kotlin.Unit +internal fun test1(/*0*/ vararg t: T /*kotlin.Array*/): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.kt b/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.kt new file mode 100644 index 00000000000..95fc2e692d3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.kt @@ -0,0 +1,9 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun bar(vararg a: String) {} + +fun test2(a: Array, b: Array) { + bar(*a) + bar(*b) + bar("", *a, *b, "") +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.txt b/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.txt new file mode 100644 index 00000000000..ca8e0c48d52 --- /dev/null +++ b/compiler/testData/diagnostics/tests/varargs/varargsAndOut2.txt @@ -0,0 +1,4 @@ +package + +internal fun bar(/*0*/ vararg a: kotlin.String /*kotlin.Array*/): kotlin.Unit +internal fun test2(/*0*/ a: kotlin.Array, /*1*/ b: kotlin.Array): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt b/compiler/testData/diagnostics/tests/varargs/varargsAndPair.kt similarity index 100% rename from compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt rename to compiler/testData/diagnostics/tests/varargs/varargsAndPair.kt diff --git a/compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.txt b/compiler/testData/diagnostics/tests/varargs/varargsAndPair.txt similarity index 100% rename from compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.txt rename to compiler/testData/diagnostics/tests/varargs/varargsAndPair.txt diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.kt index 9d3f2643fda..5e0d0cd767b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/array.kt @@ -15,7 +15,7 @@ fun foo(): Int = 1 annotation class AnnJC(val i: Array>) AnnJC(array(javaClass())) -AnnJC(array(iJC)) +AnnJC(array(iJC)) class TestJC val iJC = javaClass() diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.kt index 42f7ccfb73e..d2666588b81 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.kt @@ -18,7 +18,7 @@ fun foo(): Int = 1 annotation class AnnJC(vararg val i: Class<*>) AnnJC(*array(javaClass())) -AnnJC(*array(iJC)) +AnnJC(*array(iJC)) class TestJC val iJC = javaClass() diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.kt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.kt new file mode 100644 index 00000000000..ed0805c50cd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.kt @@ -0,0 +1,7 @@ +// !CHECK_TYPE + +fun test(a: Array) { + val b = a.toList() + + b checkType { it : _> } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.txt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.txt new file mode 100644 index 00000000000..ea4c77533c3 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.txt @@ -0,0 +1,3 @@ +package + +internal fun test(/*0*/ a: kotlin.Array): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.kt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.kt new file mode 100644 index 00000000000..096039ce60e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.kt @@ -0,0 +1,9 @@ +// FILE: A.java +public class A { + public static void main(String[] args) {} +} + +// FILE: 1.kt +fun main(args: Array) { + A.main(array()) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.txt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.txt new file mode 100644 index 00000000000..aa3a44bab7b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.txt @@ -0,0 +1,13 @@ +package + +internal fun main(/*0*/ args: kotlin.Array): kotlin.Unit + +public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public open fun main(/*0*/ args: kotlin.Array<(out) kotlin.String!>!): kotlin.Unit +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.kt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.kt new file mode 100644 index 00000000000..4445b3de3eb --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.kt @@ -0,0 +1,6 @@ +fun test() { + val p: Array = array("a") + foo(*p) +} + +fun foo(vararg a: String?) = a \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.txt b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.txt new file mode 100644 index 00000000000..608ffd9b85b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.txt @@ -0,0 +1,4 @@ +package + +internal fun foo(/*0*/ vararg a: kotlin.String? /*kotlin.Array*/): kotlin.Array +internal fun test(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index de494b44769..29fd9e0827e 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4899,7 +4899,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { @TestMetadata("compiler/testData/diagnostics/tests/inference") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({Inference.CapturedTypes.class, Inference.Constraints.class, Inference.NestedCalls.class, Inference.Regressions.class, Inference.ReportingImprovements.class, Inference.Substitutions.class, Inference.UpperBounds.class, Inference.Varargs.class}) + @InnerTestClasses({Inference.CapturedTypes.class, Inference.Constraints.class, Inference.NestedCalls.class, Inference.Regressions.class, Inference.ReportingImprovements.class, Inference.Substitutions.class, Inference.UpperBounds.class}) @RunWith(JUnit3RunnerWithInners.class) public static class Inference extends AbstractJetDiagnosticsTest { public void testAllFilesPresentInInference() throws Exception { @@ -5106,6 +5106,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("captureTypeOnlyOnTopLevel.kt") + public void testCaptureTypeOnlyOnTopLevel() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt"); + doTest(fileName); + } + @TestMetadata("capturedType.kt") public void testCapturedType() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/capturedType.kt"); @@ -5129,12 +5135,6 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt"); doTest(fileName); } - - @TestMetadata("captureTypeOnlyOnTopLevel.kt") - public void testCaptureTypeOnlyOnTopLevel() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/captureTypeOnlyOnTopLevel.kt"); - doTest(fileName); - } } @TestMetadata("compiler/testData/diagnostics/tests/inference/constraints") @@ -5640,21 +5640,6 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } } - - @TestMetadata("compiler/testData/diagnostics/tests/inference/varargs") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class Varargs extends AbstractJetDiagnosticsTest { - public void testAllFilesPresentInVarargs() throws Exception { - JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/varargs"), Pattern.compile("^(.+)\\.kt$"), true); - } - - @TestMetadata("varargsAndPair.kt") - public void testVarargsAndPair() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/varargs/varargsAndPair.kt"); - doTest(fileName); - } - } } @TestMetadata("compiler/testData/diagnostics/tests/infos") @@ -10304,6 +10289,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("kt2163.kt") + public void testKt2163() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/kt2163.kt"); + doTest(fileName); + } + @TestMetadata("kt422.kt") public void testKt422() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/kt422.kt"); @@ -10345,6 +10336,24 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/varargsAndFunctionLiterals.kt"); doTest(fileName); } + + @TestMetadata("varargsAndOut1.kt") + public void testVarargsAndOut1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/varargsAndOut1.kt"); + doTest(fileName); + } + + @TestMetadata("varargsAndOut2.kt") + public void testVarargsAndOut2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/varargsAndOut2.kt"); + doTest(fileName); + } + + @TestMetadata("varargsAndPair.kt") + public void testVarargsAndPair() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/varargs/varargsAndPair.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/tests/variance") @@ -10567,7 +10576,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { @TestMetadata("compiler/testData/codegen/box/diagnostics") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({Diagnostics.Functions.class}) + @InnerTestClasses({Diagnostics.Functions.class, Diagnostics.Vararg.class}) @RunWith(JUnit3RunnerWithInners.class) public static class Diagnostics extends AbstractJetDiagnosticsTest { public void testAllFilesPresentInDiagnostics() throws Exception { @@ -10902,5 +10911,20 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { } } } + + @TestMetadata("compiler/testData/codegen/box/diagnostics/vararg") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Vararg extends AbstractJetDiagnosticsTest { + public void testAllFilesPresentInVararg() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/diagnostics/vararg"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("kt4172.kt") + public void testKt4172() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt"); + doTest(fileName); + } + } } } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 27acf3eecf5..bb2dc8bf218 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/diagnostics/testsWithStdLib") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({JetDiagnosticsTestWithStdLibGenerated.Annotations.class, JetDiagnosticsTestWithStdLibGenerated.CallableReference.class, JetDiagnosticsTestWithStdLibGenerated.DuplicateJvmSignature.class, JetDiagnosticsTestWithStdLibGenerated.FunctionLiterals.class, JetDiagnosticsTestWithStdLibGenerated.Inference.class, JetDiagnosticsTestWithStdLibGenerated.KotlinSignature.class, JetDiagnosticsTestWithStdLibGenerated.Reified.class, JetDiagnosticsTestWithStdLibGenerated.Resolve.class}) +@InnerTestClasses({JetDiagnosticsTestWithStdLibGenerated.Annotations.class, JetDiagnosticsTestWithStdLibGenerated.CallableReference.class, JetDiagnosticsTestWithStdLibGenerated.DuplicateJvmSignature.class, JetDiagnosticsTestWithStdLibGenerated.FunctionLiterals.class, JetDiagnosticsTestWithStdLibGenerated.Inference.class, JetDiagnosticsTestWithStdLibGenerated.KotlinSignature.class, JetDiagnosticsTestWithStdLibGenerated.Reified.class, JetDiagnosticsTestWithStdLibGenerated.Resolve.class, JetDiagnosticsTestWithStdLibGenerated.Varargs.class}) @RunWith(JUnit3RunnerWithInners.class) public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnosticsTestWithStdLib { public void testAllFilesPresentInTestsWithStdLib() throws Exception { @@ -695,4 +695,31 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic doTest(fileName); } } + + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/varargs") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Varargs extends AbstractJetDiagnosticsTestWithStdLib { + public void testAllFilesPresentInVarargs() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/varargs"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("kt3213.kt") + public void testKt3213() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/varargs/kt3213.kt"); + doTest(fileName); + } + + @TestMetadata("kt4172j.kt") + public void testKt4172j() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/varargs/kt4172j.kt"); + doTest(fileName); + } + + @TestMetadata("kt5534.kt") + public void testKt5534() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/varargs/kt5534.kt"); + doTest(fileName); + } + } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java index bed42dd2408..5021ef49254 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.io.IOException; @@ -138,7 +139,7 @@ public class CodegenTestFiles { } else if (type.equals("kotlin.Array")) { value = valueString.split(" "); - jetType = builtIns.getArrayType(builtIns.getStringType()); + jetType = builtIns.getArrayType(Variance.INVARIANT, builtIns.getStringType()); } else { throw new AssertionError("TODO: " + type); diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 0d7a8a0f9aa..df21dca9d50 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -2606,7 +2606,7 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { @TestMetadata("compiler/testData/codegen/box/diagnostics") @TestDataPath("$PROJECT_ROOT") - @InnerTestClasses({Diagnostics.Functions.class}) + @InnerTestClasses({Diagnostics.Functions.class, Diagnostics.Vararg.class}) @RunWith(JUnit3RunnerWithInners.class) public static class Diagnostics extends AbstractBlackBoxCodegenTest { public void testAllFilesPresentInDiagnostics() throws Exception { @@ -2941,6 +2941,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } } + + @TestMetadata("compiler/testData/codegen/box/diagnostics/vararg") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Vararg extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInVararg() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/diagnostics/vararg"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("kt4172.kt") + public void testKt4172() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/diagnostics/vararg/kt4172.kt"); + doTest(fileName); + } + } } @TestMetadata("compiler/testData/codegen/box/elvis") diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt index d08131176b7..ccc294aa36a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt @@ -73,8 +73,7 @@ class LazyJavaTypeResolver( } } - val howArgumentTypeIsUsed = if (isVararg) MEMBER_SIGNATURE_CONTRAVARIANT else TYPE_ARGUMENT - val componentType = transformJavaType(javaComponentType, howArgumentTypeIsUsed.toAttributes(attr.allowFlexible)) + val componentType = transformJavaType(javaComponentType, TYPE_ARGUMENT.toAttributes(attr.allowFlexible)) if (PLATFORM_TYPES && attr.allowFlexible) { return FlexibleJavaClassifierTypeCapabilities.create( @@ -82,7 +81,7 @@ class LazyJavaTypeResolver( TypeUtils.makeNullable(KotlinBuiltIns.getInstance().getArrayType(OUT_VARIANCE, componentType))) } - val projectionKind = if (attr.howThisTypeIsUsed == MEMBER_SIGNATURE_CONTRAVARIANT && !isVararg) OUT_VARIANCE else INVARIANT + val projectionKind = if (attr.howThisTypeIsUsed == MEMBER_SIGNATURE_CONTRAVARIANT || isVararg) OUT_VARIANCE else INVARIANT val result = KotlinBuiltIns.getInstance().getArrayType(projectionKind, componentType) return TypeUtils.makeNullableAsSpecified(result, !attr.isMarkedNotNull) } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java index f09da3fdf19..f2bf5471ca6 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/DescriptorFactory.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.impl.*; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.Variance; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Collections; @@ -89,7 +90,7 @@ public class DescriptorFactory { CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource()); return values.initialize(null, NO_RECEIVER_PARAMETER, Collections.emptyList(), Collections.emptyList(), - KotlinBuiltIns.getInstance().getArrayType(enumClass.getDefaultType()), Modality.FINAL, + KotlinBuiltIns.getInstance().getArrayType(Variance.INVARIANT, enumClass.getDefaultType()), Modality.FINAL, Visibilities.PUBLIC); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.kt index a3703ee7ab9..fbe6eb356f3 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/calls/inference/TypeBoundsImpl.kt @@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.calls.inference.TypeBounds.BoundKind.* import org.jetbrains.jet.lang.resolve.calls.inference.constraintPosition.ConstraintPosition import org.jetbrains.jet.utils.addIfNotNull import org.jetbrains.jet.lang.types.singleBestRepresentative +import org.jetbrains.jet.lang.types.typeUtil.cannotBeReified public class TypeBoundsImpl( override val typeVariable: TypeParameterDescriptor, @@ -159,6 +160,10 @@ public class TypeBoundsImpl( // a captured type might be an answer if (!possibleAnswer.getConstructor().isDenotable() && !possibleAnswer.isCaptured()) return false + // e.g. if T has a lower bound 'Nothing' and an upper bound 'String', + // by default 'Nothing' is inferred which can lead to an error for reified type variable + if (typeVariable.isReified() && possibleAnswer.cannotBeReified()) return false + for (bound in bounds) { when (bound.kind) { LOWER_BOUND -> if (!JetTypeChecker.DEFAULT.isSubtypeOf(bound.constrainingType, possibleAnswer)) { diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.kt b/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.kt index da0081ac0eb..16f85cdf2b4 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/TypeUtils.kt @@ -26,6 +26,8 @@ import org.jetbrains.jet.lang.types.Flexibility import org.jetbrains.jet.lang.types.TypeConstructor import org.jetbrains.jet.utils.toReadOnlyList import org.jetbrains.jet.lang.types.checker.JetTypeChecker +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns +import org.jetbrains.jet.lang.types.isDynamic fun JetType.getContainedTypeParameters(): Collection { val declarationDescriptor = getConstructor().getDeclarationDescriptor() @@ -62,4 +64,6 @@ public fun JetType.getContainedAndCapturedTypeParameterConstructors(): Collectio public fun JetType.isSubtypeOf(superType: JetType): Boolean = JetTypeChecker.DEFAULT.isSubtypeOf(this, superType) +public fun JetType.cannotBeReified(): Boolean = KotlinBuiltIns.isNothingOrNullableNothing(this) || this.isDynamic() + diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index dba9662c38b..37e04bf5a35 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -664,11 +664,6 @@ public class KotlinBuiltIns { ); } - @NotNull - public JetType getArrayType(@NotNull JetType argument) { - return getArrayType(Variance.INVARIANT, argument); - } - @NotNull public JetType getEnumType(@NotNull JetType argument) { Variance projectionType = Variance.INVARIANT; diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AnnotationDeserializer.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AnnotationDeserializer.kt index 8916da54c87..ce93f7fdf25 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AnnotationDeserializer.kt +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AnnotationDeserializer.kt @@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.resolve.name.ClassId import org.jetbrains.jet.lang.types.ErrorUtils import org.jetbrains.jet.lang.descriptors.ClassKind +import org.jetbrains.jet.lang.types.Variance public class AnnotationDeserializer(private val module: ModuleDescriptor) { private val builtIns: KotlinBuiltIns @@ -97,7 +98,8 @@ public class AnnotationDeserializer(private val module: ModuleDescriptor) { val actualArrayType = if (arrayElements.isNotEmpty()) { val actualElementType = resolveArrayElementType(arrayElements.first(), nameResolver) - builtIns.getPrimitiveArrayJetTypeByPrimitiveJetType(actualElementType) ?: builtIns.getArrayType(actualElementType) + builtIns.getPrimitiveArrayJetTypeByPrimitiveJetType(actualElementType) ?: + builtIns.getArrayType(Variance.INVARIANT, actualElementType) } else { // In the case of empty array, no element has the element type, so we fall back to the expected type. diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/JetNameSuggester.java b/idea/src/org/jetbrains/jet/plugin/refactoring/JetNameSuggester.java index 5a09ce2e146..483c36bfdf7 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/JetNameSuggester.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/JetNameSuggester.java @@ -142,7 +142,8 @@ public class JetNameSuggester { else { if (jetType.getArguments().size() == 1) { JetType argument = jetType.getArguments().get(0).getType(); - if (typeChecker.equalTypes(builtIns.getArrayType(argument), jetType)) { + if ((KotlinBuiltIns.isArray(jetType) || KotlinBuiltIns.isPrimitiveArray(jetType)) && + typeChecker.equalTypes(argument, builtIns.getArrayElementType(jetType))) { if (typeChecker.equalTypes(builtIns.getBooleanType(), argument)) { addName(result, "booleans", validator); } diff --git a/libraries/stdlib/src/kotlin/collections/ArraysJVM.kt b/libraries/stdlib/src/kotlin/collections/ArraysJVM.kt index 5212a1bbbba..a106a0568ce 100644 --- a/libraries/stdlib/src/kotlin/collections/ArraysJVM.kt +++ b/libraries/stdlib/src/kotlin/collections/ArraysJVM.kt @@ -6,7 +6,7 @@ import java.util.Arrays import kotlin.jvm.internal.Intrinsic // Array "constructor" -[Intrinsic("kotlin.arrays.array")] public fun array(vararg t : T) : Array = t +[Intrinsic("kotlin.arrays.array")] public fun array(vararg t : T) : Array = t as Array // "constructors" for primitive types array [Intrinsic("kotlin.arrays.array")] public fun doubleArray(vararg content : Double) : DoubleArray = content