[FIR] Split primary constructor parameter scope into two different
In init block or property initializers, for `val x` declared in primary constructor, `x` reference is now resolved to property, not to parameter. So we need two different scopes for primary constructor, one for 'pure' parameters and another one for all parameters, including val/var ones. #KT-42844 Fixed
This commit is contained in:
@@ -2,7 +2,7 @@ sealed class My(open val x: Int?) {
|
||||
init {
|
||||
if (x != null) {
|
||||
// Should be error: property is open
|
||||
x.hashCode()
|
||||
x.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,15 +3,15 @@ class Foo(var x: Int?) {
|
||||
if (x != null) {
|
||||
val y = x
|
||||
// Error: x is not stable, Type(y) = Int?
|
||||
x.hashCode()
|
||||
y.hashCode()
|
||||
x.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
|
||||
y.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
|
||||
if (y == x) {
|
||||
// Still error
|
||||
y.hashCode()
|
||||
y.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
|
||||
}
|
||||
if (x == null && y != x) {
|
||||
// Still error
|
||||
y.hashCode()
|
||||
y.<!INAPPLICABLE_CANDIDATE!>hashCode<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -7,15 +7,15 @@ class Foo(var x: Any) {
|
||||
if (x is Bar) {
|
||||
val y = x
|
||||
// Error: x is not stable, Type(y) = Any
|
||||
x.bar()
|
||||
y.bar()
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
y.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
if (y == x) {
|
||||
// Still error
|
||||
y.bar()
|
||||
y.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
if (x !is Bar && y != x) {
|
||||
// Still error
|
||||
y.bar()
|
||||
y.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,8 @@ FILE fqName:<root> fileName:/delegatedProperties.kt
|
||||
PROPERTY name:test3 visibility:public modality:FINAL [delegated,var]
|
||||
FIELD PROPERTY_DELEGATE name:test3$delegate type:kotlin.collections.MutableMap<kotlin.String, kotlin.Any> visibility:private [final]
|
||||
EXPRESSION_BODY
|
||||
GET_VAR 'map: kotlin.collections.MutableMap<kotlin.String, kotlin.Any> declared in <root>.C.<init>' type=kotlin.collections.MutableMap<kotlin.String, kotlin.Any> origin=null
|
||||
CALL 'public final fun <get-map> (): kotlin.collections.MutableMap<kotlin.String, kotlin.Any> declared in <root>.C' type=kotlin.collections.MutableMap<kotlin.String, kotlin.Any> origin=GET_PROPERTY
|
||||
$this: GET_VAR '<this>: <root>.C declared in <root>.C' type=<root>.C origin=null
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR name:<get-test3> visibility:public modality:FINAL <> ($this:<root>.C) returnType:kotlin.Any
|
||||
correspondingProperty: PROPERTY name:test3 visibility:public modality:FINAL [delegated,var]
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.C
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// FIR_IDENTICAL
|
||||
class Some(var foo: Int) {
|
||||
init {
|
||||
if (foo < 0) {
|
||||
foo = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
FILE fqName:<root> fileName:/VarInInit.kt
|
||||
CLASS CLASS name:Some modality:FINAL visibility:public superTypes:[kotlin.Any]
|
||||
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Some
|
||||
CONSTRUCTOR visibility:public <> (foo:kotlin.Int) returnType:<root>.Some [primary]
|
||||
VALUE_PARAMETER name:foo index:0 type:kotlin.Int
|
||||
BLOCK_BODY
|
||||
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
|
||||
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Some modality:FINAL visibility:public superTypes:[kotlin.Any]'
|
||||
PROPERTY name:foo visibility:public modality:FINAL [var]
|
||||
FIELD PROPERTY_BACKING_FIELD name:foo type:kotlin.Int visibility:private
|
||||
EXPRESSION_BODY
|
||||
GET_VAR 'foo: kotlin.Int declared in <root>.Some.<init>' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-foo> visibility:public modality:FINAL <> ($this:<root>.Some) returnType:kotlin.Int
|
||||
correspondingProperty: PROPERTY name:foo visibility:public modality:FINAL [var]
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.Some
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='public final fun <get-foo> (): kotlin.Int declared in <root>.Some'
|
||||
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:foo type:kotlin.Int visibility:private' type=kotlin.Int origin=null
|
||||
receiver: GET_VAR '<this>: <root>.Some declared in <root>.Some.<get-foo>' type=<root>.Some origin=null
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-foo> visibility:public modality:FINAL <> ($this:<root>.Some, <set-?>:kotlin.Int) returnType:kotlin.Unit
|
||||
correspondingProperty: PROPERTY name:foo visibility:public modality:FINAL [var]
|
||||
$this: VALUE_PARAMETER name:<this> type:<root>.Some
|
||||
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int
|
||||
BLOCK_BODY
|
||||
SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:foo type:kotlin.Int visibility:private' type=kotlin.Unit origin=null
|
||||
receiver: GET_VAR '<this>: <root>.Some declared in <root>.Some.<set-foo>' type=<root>.Some origin=null
|
||||
value: GET_VAR '<set-?>: kotlin.Int declared in <root>.Some.<set-foo>' type=kotlin.Int origin=null
|
||||
ANONYMOUS_INITIALIZER isStatic=false
|
||||
BLOCK_BODY
|
||||
WHEN type=kotlin.Unit origin=IF
|
||||
BRANCH
|
||||
if: CALL 'public final fun less (arg0: kotlin.Int, arg1: kotlin.Int): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=LT
|
||||
arg0: CALL 'public final fun <get-foo> (): kotlin.Int declared in <root>.Some' type=kotlin.Int origin=GET_PROPERTY
|
||||
$this: GET_VAR '<this>: <root>.Some declared in <root>.Some' type=<root>.Some origin=null
|
||||
arg1: CONST Int type=kotlin.Int value=0
|
||||
then: BLOCK type=kotlin.Unit origin=null
|
||||
CALL 'public final fun <set-foo> (<set-?>: kotlin.Int): kotlin.Unit declared in <root>.Some' type=kotlin.Unit origin=EQ
|
||||
$this: GET_VAR '<this>: <root>.Some declared in <root>.Some' type=<root>.Some origin=null
|
||||
<set-?>: CONST Int type=kotlin.Int value=0
|
||||
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||
overridden:
|
||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] 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
|
||||
Reference in New Issue
Block a user