From 07edb15138ec48622439fcb5ca363e5ad18895de Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Mon, 13 Sep 2021 17:02:23 +0300 Subject: [PATCH] [FIR] Expand typealias for correct approximation of types (particularly Int and Long) --- .../runners/FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../body/resolve/FirExpressionsResolveTransformer.kt | 3 ++- .../typealias/intToLongApproximationThroughTypeAlias.kt | 6 ++++++ .../typealias/intToLongApproximationThroughTypeAlias.txt | 4 ++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ .../DiagnosisCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ 7 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index bbd19ff63c5..8900eb78074 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -30669,6 +30669,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/typealias/innerTypeAliasConstructor.kt"); } + @Test + @TestMetadata("intToLongApproximationThroughTypeAlias.kt") + public void testIntToLongApproximationThroughTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt"); + } + @Test @TestMetadata("isAsWithTypeAlias.kt") public void testIsAsWithTypeAlias() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 853c182fca3..7c290d662b0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -30669,6 +30669,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/typealias/innerTypeAliasConstructor.kt"); } + @Test + @TestMetadata("intToLongApproximationThroughTypeAlias.kt") + public void testIntToLongApproximationThroughTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt"); + } + @Test @TestMetadata("isAsWithTypeAlias.kt") public void testIsAsWithTypeAlias() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 4686ff6aef7..71e0bb71b53 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -877,7 +877,8 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform val integerLiteralType = ConeIntegerLiteralTypeImpl(constExpression.value as Long, isUnsigned = kind == ConstantValueKind.UnsignedIntegerLiteral) if (data.expectedType != null) { - val approximatedType = integerLiteralType.getApproximatedType(data.expectedType?.coneTypeSafe()) + val coneType = data.expectedType?.coneTypeSafe()?.fullyExpandedType(session) + val approximatedType = integerLiteralType.getApproximatedType(coneType) val newConstKind = approximatedType.toConstKind() @Suppress("UNCHECKED_CAST") constExpression.replaceKind(newConstKind as ConstantValueKind) diff --git a/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt b/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt new file mode 100644 index 00000000000..97cba0eb01c --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt @@ -0,0 +1,6 @@ +// FIR_IDENTICAL +typealias Hash = Long + +fun foo(): Hash { + return 0 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.txt b/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.txt new file mode 100644 index 00000000000..7ef9fa1bf51 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.txt @@ -0,0 +1,4 @@ +package + +public fun foo(): Hash /* = kotlin.Long */ +public typealias Hash = kotlin.Long diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index b943bb7dc9c..b997e398093 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -30765,6 +30765,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/typealias/innerTypeAliasConstructor.kt"); } + @Test + @TestMetadata("intToLongApproximationThroughTypeAlias.kt") + public void testIntToLongApproximationThroughTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt"); + } + @Test @TestMetadata("isAsWithTypeAlias.kt") public void testIsAsWithTypeAlias() throws Exception { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 378ced7ee62..c240a6991c3 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -30669,6 +30669,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/typealias/innerTypeAliasConstructor.kt"); } + @Test + @TestMetadata("intToLongApproximationThroughTypeAlias.kt") + public void testIntToLongApproximationThroughTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/typealias/intToLongApproximationThroughTypeAlias.kt"); + } + @Test @TestMetadata("isAsWithTypeAlias.kt") public void testIsAsWithTypeAlias() throws Exception {