Generate super classes and overridden functions in proper scope

Such references require proper scope so that local symbols are bound.
Example:

```
fun <T> outer() {
    abstract class ALocal<S : T> {
        abstract fun bar()
    }

    class Local<S : T> : ALocal<S>() {
        override fun bar() {}
    }
}
```

Here local classes have type parameters with upper bounds depending on
function type parameters, and members overriding members in other local
classes.
This commit is contained in:
Dmitry Petrov
2018-02-22 10:00:02 +03:00
parent 8fef0f0535
commit e89047d2cc
54 changed files with 2463 additions and 79 deletions
@@ -44,6 +44,8 @@ FILE fqName:<root> fileName:/fakeOverrides.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:CFoo<T> flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@@ -0,0 +1,13 @@
fun outer() {
abstract class ALocal {
abstract fun afun()
abstract val aval: Int
abstract var avar: Int
}
class Local : ALocal() {
override fun afun() {}
override val aval = 1
override var avar = 2
}
}
@@ -0,0 +1,94 @@
FILE fqName:<root> fileName:/localClassWithOverrides.kt
FUN name:outer visibility:public modality:FINAL <> () returnType:Unit flags:
BLOCK_BODY
CLASS CLASS name:ALocal modality:ABSTRACT visibility:local flags:
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:outer.ALocal flags:
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:outer.ALocal flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
INSTANCE_INITIALIZER_CALL classDescriptor='ALocal'
FUN name:afun visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Unit flags:
$this: VALUE_PARAMETER name:<this> type:outer.ALocal flags:
PROPERTY name:aval type:kotlin.Int visibility:public modality:ABSTRACT flags:val
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-aval> visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:outer.ALocal flags:
PROPERTY name:avar type:kotlin.Int visibility:public modality:ABSTRACT flags:var
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-avar> visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:outer.ALocal flags:
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-avar> visibility:public modality:ABSTRACT <> ($this:outer.ALocal, <set-?>:kotlin.Int) returnType:Unit flags:
$this: VALUE_PARAMETER name:<this> type:outer.ALocal flags:
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> (other:kotlin.Any?) returnType:Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:hashCode visibility:public modality:OPEN <> () returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:toString visibility:public modality:OPEN <> () returnType:String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
CLASS CLASS name:Local modality:FINAL visibility:local flags:
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:outer.Local flags:
superClasses:
CLASS CLASS name:ALocal modality:ABSTRACT visibility:local flags:
CONSTRUCTOR visibility:public <> () returnType:outer.Local flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor ALocal()'
INSTANCE_INITIALIZER_CALL classDescriptor='Local'
FUN name:afun visibility:public modality:OPEN <> ($this:outer.Local) returnType:Unit flags:
overridden:
FUN name:afun visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Unit flags:
$this: VALUE_PARAMETER name:<this> type:outer.Local flags:
BLOCK_BODY
PROPERTY name:aval type:kotlin.Int visibility:public modality:OPEN flags:val
FIELD PROPERTY_BACKING_FIELD name:aval type:kotlin.Int visibility:public
EXPRESSION_BODY
CONST Int type=kotlin.Int value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-aval> visibility:public modality:OPEN <> ($this:outer.Local) returnType:Int flags:
overridden:
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-aval> visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:outer.Local flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-aval>(): Int'
GET_FIELD 'aval: Int' type=kotlin.Int origin=null
receiver: GET_VAR 'this@Local: Local' type=outer.Local origin=null
PROPERTY name:avar type:kotlin.Int visibility:public modality:OPEN flags:var
FIELD PROPERTY_BACKING_FIELD name:avar type:kotlin.Int visibility:public
EXPRESSION_BODY
CONST Int type=kotlin.Int value=2
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-avar> visibility:public modality:OPEN <> ($this:outer.Local) returnType:Int flags:
overridden:
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-avar> visibility:public modality:ABSTRACT <> ($this:outer.ALocal) returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:outer.Local flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-avar>(): Int'
GET_FIELD 'avar: Int' type=kotlin.Int origin=null
receiver: GET_VAR 'this@Local: Local' type=outer.Local origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-avar> visibility:public modality:OPEN <> ($this:outer.Local, <set-?>:kotlin.Int) returnType:Unit flags:
overridden:
FUN DEFAULT_PROPERTY_ACCESSOR name:<set-avar> visibility:public modality:ABSTRACT <> ($this:outer.ALocal, <set-?>:kotlin.Int) returnType:Unit flags:
$this: VALUE_PARAMETER name:<this> type:outer.Local flags:
VALUE_PARAMETER name:<set-?> index:0 type:kotlin.Int flags:
BLOCK_BODY
SET_FIELD 'avar: Int' type=kotlin.Unit origin=null
receiver: GET_VAR 'this@Local: Local' type=outer.Local origin=null
value: GET_VAR 'value-parameter <set-?>: Int' type=kotlin.Int origin=null
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags:
overridden:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
VALUE_PARAMETER name:other index:0 type:kotlin.Any? flags:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags:
overridden:
FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:Int flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags:
overridden:
FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:String flags:
$this: VALUE_PARAMETER name:<this> type:kotlin.Any flags:
@@ -4,11 +4,15 @@ FILE fqName:<root> fileName:/class.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CLASS INTERFACE name:TestNestedInterface modality:ABSTRACT visibility:public flags:
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:TestInterface.TestNestedInterface<TT> flags:
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:Boolean flags:
overridden:
FUN IR_EXTERNAL_DECLARATION_STUB name:equals visibility:public modality:OPEN <> (other:kotlin.Any?) returnType:Boolean flags:
@@ -40,6 +44,8 @@ FILE fqName:<root> fileName:/class.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T0 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:Test<T0> flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@@ -49,6 +55,8 @@ FILE fqName:<root> fileName:/class.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T1 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:Test.TestNested<T1> flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@@ -71,6 +79,8 @@ FILE fqName:<root> fileName:/class.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T2 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> ($this:Test<T0>) returnType:Test<T0>.TestInner<T2> flags:
$outer: VALUE_PARAMETER name:<this> type:Test<T0> flags:
BLOCK_BODY
@@ -4,7 +4,11 @@ FILE fqName:<root> fileName:/constructor.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T1 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T2 index:1 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> (x:T1, y:T2) returnType:Test1<T1, T2> flags:
VALUE_PARAMETER name:x index:0 type:T1 flags:
VALUE_PARAMETER name:y index:1 type:T2 flags:
@@ -69,6 +73,8 @@ FILE fqName:<root> fileName:/constructor.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:Z index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> ($this:Test2, z:Z) returnType:Test2.TestInner<Z> flags:
$outer: VALUE_PARAMETER name:<this> type:Test2 flags:
VALUE_PARAMETER name:z index:0 type:Z flags:
@@ -170,6 +176,8 @@ FILE fqName:<root> fileName:/constructor.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:Test4<T> flags:
VALUE_PARAMETER name:x index:0 type:kotlin.Int flags:
BLOCK_BODY
@@ -4,6 +4,8 @@ FILE fqName:<root> fileName:/dataClassMembers.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> (x:T, y:kotlin.String) returnType:Test<T> flags:
VALUE_PARAMETER name:x index:0 type:T flags:
VALUE_PARAMETER name:y index:1 type:kotlin.String flags:
@@ -73,6 +73,8 @@ FILE fqName:<root> fileName:/defaultPropertyAccessors.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> (testInPrimaryCtor1:T, testInPrimaryCtor2:kotlin.Int) returnType:InPrimaryCtor<T> flags:
VALUE_PARAMETER name:testInPrimaryCtor1 index:0 type:T flags:
VALUE_PARAMETER name:testInPrimaryCtor2 index:1 type:kotlin.Int flags:
@@ -4,6 +4,8 @@ FILE fqName:<root> fileName:/delegatedMembers.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
FUN name:foo visibility:public modality:ABSTRACT <> ($this:IBase<T>, x:kotlin.Int) returnType:Unit flags:
$this: VALUE_PARAMETER name:<this> type:IBase<T> flags:
VALUE_PARAMETER name:x index:0 type:kotlin.Int flags:
@@ -12,6 +14,8 @@ FILE fqName:<root> fileName:/delegatedMembers.kt
$this: VALUE_PARAMETER name:<this> type:IBase<T> flags:
FUN name:qux visibility:public modality:ABSTRACT <X> ($this:IBase<T>, t:T, x:X) returnType:Unit flags:
TYPE_PARAMETER name:X index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
$this: VALUE_PARAMETER name:<this> type:IBase<T> flags:
VALUE_PARAMETER name:t index:0 type:T flags:
VALUE_PARAMETER name:x index:1 type:X flags:
@@ -33,6 +37,8 @@ FILE fqName:<root> fileName:/delegatedMembers.kt
superClasses:
CLASS INTERFACE name:IBase modality:ABSTRACT visibility:public flags:
TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> (impl:IBase<TT>) returnType:Test<TT> flags:
VALUE_PARAMETER name:impl index:0 type:IBase<TT> flags:
BLOCK_BODY
@@ -45,6 +51,8 @@ FILE fqName:<root> fileName:/delegatedMembers.kt
overridden:
FUN name:qux visibility:public modality:ABSTRACT <X> ($this:IBase<T>, t:T, x:X) returnType:Unit flags:
TYPE_PARAMETER name:X index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
$this: VALUE_PARAMETER name:<this> type:Test<TT> flags:
VALUE_PARAMETER name:t index:0 type:TT flags:
VALUE_PARAMETER name:x index:1 type:X flags:
@@ -1,6 +1,8 @@
FILE fqName:<root> fileName:/fun.kt
FUN name:test1 visibility:public modality:FINAL <T> (i:kotlin.Int, j:T) returnType:Unit flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
VALUE_PARAMETER name:i index:0 type:kotlin.Int flags:
VALUE_PARAMETER name:j index:1 type:T flags:
BLOCK_BODY
@@ -36,6 +38,8 @@ FILE fqName:<root> fileName:/fun.kt
BLOCK_BODY
FUN name:testMembetExt2 visibility:public modality:FINAL <T> ($this:Host, $receiver:kotlin.String, i:kotlin.Int, j:T) returnType:Unit flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
$this: VALUE_PARAMETER name:<this> type:Host flags:
$receiver: VALUE_PARAMETER name:<this> type:kotlin.String flags:
VALUE_PARAMETER name:i index:0 type:kotlin.Int flags:
@@ -4,6 +4,8 @@ FILE fqName:<root> fileName:/genericInnerClass.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T1 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:Outer<T1> flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'
@@ -13,6 +15,8 @@ FILE fqName:<root> fileName:/genericInnerClass.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T2 index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> ($this:Outer<T1>) returnType:Outer<T1>.Inner<T2> flags:
$outer: VALUE_PARAMETER name:<this> type:Outer<T1> flags:
BLOCK_BODY
@@ -1,9 +1,13 @@
FILE fqName:<root> fileName:/localFun.kt
FUN name:outer visibility:public modality:FINAL <TT> () returnType:Unit flags:
TYPE_PARAMETER name:TT index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
BLOCK_BODY
FUN name:test1 visibility:local modality:FINAL <T> (i:kotlin.Int, j:T) returnType:Unit flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
VALUE_PARAMETER name:i index:0 type:kotlin.Int flags:
VALUE_PARAMETER name:j index:1 type:T flags:
BLOCK_BODY
@@ -49,6 +49,8 @@ FILE fqName:<root> fileName:/propertyAccessors.kt
superClasses:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
TYPE_PARAMETER name:T index:0 variance: upperBounds:[kotlin.Any?]
superClassifiers:
CLASS IR_EXTERNAL_DECLARATION_STUB CLASS name:Any modality:OPEN visibility:public flags:
CONSTRUCTOR visibility:public <> () returnType:Host<T> flags:
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'constructor Any()'