[FIR] Ignore expected type for resolve constant expressions

This commit is contained in:
Dmitriy Novozhilov
2019-11-13 14:21:00 +03:00
parent 6a3c07688f
commit 2a74e37e28
13 changed files with 41 additions and 117 deletions
@@ -398,42 +398,28 @@ class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransformer) :
}
override fun <T> transformConstExpression(constExpression: FirConstExpression<T>, data: ResolutionMode): CompositeTransformResult<FirStatement> {
val expectedType = data.expectedType
// TODO: add support of IntegerLiteralType
val kind = constExpression.kind
if (expectedType == null || expectedType is FirImplicitTypeRef ||
kind == IrConstKind.Null || kind == IrConstKind.Boolean || kind == IrConstKind.Char
) {
val symbol = when (kind) {
IrConstKind.Null -> StandardClassIds.Nothing(symbolProvider)
IrConstKind.Boolean -> StandardClassIds.Boolean(symbolProvider)
IrConstKind.Char -> StandardClassIds.Char(symbolProvider)
IrConstKind.Byte -> StandardClassIds.Byte(symbolProvider)
IrConstKind.Short -> StandardClassIds.Short(symbolProvider)
IrConstKind.Int -> StandardClassIds.Int(symbolProvider)
IrConstKind.Long -> StandardClassIds.Long(symbolProvider)
IrConstKind.String -> StandardClassIds.String(symbolProvider)
IrConstKind.Float -> StandardClassIds.Float(symbolProvider)
IrConstKind.Double -> StandardClassIds.Double(symbolProvider)
}
val type = ConeClassTypeImpl(symbol.toLookupTag(), emptyArray(), isNullable = kind == IrConstKind.Null)
constExpression.resultType = FirResolvedTypeRefImpl(null, type)
} else {
constExpression.resultType = if (kind != IrConstKind.Null) {
expectedType.resolvedTypeFromPrototype(
expectedType.coneTypeUnsafe<ConeKotlinType>().withNullability(ConeNullability.NOT_NULL)
)
} else {
expectedType
}
val symbol = when (kind) {
IrConstKind.Null -> StandardClassIds.Nothing(symbolProvider)
IrConstKind.Boolean -> StandardClassIds.Boolean(symbolProvider)
IrConstKind.Char -> StandardClassIds.Char(symbolProvider)
IrConstKind.Byte -> StandardClassIds.Byte(symbolProvider)
IrConstKind.Short -> StandardClassIds.Short(symbolProvider)
IrConstKind.Int -> StandardClassIds.Int(symbolProvider)
IrConstKind.Long -> StandardClassIds.Long(symbolProvider)
IrConstKind.String -> StandardClassIds.String(symbolProvider)
IrConstKind.Float -> StandardClassIds.Float(symbolProvider)
IrConstKind.Double -> StandardClassIds.Double(symbolProvider)
}
val type = ConeClassTypeImpl(symbol.toLookupTag(), emptyArray(), isNullable = kind == IrConstKind.Null)
return transformExpression(constExpression, data).also {
dataFlowAnalyzer.exitConstExpresion(it.single as FirConstExpression<*>)
}
constExpression.resultType = FirResolvedTypeRefImpl(null, type)
dataFlowAnalyzer.exitConstExpresion(constExpression as FirConstExpression<*>)
return constExpression.compose()
}
override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: ResolutionMode): CompositeTransformResult<FirStatement> {
+1 -1
View File
@@ -1,5 +1,5 @@
FILE: functionX.kt
public final val x: R|kotlin/jvm/functions/Function0<kotlin/Int>| = fun <anonymous>(): R|kotlin/jvm/functions/Function0<kotlin/Int>| {
public final val x: R|kotlin/jvm/functions/Function0<kotlin/Int>| = fun <anonymous>(): R|kotlin/Int| {
Int(42)
}
@@ -8,7 +8,7 @@ FILE fqName:<root> fileName:/localDelegatedProperties.kt
BLOCK_BODY
VAR name:x type:IrErrorType [var]
SET_VAR 'var x: IrErrorType [var] declared in <root>.test2' type=IrErrorType origin=null
CONST Int type=IrErrorType value=0
CONST Int type=kotlin.Int value=0
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:IrErrorType [val]
GET_VAR 'var x: IrErrorType [var] declared in <root>.test2' type=IrErrorType origin=null
SET_VAR 'var x: IrErrorType [var] declared in <root>.test2' type=IrErrorType origin=null
@@ -2,10 +2,10 @@ FILE fqName:<root> fileName:/coercionToUnit.kt
PROPERTY name:test1 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.Function0<kotlin.Unit> visibility:private [final,static]
EXPRESSION_BODY
FUN_EXPR type=kotlin.Function0<kotlin.Unit> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Unit
FUN_EXPR type=kotlin.Function0<kotlin.Int> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> () returnType:kotlin.Int
BLOCK_BODY
CONST Int type=kotlin.Unit value=42
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1> visibility:public modality:FINAL <> () returnType:kotlin.Function0<kotlin.Unit>
correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -131,7 +131,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
PROPERTY name:recivier visibility:public modality:FINAL [var]
FIELD PROPERTY_BACKING_FIELD name:recivier type:kotlin.Any? visibility:private [static]
EXPRESSION_BODY
CONST String type=kotlin.Any value="fail"
CONST String type=kotlin.String value="fail"
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-recivier> visibility:public modality:FINAL <> () returnType:kotlin.Any?
correspondingProperty: PROPERTY name:recivier visibility:public modality:FINAL [var]
BLOCK_BODY
@@ -146,7 +146,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
PROPERTY name:value2 visibility:public modality:FINAL [var]
FIELD PROPERTY_BACKING_FIELD name:value2 type:kotlin.Any? visibility:private [static]
EXPRESSION_BODY
CONST String type=kotlin.Any value="fail2"
CONST String type=kotlin.String value="fail2"
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-value2> visibility:public modality:FINAL <> () returnType:kotlin.Any?
correspondingProperty: PROPERTY name:value2 visibility:public modality:FINAL [var]
BLOCK_BODY
@@ -1,64 +0,0 @@
FILE fqName:<root> fileName:/jvmStaticFieldReference.kt
FUN name:testFun visibility:public modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
CALL 'public open fun println (p0: kotlin.String?): kotlin.Unit declared in java.io.PrintStream' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:out type:java.io.PrintStream? visibility:public [final,static]' type=java.io.PrintStream? origin=GET_PROPERTY
p0: CONST String type=kotlin.String value="testFun"
PROPERTY name:testProp visibility:public modality:FINAL [var]
FUN name:<get-testProp> visibility:public modality:FINAL <> () returnType:kotlin.Any
correspondingProperty: PROPERTY name:testProp visibility:public modality:FINAL [var]
BLOCK_BODY
CALL 'public open fun println (p0: kotlin.String?): kotlin.Unit declared in java.io.PrintStream' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:out type:java.io.PrintStream? visibility:public [final,static]' type=java.io.PrintStream? origin=GET_PROPERTY
p0: CONST String type=kotlin.String value="testProp/get"
RETURN type=kotlin.Nothing from='public final fun <get-testProp> (): kotlin.Any declared in <root>'
CONST Int type=kotlin.Any value=42
FUN name:<set-testProp> visibility:public modality:FINAL <> (value:kotlin.Any) returnType:kotlin.Unit
correspondingProperty: PROPERTY name:testProp visibility:public modality:FINAL [var]
VALUE_PARAMETER name:value index:0 type:kotlin.Any
BLOCK_BODY
CALL 'public open fun println (p0: kotlin.String?): kotlin.Unit declared in java.io.PrintStream' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:out type:java.io.PrintStream? visibility:public [final,static]' type=java.io.PrintStream? origin=GET_PROPERTY
p0: CONST String type=kotlin.String value="testProp/set"
CLASS CLASS name:TestClass modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestClass
CONSTRUCTOR visibility:public <> () returnType:<root>.TestClass [primary]
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestClass modality:FINAL visibility:public superTypes:[kotlin.Any]'
PROPERTY name:test visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.Int visibility:private [final]
EXPRESSION_BODY
WHEN type=kotlin.Int origin=WHEN
BRANCH
if: CONST Boolean type=kotlin.Boolean value=true
then: BLOCK type=kotlin.Int origin=null
CALL 'public open fun println (p0: kotlin.String?): kotlin.Unit declared in java.io.PrintStream' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:out type:java.io.PrintStream? visibility:public [final,static]' type=java.io.PrintStream? origin=GET_PROPERTY
p0: CONST String type=kotlin.String value="TestClass/test"
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test> visibility:public modality:FINAL <> ($this:<root>.TestClass) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.TestClass
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test> (): kotlin.Int declared in <root>.TestClass'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.TestClass declared in <root>.TestClass.<get-test>' type=<root>.TestClass origin=null
ANONYMOUS_INITIALIZER isStatic=false
BLOCK_BODY
CALL 'public open fun println (p0: kotlin.String?): kotlin.Unit declared in java.io.PrintStream' type=kotlin.Unit origin=null
$this: GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:out type:java.io.PrintStream? visibility:public [final,static]' type=java.io.PrintStream? origin=GET_PROPERTY
p0: CONST String type=kotlin.String value="TestClass/init"
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
VALUE_PARAMETER name:other index:0 type:kotlin.Any?
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override]
overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override]
overridden:
public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
@@ -1,3 +1,5 @@
// FIR_IDENTICAL
fun testFun() {
System.out.println("testFun")
}
+3 -3
View File
@@ -123,7 +123,7 @@ FILE fqName:<root> fileName:/literals.kt
PROPERTY name:testB visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testB type:kotlin.Byte visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Byte value=1
CONST Int type=kotlin.Int value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testB> visibility:public modality:FINAL <> () returnType:kotlin.Byte
correspondingProperty: PROPERTY name:testB visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -132,7 +132,7 @@ FILE fqName:<root> fileName:/literals.kt
PROPERTY name:testS visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testS type:kotlin.Short visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Short value=1
CONST Int type=kotlin.Int value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testS> visibility:public modality:FINAL <> () returnType:kotlin.Short
correspondingProperty: PROPERTY name:testS visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -150,7 +150,7 @@ FILE fqName:<root> fileName:/literals.kt
PROPERTY name:testL visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testL type:kotlin.Long visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Long value=1
CONST Int type=kotlin.Int value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testL> visibility:public modality:FINAL <> () returnType:kotlin.Long
correspondingProperty: PROPERTY name:testL visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -78,7 +78,7 @@ FILE fqName:<root> fileName:/multipleThisReferences.kt
CONSTRUCTOR visibility:private <> () returnType:<root>.Outer.Inner [primary]
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> (x: kotlin.Int) [primary] declared in <root>.Outer.Inner'
x: CONST Int type=<uninitialized parent>.<anonymous> value=42
x: CONST Int type=kotlin.Int value=42
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:<no name provided> modality:FINAL visibility:local superTypes:[<root>.Outer.Inner]'
PROPERTY name:xx visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:xx type:kotlin.Int visibility:private [final]
@@ -2,7 +2,7 @@ FILE fqName:<root> fileName:/primitivesImplicitConversions.kt
PROPERTY name:test1 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test1 type:kotlin.Long visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Long value=42
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test1> visibility:public modality:FINAL <> () returnType:kotlin.Long
correspondingProperty: PROPERTY name:test1 visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -11,7 +11,7 @@ FILE fqName:<root> fileName:/primitivesImplicitConversions.kt
PROPERTY name:test2 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.Short visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Short value=42
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.Short
correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -20,7 +20,7 @@ FILE fqName:<root> fileName:/primitivesImplicitConversions.kt
PROPERTY name:test3 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test3 type:kotlin.Byte visibility:private [final,static]
EXPRESSION_BODY
CONST Int type=kotlin.Byte value=42
CONST Int type=kotlin.Int value=42
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test3> visibility:public modality:FINAL <> () returnType:kotlin.Byte
correspondingProperty: PROPERTY name:test3 visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -61,9 +61,9 @@ FILE fqName:<root> fileName:/primitivesImplicitConversions.kt
VAR name:test1 type:kotlin.Int? [val]
CONST Int type=kotlin.Int value=42
VAR name:test2 type:kotlin.Long [val]
CONST Int type=kotlin.Long value=42
CONST Int type=kotlin.Int value=42
VAR name:test3 type:kotlin.Long? [val]
CONST Int type=kotlin.Long value=42
CONST Int type=kotlin.Int value=42
VAR name:test4 type:kotlin.Long? [val]
CALL 'public final fun unaryMinus (): kotlin.Int declared in kotlin.Int' type=kotlin.Int origin=null
$this: CONST Int type=kotlin.Int value=1
@@ -72,7 +72,7 @@ FILE fqName:<root> fileName:/thisOfGenericOuterClass.kt
CONSTRUCTOR visibility:private <> () returnType:<root>.Outer.Inner<kotlin.Int> [primary]
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> (y: kotlin.Int) [primary] declared in <root>.Outer.Inner'
y: CONST Int type=<uninitialized parent>.<anonymous> value=42
y: CONST Int type=kotlin.Int value=42
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:<no name provided> modality:FINAL visibility:local superTypes:[<root>.Outer.Inner<kotlin.Int>]'
PROPERTY name:xx visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:xx type:kotlin.Int visibility:private [final]
@@ -20,7 +20,7 @@ FILE fqName:<root> fileName:/unsignedIntegerLiterals.kt
PROPERTY name:testUByteWithExpectedType visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testUByteWithExpectedType type:kotlin.UByte visibility:private [final,static]
EXPRESSION_BODY
CONST Long type=kotlin.UByte value=1
CONST Long type=kotlin.Long value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testUByteWithExpectedType> visibility:public modality:FINAL <> () returnType:kotlin.UByte
correspondingProperty: PROPERTY name:testUByteWithExpectedType visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -29,7 +29,7 @@ FILE fqName:<root> fileName:/unsignedIntegerLiterals.kt
PROPERTY name:testUShortWithExpectedType visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testUShortWithExpectedType type:kotlin.UShort visibility:private [final,static]
EXPRESSION_BODY
CONST Long type=kotlin.UShort value=1
CONST Long type=kotlin.Long value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testUShortWithExpectedType> visibility:public modality:FINAL <> () returnType:kotlin.UShort
correspondingProperty: PROPERTY name:testUShortWithExpectedType visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -38,7 +38,7 @@ FILE fqName:<root> fileName:/unsignedIntegerLiterals.kt
PROPERTY name:testUIntWithExpectedType visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testUIntWithExpectedType type:kotlin.UInt visibility:private [final,static]
EXPRESSION_BODY
CONST Long type=kotlin.UInt value=1
CONST Long type=kotlin.Long value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testUIntWithExpectedType> visibility:public modality:FINAL <> () returnType:kotlin.UInt
correspondingProperty: PROPERTY name:testUIntWithExpectedType visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -47,7 +47,7 @@ FILE fqName:<root> fileName:/unsignedIntegerLiterals.kt
PROPERTY name:testULongWithExpectedType visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:testULongWithExpectedType type:kotlin.ULong visibility:private [final,static]
EXPRESSION_BODY
CONST Long type=kotlin.ULong value=1
CONST Long type=kotlin.Long value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-testULongWithExpectedType> visibility:public modality:FINAL <> () returnType:kotlin.ULong
correspondingProperty: PROPERTY name:testULongWithExpectedType visibility:public modality:FINAL [val]
BLOCK_BODY
@@ -2,7 +2,7 @@ FILE fqName:<root> fileName:/whenWithSubjectVariable.kt
FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Any
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.Any declared in <root>'
CONST Int type=kotlin.Any value=1
CONST Int type=kotlin.Int value=1
FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.Int
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test (): kotlin.Int declared in <root>'