From 4e1fb7e0ebbe51c46b70bcdbd9a988105acad5b7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 2 Aug 2013 21:39:17 +0400 Subject: [PATCH] Add JavaValueParameter.isVararg() --- .../kotlinSignature/PropagationHeuristics.java | 17 ++++++++--------- .../resolver/JavaValueParameterResolver.java | 18 ++++++++---------- .../java/structure/JavaValueParameter.java | 4 ++++ 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/PropagationHeuristics.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/PropagationHeuristics.java index 734442caef1..3effb7dfe4b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/PropagationHeuristics.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/PropagationHeuristics.java @@ -142,10 +142,8 @@ class PropagationHeuristics { Collection valueParameters = initialMethod.getValueParameters(); initialParametersErasure = Lists.newArrayListWithExpectedSize(valueParameters.size()); - for (Iterator iterator = valueParameters.iterator(); iterator.hasNext(); ) { - JavaType type = iterator.next().getType(); - boolean isVararg = initialMethod.isVararg() && !iterator.hasNext(); - initialParametersErasure.add(erasure(varargToArray(type, isVararg))); + for (JavaValueParameter parameter : valueParameters) { + initialParametersErasure.add(erasure(varargToArray(parameter.getType(), parameter.isVararg()))); } } @@ -199,13 +197,14 @@ class PropagationHeuristics { Iterator superIterator = fromSuperParameters.iterator(); while (originalIterator.hasNext()) { JavaType originalType = originalIterator.next(); - JavaType typeFromSuper = superIterator.next().getType(); + JavaValueParameter parameterFromSuper = superIterator.next(); - boolean isVarargType = methodFromSuper.isVararg() && !superIterator.hasNext(); + JavaType typeFromSuper = erasure(varargToArray( + supertypeSubstitutor.substitute(parameterFromSuper.getType()), + parameterFromSuper.isVararg() + )); - JavaType typeFromSuperErased = erasure(varargToArray(supertypeSubstitutor.substitute(typeFromSuper), isVarargType)); - - if (!originalType.equals(typeFromSuperErased)) { + if (!originalType.equals(typeFromSuper)) { return false; } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaValueParameterResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaValueParameterResolver.java index 81df82effa3..32d17c361d4 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaValueParameterResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaValueParameterResolver.java @@ -33,7 +33,10 @@ import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import javax.inject.Inject; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; public final class JavaValueParameterResolver { private JavaTypeTransformer typeTransformer; @@ -43,8 +46,7 @@ public final class JavaValueParameterResolver { @NotNull DeclarationDescriptor containingDeclaration, int i, @NotNull JavaValueParameter parameter, - @NotNull TypeVariableResolver typeVariableResolver, - boolean isVararg + @NotNull TypeVariableResolver typeVariableResolver ) { TypeUsage typeUsage = JavaAnnotationResolver.hasMutableAnnotation(parameter) ? TypeUsage.MEMBER_SIGNATURE_COVARIANT @@ -54,7 +56,7 @@ public final class JavaValueParameterResolver { JetType varargElementType; JetType outType; - if (isVararg) { + if (parameter.isVararg()) { // TODO: test this code assert parameterType instanceof JavaArrayType : "Vararg parameter should be an array: " + parameterType; JetType arrayType = typeTransformer.transformVarargType(((JavaArrayType) parameterType), typeUsage, typeVariableResolver); @@ -103,12 +105,8 @@ public final class JavaValueParameterResolver { Collection parameters = method.getValueParameters(); List result = new ArrayList(parameters.size()); int index = 0; - for (Iterator iterator = parameters.iterator(); iterator.hasNext(); ) { - JavaValueParameter parameter = iterator.next(); - - boolean isVararg = method.isVararg() && !iterator.hasNext(); - ValueParameterDescriptor descriptor = resolveValueParameter(container, index, parameter, typeVariableResolver, isVararg); - result.add(descriptor); + for (JavaValueParameter parameter : parameters) { + result.add(resolveValueParameter(container, index, parameter, typeVariableResolver)); index++; } return new ValueParameters(null, result); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaValueParameter.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaValueParameter.java index 00d6627b333..756bfb43326 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaValueParameter.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/JavaValueParameter.java @@ -57,4 +57,8 @@ public class JavaValueParameter extends JavaElementImpl implements JavaAnnotatio public JavaType getType() { return JavaType.create(getPsi().getType()); } + + public boolean isVararg() { + return getPsi().isVarArgs(); + } }