Add JavaValueParameter.isVararg()

This commit is contained in:
Alexander Udalov
2013-08-02 21:39:17 +04:00
parent be5ba7fa0d
commit 4e1fb7e0eb
3 changed files with 20 additions and 19 deletions
@@ -142,10 +142,8 @@ class PropagationHeuristics {
Collection<JavaValueParameter> valueParameters = initialMethod.getValueParameters(); Collection<JavaValueParameter> valueParameters = initialMethod.getValueParameters();
initialParametersErasure = Lists.newArrayListWithExpectedSize(valueParameters.size()); initialParametersErasure = Lists.newArrayListWithExpectedSize(valueParameters.size());
for (Iterator<JavaValueParameter> iterator = valueParameters.iterator(); iterator.hasNext(); ) { for (JavaValueParameter parameter : valueParameters) {
JavaType type = iterator.next().getType(); initialParametersErasure.add(erasure(varargToArray(parameter.getType(), parameter.isVararg())));
boolean isVararg = initialMethod.isVararg() && !iterator.hasNext();
initialParametersErasure.add(erasure(varargToArray(type, isVararg)));
} }
} }
@@ -199,13 +197,14 @@ class PropagationHeuristics {
Iterator<JavaValueParameter> superIterator = fromSuperParameters.iterator(); Iterator<JavaValueParameter> superIterator = fromSuperParameters.iterator();
while (originalIterator.hasNext()) { while (originalIterator.hasNext()) {
JavaType originalType = originalIterator.next(); 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(typeFromSuper)) {
if (!originalType.equals(typeFromSuperErased)) {
return false; return false;
} }
} }
@@ -33,7 +33,10 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import javax.inject.Inject; 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 { public final class JavaValueParameterResolver {
private JavaTypeTransformer typeTransformer; private JavaTypeTransformer typeTransformer;
@@ -43,8 +46,7 @@ public final class JavaValueParameterResolver {
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
int i, int i,
@NotNull JavaValueParameter parameter, @NotNull JavaValueParameter parameter,
@NotNull TypeVariableResolver typeVariableResolver, @NotNull TypeVariableResolver typeVariableResolver
boolean isVararg
) { ) {
TypeUsage typeUsage = JavaAnnotationResolver.hasMutableAnnotation(parameter) TypeUsage typeUsage = JavaAnnotationResolver.hasMutableAnnotation(parameter)
? TypeUsage.MEMBER_SIGNATURE_COVARIANT ? TypeUsage.MEMBER_SIGNATURE_COVARIANT
@@ -54,7 +56,7 @@ public final class JavaValueParameterResolver {
JetType varargElementType; JetType varargElementType;
JetType outType; JetType outType;
if (isVararg) { if (parameter.isVararg()) {
// TODO: test this code // TODO: test this code
assert parameterType instanceof JavaArrayType : "Vararg parameter should be an array: " + parameterType; assert parameterType instanceof JavaArrayType : "Vararg parameter should be an array: " + parameterType;
JetType arrayType = typeTransformer.transformVarargType(((JavaArrayType) parameterType), typeUsage, typeVariableResolver); JetType arrayType = typeTransformer.transformVarargType(((JavaArrayType) parameterType), typeUsage, typeVariableResolver);
@@ -103,12 +105,8 @@ public final class JavaValueParameterResolver {
Collection<JavaValueParameter> parameters = method.getValueParameters(); Collection<JavaValueParameter> parameters = method.getValueParameters();
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(parameters.size()); List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(parameters.size());
int index = 0; int index = 0;
for (Iterator<JavaValueParameter> iterator = parameters.iterator(); iterator.hasNext(); ) { for (JavaValueParameter parameter : parameters) {
JavaValueParameter parameter = iterator.next(); result.add(resolveValueParameter(container, index, parameter, typeVariableResolver));
boolean isVararg = method.isVararg() && !iterator.hasNext();
ValueParameterDescriptor descriptor = resolveValueParameter(container, index, parameter, typeVariableResolver, isVararg);
result.add(descriptor);
index++; index++;
} }
return new ValueParameters(null, result); return new ValueParameters(null, result);
@@ -57,4 +57,8 @@ public class JavaValueParameter extends JavaElementImpl implements JavaAnnotatio
public JavaType getType() { public JavaType getType() {
return JavaType.create(getPsi().getType()); return JavaType.create(getPsi().getType());
} }
public boolean isVararg() {
return getPsi().isVarArgs();
}
} }