From 596874063827f36e6e6b7530121edaa63c63f897 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 16 Jun 2011 20:06:57 +0400 Subject: [PATCH] 'this()' resolution fixed for generic classes --- .../jet/lang/types/JetTypeInferrer.java | 59 +++++++++++-------- .../ThisConstructorInGenericClass.jet | 3 + 2 files changed, 38 insertions(+), 24 deletions(-) create mode 100644 idea/testData/checker/regression/ThisConstructorInGenericClass.jet diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 9f13ebb016c..1281337438e 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -403,6 +403,19 @@ public class JetTypeInferrer { } } + List typeArguments = new ArrayList(); + for (JetTypeProjection projection : jetTypeArguments) { + // TODO : check that there's no projection + JetTypeReference typeReference = projection.getTypeReference(); + if (typeReference != null) { + typeArguments.add(typeResolver.resolveType(scope, typeReference)); + } + } + + return resolveCallWithTypeArguments(scope, overloadDomain, call, typeArguments); + } + + private JetType resolveCallWithTypeArguments(JetScope scope, OverloadDomain overloadDomain, JetCall call, List typeArguments) { final List valueArguments = call.getValueArguments(); boolean someNamed = false; @@ -424,15 +437,6 @@ public class JetTypeInferrer { // result = overloadDomain.getFunctionDescriptorForNamedArguments(typeArguments, valueArguments, functionLiteralArgument); } else { - List typeArguments = new ArrayList(); - for (JetTypeProjection projection : jetTypeArguments) { - // TODO : check that there's no projection - JetTypeReference typeReference = projection.getTypeReference(); - if (typeReference != null) { - typeArguments.add(typeResolver.resolveType(scope, typeReference)); - } - } - List positionedValueArguments = new ArrayList(); for (JetArgument argument : valueArguments) { JetExpression argumentExpression = argument.getArgumentExpression(); @@ -452,7 +456,7 @@ public class JetTypeInferrer { if (resolutionResult.isSuccess()) { final FunctionDescriptor functionDescriptor = resolutionResult.getFunctionDescriptor(); - checkGenericBoundsInAFunctionCall(jetTypeArguments, typeArguments, functionDescriptor); + checkGenericBoundsInAFunctionCall(call.getTypeArguments(), typeArguments, functionDescriptor); return functionDescriptor.getUnsubstitutedReturnType(); } } @@ -542,23 +546,30 @@ public class JetTypeInferrer { // // The code below upcasts the type automatically - List typeArguments = receiverType.getArguments(); - - List projectionsStripped = new ArrayList(); - for (TypeProjection typeArgument : typeArguments) { - if (typeArgument.getProjectionKind() != Variance.INVARIANT) { - projectionsStripped.add(new TypeProjection(typeArgument.getType())); - } - else - projectionsStripped.add(typeArgument); - } FunctionGroup constructors = classDescriptor.getConstructors(); OverloadDomain constructorsOverloadDomain = semanticServices.getOverloadResolver().getOverloadDomain(null, constructors); - JetType constructorReturnedType = resolveCall( - scope, - wrapForTracing(constructorsOverloadDomain, referenceExpression, call.getValueArgumentList(), false), - call); + + JetType constructorReturnedType; + if (call instanceof JetDelegatorToThisCall) { + List typeArguments = receiverType.getArguments(); + + List projectionsStripped = Lists.newArrayList(); + for (TypeProjection typeArgument : typeArguments) { + projectionsStripped.add(typeArgument.getType()); + } + + constructorReturnedType = resolveCallWithTypeArguments( + scope, + wrapForTracing(constructorsOverloadDomain, referenceExpression, call.getValueArgumentList(), false), + call, projectionsStripped); + } + else { + constructorReturnedType = resolveCall( + scope, + wrapForTracing(constructorsOverloadDomain, referenceExpression, call.getValueArgumentList(), false), + call); + } if (constructorReturnedType == null && !ErrorUtils.isErrorType(receiverType)) { DeclarationDescriptor declarationDescriptor = receiverType.getConstructor().getDeclarationDescriptor(); assert declarationDescriptor != null; diff --git a/idea/testData/checker/regression/ThisConstructorInGenericClass.jet b/idea/testData/checker/regression/ThisConstructorInGenericClass.jet new file mode 100644 index 00000000000..cb4408bd600 --- /dev/null +++ b/idea/testData/checker/regression/ThisConstructorInGenericClass.jet @@ -0,0 +1,3 @@ +class Z() { + this(x : Int) : this() {} +} \ No newline at end of file