Merged similar methods into getVarargParameterType.

This commit is contained in:
Evgeny Gerashchenko
2012-11-29 17:36:12 +04:00
parent a739964c74
commit a4a7e5818c
3 changed files with 28 additions and 29 deletions
@@ -26,7 +26,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.CollectionClassMapping;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
@@ -38,6 +37,9 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFQName;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getVarargParameterType;
public class SignaturesPropagationData {
private final List<TypeParameterDescriptor> modifiedTypeParameters;
private final JavaDescriptorResolver.ValueParameterDescriptors modifiedValueParameters;
@@ -210,8 +212,8 @@ public class SignaturesPropagationData {
Collections.sort(superFunctions, new Comparator<FunctionDescriptor>() {
@Override
public int compare(FunctionDescriptor fun1, FunctionDescriptor fun2) {
FqNameUnsafe fqName1 = DescriptorUtils.getFQName(fun1.getContainingDeclaration());
FqNameUnsafe fqName2 = DescriptorUtils.getFQName(fun2.getContainingDeclaration());
FqNameUnsafe fqName1 = getFQName(fun1.getContainingDeclaration());
FqNameUnsafe fqName2 = getFQName(fun2.getContainingDeclaration());
return fqName1.getFqName().compareTo(fqName2.getFqName());
}
});
@@ -244,13 +246,14 @@ public class SignaturesPropagationData {
// convert to vararg; replace Array<out Foo>? with Array<Foo>
JetType varargElementType = KotlinBuiltIns.getInstance().getArrayElementType(originalType);
return new VarargCheckResult(getArrayType(varargElementType, Variance.INVARIANT), true);
return new VarargCheckResult(getVarargParameterType(varargElementType), true);
}
else if (someSupersNotVararg && originalVarargElementType != null) {
assert isArrayType(originalType);
// convert to non-vararg; replace Array<Foo> with Array<out Foo>?
return new VarargCheckResult(TypeUtils.makeNullable(getArrayType(originalVarargElementType, Variance.OUT_VARIANCE)), false);
return new VarargCheckResult(TypeUtils.makeNullable(getVarargParameterType(originalVarargElementType, Variance.OUT_VARIANCE)),
false);
}
return new VarargCheckResult(originalType, originalVarargElementType != null);
@@ -524,18 +527,6 @@ public class SignaturesPropagationData {
return builtIns.isArray(type) || builtIns.isPrimitiveArray(type);
}
@NotNull
private static JetType getArrayType(@NotNull JetType elementType, @NotNull Variance projectionKind) {
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
JetType primitiveArrayType = builtIns.getPrimitiveArrayJetTypeByPrimitiveJetType(elementType);
if (primitiveArrayType != null) {
return primitiveArrayType;
}
else {
return builtIns.getArrayType(projectionKind, elementType);
}
}
private static class VarargCheckResult {
public final JetType parameterType;
public final boolean isVararg;
@@ -474,7 +474,7 @@ public class DescriptorResolver {
JetType variableType = type;
if (valueParameter.hasModifier(JetTokens.VARARG_KEYWORD)) {
varargElementType = type;
variableType = getVarargParameterType(type);
variableType = DescriptorUtils.getVarargParameterType(type);
}
MutableValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl(
declarationDescriptor,
@@ -491,16 +491,6 @@ public class DescriptorResolver {
return valueParameterDescriptor;
}
private JetType getVarargParameterType(JetType type) {
JetType arrayType = KotlinBuiltIns.getInstance().getPrimitiveArrayJetTypeByPrimitiveJetType(type);
if (arrayType != null) {
return arrayType;
}
else {
return KotlinBuiltIns.getInstance().getArrayType(type);
}
}
public List<TypeParameterDescriptorImpl> resolveTypeParametersForCallableDescriptor(
DeclarationDescriptor containingDescriptor,
WritableScope extensibleScope,
@@ -705,7 +695,7 @@ public class DescriptorResolver {
type = ErrorUtils.createErrorType("Annotation is absent");
}
if (parameter.hasModifier(JetTokens.VARARG_KEYWORD)) {
return getVarargParameterType(type);
return DescriptorUtils.getVarargParameterType(type);
}
return type;
}
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.DescriptorSubstitutor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.Variance;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -391,4 +392,21 @@ public class DescriptorUtils {
return propertyDescriptor.getVisibility() != Visibilities.PRIVATE || isClassObject(propertyDescriptor.getContainingDeclaration())
|| propertyDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor;
}
@NotNull
public static JetType getVarargParameterType(@NotNull JetType elementType) {
return getVarargParameterType(elementType, Variance.INVARIANT);
}
@NotNull
public static JetType getVarargParameterType(@NotNull JetType elementType, @NotNull Variance projectionKind) {
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
JetType primitiveArrayType = builtIns.getPrimitiveArrayJetTypeByPrimitiveJetType(elementType);
if (primitiveArrayType != null) {
return primitiveArrayType;
}
else {
return builtIns.getArrayType(projectionKind, elementType);
}
}
}