diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 7dceb90ca36..2820ec2fd08 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -18080,6 +18080,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt"); } + @Test + @TestMetadata("constantStaticStringField.kt") + public void testConstantStaticStringField() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception { diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/StaticFromBaseClass.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/StaticFromBaseClass.fir.txt index 61465c0418c..b73f410b4ad 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/StaticFromBaseClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/StaticFromBaseClass.fir.txt @@ -1,5 +1,5 @@ FILE: main.kt public final fun test(): R|kotlin/Unit| { - lval project: R|ft| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT| + lval project: R|kotlin/String| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT| lval member: R|ft| = R|/PlatformDataKeys.PlatformDataKeys|().R|/CommonDataKeys.MEMBER| } 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 dc18ff4f2cd..afdd961b8cf 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 @@ -18080,6 +18080,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt"); } + @Test + @TestMetadata("constantStaticStringField.kt") + public void testConstantStaticStringField() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() 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 34fb3fdd06c..97bcbd96f82 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 @@ -18080,6 +18080,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt"); } + @Test + @TestMetadata("constantStaticStringField.kt") + public void testConstantStaticStringField() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 9644b9e1f67..3e0e1f8d83e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -112,7 +112,18 @@ class FirSignatureEnhancement( } is FirField -> { if (firElement.returnTypeRef !is FirJavaTypeRef) return original - val newReturnTypeRef = enhanceReturnType(firElement, emptyList(), firElement.computeDefaultQualifiers(), null) + val newReturnTypeRef = enhanceReturnType( + firElement, emptyList(), firElement.computeDefaultQualifiers(), + predefinedEnhancementInfo = null + ).let { + val lowerBound = it.type.lowerBoundIfFlexible() + + if (firElement.isStatic && firElement.initializer != null && (lowerBound.isString || lowerBound.isInt)) { + it.withReplacedConeType(it.type.withNullability(ConeNullability.NOT_NULL, session.typeContext)) + } else { + it + } + } val symbol = FirFieldSymbol(original.callableId) buildJavaField { diff --git a/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.fir.kt b/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.fir.kt new file mode 100644 index 00000000000..29d527271d5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.fir.kt @@ -0,0 +1,27 @@ +// SKIP_TXT + +// FILE: JavaClass.java +public class JavaClass { + public final static String X = ""; + public final static String Y = ""; +} + +// FILE: main.kt + +fun nullableStr(): String? = null + +fun foo(w: Int): String { + var x: String? = nullableStr() + + if (x != null) { + return x + } + + // Smartcast should work because when's entries' results are non-flexible + x = nullableStr() ?: when (w) { + 1 -> JavaClass.X + else -> JavaClass.Y + } + + return x +} diff --git a/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt b/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt new file mode 100644 index 00000000000..1758eaa22e8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt @@ -0,0 +1,27 @@ +// SKIP_TXT + +// FILE: JavaClass.java +public class JavaClass { + public final static String X = ""; + public final static String Y = ""; +} + +// FILE: main.kt + +fun nullableStr(): String? = null + +fun foo(w: Int): String { + var x: String? = nullableStr() + + if (x != null) { + return x + } + + // Smartcast should work because when's entries' results are non-flexible + x = nullableStr() ?: when (w) { + 1 -> JavaClass.X + else -> JavaClass.Y + } + + return x +} diff --git a/compiler/testData/ir/irText/declarations/kt29833.fir.ir.txt b/compiler/testData/ir/irText/declarations/kt29833.fir.ir.txt index 3f51711eddd..b25fe902829 100644 --- a/compiler/testData/ir/irText/declarations/kt29833.fir.ir.txt +++ b/compiler/testData/ir/irText/declarations/kt29833.fir.ir.txt @@ -6,26 +6,26 @@ FILE fqName:interop fileName:/Definitions.kt DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:Definitions modality:FINAL visibility:public superTypes:[kotlin.Any]' PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val] - FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:@[FlexibleNullability] kotlin.String? visibility:public [final] + FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String visibility:public [final] EXPRESSION_BODY - CONST String type=@[FlexibleNullability] kotlin.String value="constant" - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:@[FlexibleNullability] kotlin.String? + CONST String type=kotlin.String value="constant" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val] $this: VALUE_PARAMETER name: type:interop.Definitions BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): @[FlexibleNullability] kotlin.String? declared in interop.Definitions' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:@[FlexibleNullability] kotlin.String? visibility:public [final]' type=@[FlexibleNullability] kotlin.String? origin=null + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in interop.Definitions' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String visibility:public [final]' type=kotlin.String origin=null receiver: GET_VAR ': interop.Definitions declared in interop.Definitions.' type=interop.Definitions origin=null PROPERTY name:ktValue visibility:public modality:FINAL [val] - FIELD PROPERTY_BACKING_FIELD name:ktValue type:@[FlexibleNullability] kotlin.String? visibility:private [final] + FIELD PROPERTY_BACKING_FIELD name:ktValue type:kotlin.String visibility:private [final] EXPRESSION_BODY - GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:CONSTANT type:@[FlexibleNullability] kotlin.String? visibility:public [final,static]' type=@[FlexibleNullability] kotlin.String? origin=GET_PROPERTY - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:@[FlexibleNullability] kotlin.String? + GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:CONSTANT type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=GET_PROPERTY + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String correspondingProperty: PROPERTY name:ktValue visibility:public modality:FINAL [val] $this: VALUE_PARAMETER name: type:interop.Definitions BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): @[FlexibleNullability] kotlin.String? declared in interop.Definitions' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ktValue type:@[FlexibleNullability] kotlin.String? visibility:private [final]' type=@[FlexibleNullability] kotlin.String? origin=null + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in interop.Definitions' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ktValue type:kotlin.String visibility:private [final]' type=kotlin.String origin=null receiver: GET_VAR ': interop.Definitions declared in interop.Definitions.' type=interop.Definitions origin=null FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: diff --git a/compiler/testData/ir/irText/declarations/kt29833.fir.kt.txt b/compiler/testData/ir/irText/declarations/kt29833.fir.kt.txt index 7d956b145cf..f50cb85f847 100644 --- a/compiler/testData/ir/irText/declarations/kt29833.fir.kt.txt +++ b/compiler/testData/ir/irText/declarations/kt29833.fir.kt.txt @@ -7,11 +7,11 @@ object Definitions { } - const val KT_CONSTANT: @FlexibleNullability String? + const val KT_CONSTANT: String field = "constant" get - val ktValue: @FlexibleNullability String? + val ktValue: String field = #CONSTANT get diff --git a/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.ir.txt b/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.ir.txt index f38fa776307..28bb4984ace 100644 --- a/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.ir.txt +++ b/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.ir.txt @@ -1,9 +1,9 @@ FILE fqName: fileName:/SameJavaFieldReferences.kt FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY - VAR name:ref1 type:kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> [val] - PROPERTY_REFERENCE 'public final someJavaField: @[FlexibleNullability] kotlin.String? [val]' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:someJavaField type:@[FlexibleNullability] kotlin.String? visibility:public [final,static]' getter=null setter=null type=kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> origin=null + VAR name:ref1 type:kotlin.reflect.KProperty0 [val] + PROPERTY_REFERENCE 'public final someJavaField: kotlin.String [val]' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:someJavaField type:kotlin.String visibility:public [final,static]' getter=null setter=null type=kotlin.reflect.KProperty0 origin=null <1>: - VAR name:ref2 type:kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> [val] - PROPERTY_REFERENCE 'public final someJavaField: @[FlexibleNullability] kotlin.String? [val]' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:someJavaField type:@[FlexibleNullability] kotlin.String? visibility:public [final,static]' getter=null setter=null type=kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> origin=null + VAR name:ref2 type:kotlin.reflect.KProperty0 [val] + PROPERTY_REFERENCE 'public final someJavaField: kotlin.String [val]' field='FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:someJavaField type:kotlin.String visibility:public [final,static]' getter=null setter=null type=kotlin.reflect.KProperty0 origin=null <1>: diff --git a/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.kt.txt b/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.kt.txt index 31f6d88057f..59a58991cce 100644 --- a/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.kt.txt +++ b/compiler/testData/ir/irText/firProblems/SameJavaFieldReferences.fir.kt.txt @@ -1,4 +1,4 @@ fun foo() { - val ref1: KProperty0<@FlexibleNullability String?> = SomeJavaClass::someJavaField/*()*/ - val ref2: KProperty0<@FlexibleNullability String?> = SomeJavaClass::someJavaField/*()*/ + val ref1: KProperty0 = SomeJavaClass::someJavaField/*()*/ + val ref2: KProperty0 = SomeJavaClass::someJavaField/*()*/ } diff --git a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt index 8eff7782b23..6cd6e359b7f 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt @@ -1,5 +1,5 @@ public abstract interface StringConstantInParam : R|kotlin/Any| { - public final static field HEL: R|ft| = String(hel) + public final static field HEL: R|kotlin/String| = String(hel) public final annotation class Anno : R|kotlin/Annotation| { public constructor(value: R|kotlin/String|): R|test/StringConstantInParam.Anno| diff --git a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt index 4dbd90f8727..2e16b4189bb 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt @@ -1,13 +1,13 @@ public open class StaticFinal : R|kotlin/Any| { - public final static field publicNonNull: R|ft| = String(aaa) + public final static field publicNonNull: R|kotlin/String| = String(aaa) public final static field publicNull: R|ft| - public/*package*/ final static field packageNonNull: R|ft| = String(bbb) + public/*package*/ final static field packageNonNull: R|kotlin/String| = String(bbb) public/*package*/ final static field packageNull: R|ft| - private final static field privateNonNull: R|ft| = String(bbb) + private final static field privateNonNull: R|kotlin/String| = String(bbb) private final static field privateNull: R|ft| 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 6ac37b051f7..410207faa17 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 @@ -18086,6 +18086,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt"); } + @Test + @TestMetadata("constantStaticStringField.kt") + public void testConstantStaticStringField() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/types/constantStaticStringField.kt"); + } + @Test @TestMetadata("notNullTypeParameterWithKotlinNullable.kt") public void testNotNullTypeParameterWithKotlinNullable() throws Exception {