Checks for primitive types and arrays made static in KotlinBuiltIns
This commit is contained in:
@@ -851,7 +851,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
@Override
|
@Override
|
||||||
protected void assignToLoopParameter() {
|
protected void assignToLoopParameter() {
|
||||||
Type arrayElParamType;
|
Type arrayElParamType;
|
||||||
if (KotlinBuiltIns.getInstance().isArray(loopRangeType)) {
|
if (KotlinBuiltIns.isArray(loopRangeType)) {
|
||||||
arrayElParamType = boxType(asmElementType);
|
arrayElParamType = boxType(asmElementType);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -3438,7 +3438,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
args.add(va.getArgumentExpression());
|
args.add(va.getArgumentExpression());
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isArray = KotlinBuiltIns.getInstance().isArray(arrayType);
|
boolean isArray = KotlinBuiltIns.isArray(arrayType);
|
||||||
if (!isArray && args.size() != 1) {
|
if (!isArray && args.size() != 1) {
|
||||||
throw new CompilationException("primitive array constructor requires one argument", null, expression);
|
throw new CompilationException("primitive array constructor requires one argument", null, expression);
|
||||||
}
|
}
|
||||||
@@ -3492,7 +3492,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void newArrayInstruction(@NotNull JetType arrayType) {
|
public void newArrayInstruction(@NotNull JetType arrayType) {
|
||||||
if (KotlinBuiltIns.getInstance().isArray(arrayType)) {
|
if (KotlinBuiltIns.isArray(arrayType)) {
|
||||||
JetType elementJetType = arrayType.getArguments().get(0).getType();
|
JetType elementJetType = arrayType.getArguments().get(0).getType();
|
||||||
putReifierMarkerIfTypeIsReifiedParameter(
|
putReifierMarkerIfTypeIsReifiedParameter(
|
||||||
elementJetType,
|
elementJetType,
|
||||||
@@ -3519,7 +3519,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
|||||||
operationDescriptor.getValueParameters().get(0).getType().equals(KotlinBuiltIns.getInstance().getIntType())) {
|
operationDescriptor.getValueParameters().get(0).getType().equals(KotlinBuiltIns.getInstance().getIntType())) {
|
||||||
assert type != null;
|
assert type != null;
|
||||||
Type elementType;
|
Type elementType;
|
||||||
if (KotlinBuiltIns.getInstance().isArray(type)) {
|
if (KotlinBuiltIns.isArray(type)) {
|
||||||
JetType jetElementType = type.getArguments().get(0).getType();
|
JetType jetElementType = type.getArguments().get(0).getType();
|
||||||
elementType = boxType(asmType(jetElementType));
|
elementType = boxType(asmType(jetElementType));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ public class JetTypeMapper {
|
|||||||
return asmType;
|
return asmType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descriptor instanceof ClassDescriptor && KotlinBuiltIns.getInstance().isArray(jetType)) {
|
if (descriptor instanceof ClassDescriptor && KotlinBuiltIns.isArray(jetType)) {
|
||||||
if (jetType.getArguments().size() != 1) {
|
if (jetType.getArguments().size() != 1) {
|
||||||
throw new UnsupportedOperationException("arrays must have one type argument");
|
throw new UnsupportedOperationException("arrays must have one type argument");
|
||||||
}
|
}
|
||||||
@@ -683,11 +683,11 @@ public class JetTypeMapper {
|
|||||||
*/
|
*/
|
||||||
private static boolean forceBoxedReturnType(@NotNull FunctionDescriptor descriptor) {
|
private static boolean forceBoxedReturnType(@NotNull FunctionDescriptor descriptor) {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
if (!KotlinBuiltIns.getInstance().isPrimitiveType(descriptor.getReturnType())) return false;
|
if (!KotlinBuiltIns.isPrimitiveType(descriptor.getReturnType())) return false;
|
||||||
|
|
||||||
for (FunctionDescriptor overridden : getAllOverriddenDescriptors(descriptor)) {
|
for (FunctionDescriptor overridden : getAllOverriddenDescriptors(descriptor)) {
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
if (!KotlinBuiltIns.getInstance().isPrimitiveType(overridden.getOriginal().getReturnType())) return true;
|
if (!KotlinBuiltIns.isPrimitiveType(overridden.getOriginal().getReturnType())) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
+3
-3
@@ -373,7 +373,7 @@ public class SignaturesPropagationData {
|
|||||||
|
|
||||||
assert isArrayType(originalType);
|
assert isArrayType(originalType);
|
||||||
|
|
||||||
if (builtIns.isPrimitiveArray(originalType)) {
|
if (KotlinBuiltIns.isPrimitiveArray(originalType)) {
|
||||||
// replace IntArray? with IntArray
|
// replace IntArray? with IntArray
|
||||||
return new VarargCheckResult(TypeUtils.makeNotNullable(originalType), true);
|
return new VarargCheckResult(TypeUtils.makeNotNullable(originalType), true);
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ public class SignaturesPropagationData {
|
|||||||
|
|
||||||
assert isArrayType(originalType);
|
assert isArrayType(originalType);
|
||||||
|
|
||||||
if (builtIns.isPrimitiveArray(originalType)) {
|
if (KotlinBuiltIns.isPrimitiveArray(originalType)) {
|
||||||
// replace IntArray with IntArray?
|
// replace IntArray with IntArray?
|
||||||
return new VarargCheckResult(TypeUtils.makeNullable(originalType), false);
|
return new VarargCheckResult(TypeUtils.makeNullable(originalType), false);
|
||||||
}
|
}
|
||||||
@@ -682,7 +682,7 @@ public class SignaturesPropagationData {
|
|||||||
|
|
||||||
private static boolean isArrayType(@NotNull JetType type) {
|
private static boolean isArrayType(@NotNull JetType type) {
|
||||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||||
return builtIns.isArray(type) || builtIns.isPrimitiveArray(type);
|
return KotlinBuiltIns.isArray(type) || KotlinBuiltIns.isPrimitiveArray(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class VarargCheckResult {
|
private static class VarargCheckResult {
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
|
|||||||
DescriptorUtils.isClassObject(descriptor.getContainingDeclaration()) ||
|
DescriptorUtils.isClassObject(descriptor.getContainingDeclaration()) ||
|
||||||
DescriptorUtils.isStaticDeclaration(descriptor)) {
|
DescriptorUtils.isStaticDeclaration(descriptor)) {
|
||||||
val returnType = descriptor.getType()
|
val returnType = descriptor.getType()
|
||||||
return KotlinBuiltIns.getInstance().isPrimitiveType(returnType) || KotlinBuiltIns.getInstance().getStringType() == returnType
|
return KotlinBuiltIns.isPrimitiveType(returnType) || KotlinBuiltIns.isString(returnType)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,13 +72,13 @@ public class CompileTimeConstantUtils {
|
|||||||
if (isEnumClass(typeDescriptor) ||
|
if (isEnumClass(typeDescriptor) ||
|
||||||
isAnnotationClass(typeDescriptor) ||
|
isAnnotationClass(typeDescriptor) ||
|
||||||
isJavaLangClass(typeDescriptor) ||
|
isJavaLangClass(typeDescriptor) ||
|
||||||
builtIns.isPrimitiveArray(parameterType) ||
|
KotlinBuiltIns.isPrimitiveArray(parameterType) ||
|
||||||
builtIns.isPrimitiveType(parameterType) ||
|
KotlinBuiltIns.isPrimitiveType(parameterType) ||
|
||||||
builtIns.getStringType().equals(parameterType)) {
|
builtIns.getStringType().equals(parameterType)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (builtIns.isArray(parameterType)) {
|
if (KotlinBuiltIns.isArray(parameterType)) {
|
||||||
List<TypeProjection> arguments = parameterType.getArguments();
|
List<TypeProjection> arguments = parameterType.getArguments();
|
||||||
if (arguments.size() == 1) {
|
if (arguments.size() == 1) {
|
||||||
JetType arrayType = arguments.get(0).getType();
|
JetType arrayType = arguments.get(0).getType();
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.psi.JetDeclaration;
|
|||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
import org.jetbrains.jet.lang.psi.JetNamedFunction;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
|
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.TypeProjection;
|
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
@@ -69,7 +68,7 @@ public class MainFunctionDetector {
|
|||||||
ValueParameterDescriptor parameter = parameters.get(0);
|
ValueParameterDescriptor parameter = parameters.get(0);
|
||||||
JetType parameterType = parameter.getType();
|
JetType parameterType = parameter.getType();
|
||||||
KotlinBuiltIns kotlinBuiltIns = KotlinBuiltIns.getInstance();
|
KotlinBuiltIns kotlinBuiltIns = KotlinBuiltIns.getInstance();
|
||||||
if (kotlinBuiltIns.isArray(parameterType)) {
|
if (KotlinBuiltIns.isArray(parameterType)) {
|
||||||
List<TypeProjection> typeArguments = parameterType.getArguments();
|
List<TypeProjection> typeArguments = parameterType.getArguments();
|
||||||
if (typeArguments.size() == 1) {
|
if (typeArguments.size() == 1) {
|
||||||
JetType typeArgument = typeArguments.get(0).getType();
|
JetType typeArgument = typeArguments.get(0).getType();
|
||||||
|
|||||||
+1
-1
@@ -308,7 +308,7 @@ class LazyJavaTypeResolver(
|
|||||||
// foo(int) and foo(Integer)
|
// foo(int) and foo(Integer)
|
||||||
// if we do not discriminate one of them, any call to foo(kotlin.Int) will result in overload resolution ambiguity
|
// if we do not discriminate one of them, any call to foo(kotlin.Int) will result in overload resolution ambiguity
|
||||||
// so, for such cases, we discriminate Integer in favour of int
|
// so, for such cases, we discriminate Integer in favour of int
|
||||||
if (!KotlinBuiltIns.getInstance().isPrimitiveType(otherType) || !KotlinBuiltIns.getInstance().isPrimitiveType(lowerBound)) {
|
if (!KotlinBuiltIns.isPrimitiveType(otherType) || !KotlinBuiltIns.isPrimitiveType(lowerBound)) {
|
||||||
return Specificity.Relation.DONT_KNOW
|
return Specificity.Relation.DONT_KNOW
|
||||||
}
|
}
|
||||||
// Int! >< Int?
|
// Int! >< Int?
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ public class DescriptorUtils {
|
|||||||
if (type instanceof LazyType || type.isNullable()) return true;
|
if (type instanceof LazyType || type.isNullable()) return true;
|
||||||
|
|
||||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||||
return builtIns.isPrimitiveType(type) ||
|
return KotlinBuiltIns.isPrimitiveType(type) ||
|
||||||
JetTypeChecker.DEFAULT.equalTypes(builtIns.getStringType(), type) ||
|
JetTypeChecker.DEFAULT.equalTypes(builtIns.getStringType(), type) ||
|
||||||
JetTypeChecker.DEFAULT.equalTypes(builtIns.getNumber().getDefaultType(), type) ||
|
JetTypeChecker.DEFAULT.equalTypes(builtIns.getNumber().getDefaultType(), type) ||
|
||||||
JetTypeChecker.DEFAULT.equalTypes(builtIns.getAnyType(), type);
|
JetTypeChecker.DEFAULT.equalTypes(builtIns.getAnyType(), type);
|
||||||
|
|||||||
@@ -155,11 +155,24 @@ public class KotlinBuiltIns {
|
|||||||
public final FqNameUnsafe suppress = fqNameUnsafe("suppress");
|
public final FqNameUnsafe suppress = fqNameUnsafe("suppress");
|
||||||
public final FqNameUnsafe unit = fqNameUnsafe("Unit");
|
public final FqNameUnsafe unit = fqNameUnsafe("Unit");
|
||||||
public final FqNameUnsafe string = fqNameUnsafe("String");
|
public final FqNameUnsafe string = fqNameUnsafe("String");
|
||||||
|
public final FqNameUnsafe array = fqNameUnsafe("Array");
|
||||||
|
|
||||||
public final FqName data = fqName("data");
|
public final FqName data = fqName("data");
|
||||||
public final FqName deprecated = fqName("deprecated");
|
public final FqName deprecated = fqName("deprecated");
|
||||||
public final FqName tailRecursive = fqName("tailRecursive");
|
public final FqName tailRecursive = fqName("tailRecursive");
|
||||||
public final FqName noinline = fqName("noinline");
|
public final FqName noinline = fqName("noinline");
|
||||||
|
|
||||||
|
public final Set<FqNameUnsafe> primitiveTypes;
|
||||||
|
public final Set<FqNameUnsafe> primitiveArrays;
|
||||||
|
{
|
||||||
|
primitiveTypes = new HashSet<FqNameUnsafe>(0);
|
||||||
|
primitiveArrays = new HashSet<FqNameUnsafe>(0);
|
||||||
|
for (PrimitiveType primitiveType : PrimitiveType.values()) {
|
||||||
|
primitiveTypes.add(fqNameUnsafe(primitiveType.getTypeName().asString()));
|
||||||
|
primitiveArrays.add(fqNameUnsafe(primitiveType.getArrayTypeName().asString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final Set<FqNameUnsafe> functionClasses = computeIndexedFqNames("Function", FUNCTION_TRAIT_COUNT);
|
public final Set<FqNameUnsafe> functionClasses = computeIndexedFqNames("Function", FUNCTION_TRAIT_COUNT);
|
||||||
public final Set<FqNameUnsafe> extensionFunctionClasses = computeIndexedFqNames("ExtensionFunction", FUNCTION_TRAIT_COUNT);
|
public final Set<FqNameUnsafe> extensionFunctionClasses = computeIndexedFqNames("ExtensionFunction", FUNCTION_TRAIT_COUNT);
|
||||||
|
|
||||||
@@ -612,7 +625,7 @@ public class KotlinBuiltIns {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JetType getArrayElementType(@NotNull JetType arrayType) {
|
public JetType getArrayElementType(@NotNull JetType arrayType) {
|
||||||
if (arrayType.getConstructor().getDeclarationDescriptor() == getArray()) {
|
if (isArray(arrayType)) {
|
||||||
if (arrayType.getArguments().size() != 1) {
|
if (arrayType.getArguments().size() != 1) {
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
@@ -725,16 +738,18 @@ public class KotlinBuiltIns {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public boolean isArray(@NotNull JetType type) {
|
public static boolean isArray(@NotNull JetType type) {
|
||||||
return getArray().equals(type.getConstructor().getDeclarationDescriptor());
|
return isConstructedFromGivenClass(type, FQ_NAMES.array);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPrimitiveArray(@NotNull JetType type) {
|
public static boolean isPrimitiveArray(@NotNull JetType type) {
|
||||||
return jetArrayTypeToPrimitiveJetType.containsKey(TypeUtils.makeNotNullable(type));
|
ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
|
||||||
|
return descriptor != null && FQ_NAMES.primitiveArrays.contains(DescriptorUtils.getFqName(descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPrimitiveType(@NotNull JetType type) {
|
public static boolean isPrimitiveType(@NotNull JetType type) {
|
||||||
return primitiveJetTypeToJetArrayType.containsKey(type);
|
ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
|
||||||
|
return !type.isNullable() && descriptor != null && FQ_NAMES.primitiveTypes.contains(DescriptorUtils.getFqName(descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ fun generate(): String {
|
|||||||
val builtIns = KotlinBuiltIns.getInstance()
|
val builtIns = KotlinBuiltIns.getInstance()
|
||||||
[suppress("UNCHECKED_CAST")]
|
[suppress("UNCHECKED_CAST")]
|
||||||
val allPrimitiveTypes = builtIns.getBuiltInsPackageScope().getDescriptors()
|
val allPrimitiveTypes = builtIns.getBuiltInsPackageScope().getDescriptors()
|
||||||
.filter { it is ClassDescriptor && builtIns.isPrimitiveType(it.getDefaultType()) } as List<ClassDescriptor>
|
.filter { it is ClassDescriptor && KotlinBuiltIns.isPrimitiveType(it.getDefaultType()) } as List<ClassDescriptor>
|
||||||
|
|
||||||
for (descriptor in allPrimitiveTypes + builtIns.getString()) {
|
for (descriptor in allPrimitiveTypes + builtIns.getString()) {
|
||||||
[suppress("UNCHECKED_CAST")]
|
[suppress("UNCHECKED_CAST")]
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class ReplaceWithOperatorAssignIntention : JetSelfTargetingIntention<JetB
|
|||||||
fun checkExpressionRepeat(variableExpression: JetSimpleNameExpression, expression: JetBinaryExpression): Boolean {
|
fun checkExpressionRepeat(variableExpression: JetSimpleNameExpression, expression: JetBinaryExpression): Boolean {
|
||||||
val context = expression.analyze()
|
val context = expression.analyze()
|
||||||
val descriptor = context[BindingContext.REFERENCE_TARGET, expression.getOperationReference()]?.getContainingDeclaration()
|
val descriptor = context[BindingContext.REFERENCE_TARGET, expression.getOperationReference()]?.getContainingDeclaration()
|
||||||
val isPrimitiveOperation = descriptor is ClassDescriptor && KotlinBuiltIns.getInstance().isPrimitiveType(descriptor.getDefaultType())
|
val isPrimitiveOperation = descriptor is ClassDescriptor && KotlinBuiltIns.isPrimitiveType(descriptor.getDefaultType())
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
variableExpression.matches(expression.getLeft()) -> {
|
variableExpression.matches(expression.getLeft()) -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user