FIR: Load final static constant Java fields as non-nullable
This commit is contained in:
committed by
teamcityserver
parent
dba04bcf80
commit
46217318c0
+6
@@ -18080,6 +18080,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt");
|
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
|
@Test
|
||||||
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
||||||
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
FILE: main.kt
|
FILE: main.kt
|
||||||
public final fun test(): R|kotlin/Unit| {
|
public final fun test(): R|kotlin/Unit| {
|
||||||
lval project: R|ft<kotlin/String, kotlin/String?>| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT|
|
lval project: R|kotlin/String| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT|
|
||||||
lval member: R|ft<kotlin/String, kotlin/String?>| = R|/PlatformDataKeys.PlatformDataKeys|().R|/CommonDataKeys.MEMBER|
|
lval member: R|ft<kotlin/String, kotlin/String?>| = R|/PlatformDataKeys.PlatformDataKeys|().R|/CommonDataKeys.MEMBER|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -18080,6 +18080,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt");
|
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
|
@Test
|
||||||
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
||||||
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
||||||
|
|||||||
+6
@@ -18080,6 +18080,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt");
|
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
|
@Test
|
||||||
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
||||||
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
||||||
|
|||||||
+12
-1
@@ -112,7 +112,18 @@ class FirSignatureEnhancement(
|
|||||||
}
|
}
|
||||||
is FirField -> {
|
is FirField -> {
|
||||||
if (firElement.returnTypeRef !is FirJavaTypeRef) return original
|
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)
|
val symbol = FirFieldSymbol(original.callableId)
|
||||||
buildJavaField {
|
buildJavaField {
|
||||||
|
|||||||
+27
@@ -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
|
||||||
|
}
|
||||||
@@ -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 <!DEBUG_INFO_SMARTCAST!>x<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
// Smartcast should work because when's entries' results are non-flexible
|
||||||
|
x = nullableStr() ?: when (w) {
|
||||||
|
1 -> JavaClass.X
|
||||||
|
else -> JavaClass.Y
|
||||||
|
}
|
||||||
|
|
||||||
|
return <!DEBUG_INFO_SMARTCAST!>x<!>
|
||||||
|
}
|
||||||
+10
-10
@@ -6,26 +6,26 @@ FILE fqName:interop fileName:/Definitions.kt
|
|||||||
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
|
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
|
||||||
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:Definitions modality:FINAL visibility:public superTypes:[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]
|
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
|
EXPRESSION_BODY
|
||||||
CONST String type=@[FlexibleNullability] kotlin.String value="constant"
|
CONST String type=kotlin.String value="constant"
|
||||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-KT_CONSTANT> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:@[FlexibleNullability] kotlin.String?
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-KT_CONSTANT> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String
|
||||||
correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val]
|
||||||
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun <get-KT_CONSTANT> (): @[FlexibleNullability] kotlin.String? declared in interop.Definitions'
|
RETURN type=kotlin.Nothing from='public final fun <get-KT_CONSTANT> (): 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
|
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String visibility:public [final]' type=kotlin.String origin=null
|
||||||
receiver: GET_VAR '<this>: interop.Definitions declared in interop.Definitions.<get-KT_CONSTANT>' type=interop.Definitions origin=null
|
receiver: GET_VAR '<this>: interop.Definitions declared in interop.Definitions.<get-KT_CONSTANT>' type=interop.Definitions origin=null
|
||||||
PROPERTY name:ktValue visibility:public modality:FINAL [val]
|
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
|
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
|
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:<get-ktValue> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:@[FlexibleNullability] kotlin.String?
|
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-ktValue> visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String
|
||||||
correspondingProperty: PROPERTY name:ktValue visibility:public modality:FINAL [val]
|
correspondingProperty: PROPERTY name:ktValue visibility:public modality:FINAL [val]
|
||||||
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
$this: VALUE_PARAMETER name:<this> type:interop.Definitions
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun <get-ktValue> (): @[FlexibleNullability] kotlin.String? declared in interop.Definitions'
|
RETURN type=kotlin.Nothing from='public final fun <get-ktValue> (): 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
|
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ktValue type:kotlin.String visibility:private [final]' type=kotlin.String origin=null
|
||||||
receiver: GET_VAR '<this>: interop.Definitions declared in interop.Definitions.<get-ktValue>' type=interop.Definitions origin=null
|
receiver: GET_VAR '<this>: interop.Definitions declared in interop.Definitions.<get-ktValue>' 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]
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||||
overridden:
|
overridden:
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ object Definitions {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const val KT_CONSTANT: @FlexibleNullability String?
|
const val KT_CONSTANT: String
|
||||||
field = "constant"
|
field = "constant"
|
||||||
get
|
get
|
||||||
|
|
||||||
val ktValue: @FlexibleNullability String?
|
val ktValue: String
|
||||||
field = #CONSTANT
|
field = #CONSTANT
|
||||||
get
|
get
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
FILE fqName:<root> fileName:/SameJavaFieldReferences.kt
|
FILE fqName:<root> fileName:/SameJavaFieldReferences.kt
|
||||||
FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
VAR name:ref1 type:kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> [val]
|
VAR name:ref1 type:kotlin.reflect.KProperty0<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
|
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<kotlin.String> origin=null
|
||||||
<1>: <none>
|
<1>: <none>
|
||||||
VAR name:ref2 type:kotlin.reflect.KProperty0<@[FlexibleNullability] kotlin.String?> [val]
|
VAR name:ref2 type:kotlin.reflect.KProperty0<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
|
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<kotlin.String> origin=null
|
||||||
<1>: <none>
|
<1>: <none>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
fun foo() {
|
fun foo() {
|
||||||
val ref1: KProperty0<@FlexibleNullability String?> = SomeJavaClass::someJavaField/*</* null */>()*/
|
val ref1: KProperty0<String> = SomeJavaClass::someJavaField/*</* null */>()*/
|
||||||
val ref2: KProperty0<@FlexibleNullability String?> = SomeJavaClass::someJavaField/*</* null */>()*/
|
val ref2: KProperty0<String> = SomeJavaClass::someJavaField/*</* null */>()*/
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
public abstract interface StringConstantInParam : R|kotlin/Any| {
|
public abstract interface StringConstantInParam : R|kotlin/Any| {
|
||||||
public final static field HEL: R|ft<kotlin/String, kotlin/String?>| = String(hel)
|
public final static field HEL: R|kotlin/String| = String(hel)
|
||||||
|
|
||||||
public final annotation class Anno : R|kotlin/Annotation| {
|
public final annotation class Anno : R|kotlin/Annotation| {
|
||||||
public constructor(value: R|kotlin/String|): R|test/StringConstantInParam.Anno|
|
public constructor(value: R|kotlin/String|): R|test/StringConstantInParam.Anno|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
public open class StaticFinal : R|kotlin/Any| {
|
public open class StaticFinal : R|kotlin/Any| {
|
||||||
public final static field publicNonNull: R|ft<kotlin/String, kotlin/String?>| = String(aaa)
|
public final static field publicNonNull: R|kotlin/String| = String(aaa)
|
||||||
|
|
||||||
public final static field publicNull: R|ft<kotlin/String, kotlin/String?>|
|
public final static field publicNull: R|ft<kotlin/String, kotlin/String?>|
|
||||||
|
|
||||||
public/*package*/ final static field packageNonNull: R|ft<kotlin/String, kotlin/String?>| = String(bbb)
|
public/*package*/ final static field packageNonNull: R|kotlin/String| = String(bbb)
|
||||||
|
|
||||||
public/*package*/ final static field packageNull: R|ft<kotlin/String, kotlin/String?>|
|
public/*package*/ final static field packageNull: R|ft<kotlin/String, kotlin/String?>|
|
||||||
|
|
||||||
private final static field privateNonNull: R|ft<kotlin/String, kotlin/String?>| = String(bbb)
|
private final static field privateNonNull: R|kotlin/String| = String(bbb)
|
||||||
|
|
||||||
private final static field privateNull: R|ft<kotlin/String, kotlin/String?>|
|
private final static field privateNull: R|ft<kotlin/String, kotlin/String?>|
|
||||||
|
|
||||||
|
|||||||
Generated
+6
@@ -18086,6 +18086,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/types/arrayList.kt");
|
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
|
@Test
|
||||||
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
@TestMetadata("notNullTypeParameterWithKotlinNullable.kt")
|
||||||
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
public void testNotNullTypeParameterWithKotlinNullable() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user