FIR substitution: do not create fake overrides if types aren't changed

This commit is contained in:
Mikhail Glukhikh
2019-09-05 11:09:02 +03:00
parent 5386cfe254
commit 6a7ebe8928
9 changed files with 19 additions and 9 deletions
@@ -80,6 +80,10 @@ class FirClassSubstitutionScope(
it.returnTypeRef.coneTypeUnsafe<ConeKotlinType>().substitute() it.returnTypeRef.coneTypeUnsafe<ConeKotlinType>().substitute()
} }
if (newReceiverType == null && newReturnType == null && newParameterTypes.all { it == null }) {
return original
}
return createFakeOverrideFunction(session, member, original, newReceiverType, newReturnType, newParameterTypes) return createFakeOverrideFunction(session, member, original, newReceiverType, newReturnType, newParameterTypes)
} }
@@ -92,6 +96,10 @@ class FirClassSubstitutionScope(
val returnType = typeCalculator.tryCalculateReturnType(member).type val returnType = typeCalculator.tryCalculateReturnType(member).type
val newReturnType = returnType.substitute() val newReturnType = returnType.substitute()
if (newReceiverType == null && newReturnType == null) {
return original
}
return createFakeOverrideProperty(session, member, original, newReceiverType, newReturnType) return createFakeOverrideProperty(session, member, original, newReceiverType, newReturnType)
} }
+1 -1
View File
@@ -133,7 +133,7 @@ digraph loops_kt {
color=blue color=blue
46 [label="Enter loop condition"]; 46 [label="Enter loop condition"];
47 [label="Access variable R|<local>/<iterator>|"]; 47 [label="Access variable R|<local>/<iterator>|"];
48 [label="Function call: R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.hasNext: R|kotlin/Boolean|>|()"]; 48 [label="Function call: R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()"];
49 [label="Exit loop condition"]; 49 [label="Exit loop condition"];
} }
subgraph cluster_16 { subgraph cluster_16 {
+1 -1
View File
@@ -16,7 +16,7 @@ FILE: loops.kt
public final fun testFor(x: R|kotlin/Any?|): R|kotlin/Unit| { public final fun testFor(x: R|kotlin/Any?|): R|kotlin/Unit| {
lval <range>: R|kotlin/ranges/IntRange| = Int(0).R|kotlin/Int.rangeTo|(Int(5)) lval <range>: R|kotlin/ranges/IntRange| = Int(0).R|kotlin/Int.rangeTo|(Int(5))
lval <iterator>: R|kotlin/collections/IntIterator| = R|<local>/<range>|.R|kotlin/ranges/IntProgression.iterator|() lval <iterator>: R|kotlin/collections/IntIterator| = R|<local>/<range>|.R|kotlin/ranges/IntProgression.iterator|()
while(R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.hasNext: R|kotlin/Boolean|>|()) { while(R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|() lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|()
lval y: R|kotlin/Boolean| = (R|<local>/x| is R|kotlin/String|) lval y: R|kotlin/Boolean| = (R|<local>/x| is R|kotlin/String|)
} }
@@ -30,6 +30,6 @@ FILE: importedReceiver.kt
(this@R|/My|, String()).R|/My.bar|<R|kotlin/String|>() (this@R|/My|, String()).R|/My.bar|<R|kotlin/String|>()
this@R|/My|.R|/My.baz|() this@R|/My|.R|/My.baz|()
(this@R|/My|, Boolean(true)).R|/My.gau|() (this@R|/My|, Boolean(true)).R|/My.gau|()
this@R|/Your|.R|FakeOverride</Your.wat: R|kotlin/Unit|>|() this@R|/Your|.R|/Your.wat|()
Boolean(false).<Inapplicable(WRONG_RECEIVER): [/Your.watwat]>#() (this@R|/Your|, Boolean(false)).R|/Your.watwat|<R|kotlin/Boolean|>()
} }
+1 -1
View File
@@ -12,7 +12,7 @@ FILE: fib.kt
lvar prev: R|kotlin/Int| = Int(1) lvar prev: R|kotlin/Int| = Int(1)
lval <range>: R|kotlin/ranges/IntRange| = Int(2).R|kotlin/Int.rangeTo|(R|<local>/n|) lval <range>: R|kotlin/ranges/IntRange| = Int(2).R|kotlin/Int.rangeTo|(R|<local>/n|)
lval <iterator>: R|kotlin/collections/IntIterator| = R|<local>/<range>|.R|kotlin/ranges/IntProgression.iterator|() lval <iterator>: R|kotlin/collections/IntIterator| = R|<local>/<range>|.R|kotlin/ranges/IntProgression.iterator|()
while(R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.hasNext: R|kotlin/Boolean|>|()) { while(R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|() lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|kotlin/collections/IntIterator.next|()
lval temp: R|kotlin/Int| = R|<local>/current| lval temp: R|kotlin/Int| = R|<local>/current|
R|<local>/current| += R|<local>/prev| R|<local>/current| += R|<local>/prev|
@@ -25,7 +25,7 @@ FILE: components.kt
public final fun foo(list: R|kotlin/collections/List<D>|): R|kotlin/Unit| { public final fun foo(list: R|kotlin/collections/List<D>|): R|kotlin/Unit| {
lval <range>: R|kotlin/collections/List<D>| = R|<local>/list| lval <range>: R|kotlin/collections/List<D>| = R|<local>/list|
lval <iterator>: R|kotlin/collections/Iterator<D>| = R|<local>/<range>|.R|FakeOverride<kotlin/collections/List.iterator: R|kotlin/collections/Iterator<D>|>|() lval <iterator>: R|kotlin/collections/Iterator<D>| = R|<local>/<range>|.R|FakeOverride<kotlin/collections/List.iterator: R|kotlin/collections/Iterator<D>|>|()
while(R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.hasNext: R|kotlin/Boolean|>|()) { while(R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()) {
lval <destruct>: R|D| = R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.next: R|D|>|() lval <destruct>: R|D| = R|<local>/<iterator>|.R|FakeOverride<kotlin/collections/Iterator.next: R|D|>|()
lval x: R|kotlin/Int| = R|<local>/<destruct>|.R|/D.component1|() lval x: R|kotlin/Int| = R|<local>/<destruct>|.R|/D.component1|()
lval y: R|kotlin/String| = R|<local>/<destruct>|.R|/D.component2|() lval y: R|kotlin/String| = R|<local>/<destruct>|.R|/D.component2|()
@@ -45,7 +45,7 @@ FILE fqName:<root> fileName:/callableRefToGenericMember.kt
PROPERTY name:test2 visibility:public modality:FINAL [val] PROPERTY name:test2 visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.Int visibility:private [final,static] FIELD PROPERTY_BACKING_FIELD name:test2 type:kotlin.Int visibility:private [final,static]
EXPRESSION_BODY EXPRESSION_BODY
PROPERTY_REFERENCE 'public final bar: kotlin.Int [val]' field=null getter='public final fun <get-bar> (): kotlin.Int declared in <root>.A' setter=null type=kotlin.Int origin=null PROPERTY_REFERENCE 'public final bar: kotlin.Int [val]' field='FIELD PROPERTY_BACKING_FIELD name:bar type:kotlin.Int visibility:private [final]' getter='public final fun <get-bar> (): kotlin.Int declared in <root>.A' setter=null type=kotlin.Int origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.Int FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test2> visibility:public modality:FINAL <> () returnType:kotlin.Int
correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val] correspondingProperty: PROPERTY name:test2 visibility:public modality:FINAL [val]
BLOCK_BODY BLOCK_BODY
@@ -68,7 +68,7 @@ FILE fqName:<root> fileName:/genericPropertyRef.kt
FIELD DELEGATE name:additionalText$delegate type:<root>.DVal visibility:private [final,static] FIELD DELEGATE name:additionalText$delegate type:<root>.DVal visibility:private [final,static]
EXPRESSION_BODY EXPRESSION_BODY
CONSTRUCTOR_CALL 'public constructor <init> (kmember: kotlin.Any) [primary] declared in <root>.DVal' type=<root>.DVal origin=null CONSTRUCTOR_CALL 'public constructor <init> (kmember: kotlin.Any) [primary] declared in <root>.DVal' type=<root>.DVal origin=null
kmember: PROPERTY_REFERENCE 'public final text: kotlin.String? [var]' field=null getter='public final fun <get-text> (): kotlin.String? declared in <root>.Value' setter='public final fun <set-text> (<set-?>: kotlin.String?): kotlin.Unit declared in <root>.Value' type=kotlin.String? origin=null kmember: PROPERTY_REFERENCE 'public final text: kotlin.String? [var]' field='FIELD PROPERTY_BACKING_FIELD name:text type:kotlin.String? visibility:private' getter='public final fun <get-text> (): kotlin.String? declared in <root>.Value' setter='public final fun <set-text> (<set-?>: kotlin.String?): kotlin.Unit declared in <root>.Value' type=kotlin.String? origin=null
FUN DELEGATED_PROPERTY_ACCESSOR name:<get-additionalText> visibility:public modality:FINAL <> () returnType:kotlin.Int FUN DELEGATED_PROPERTY_ACCESSOR name:<get-additionalText> visibility:public modality:FINAL <> () returnType:kotlin.Int
correspondingProperty: PROPERTY name:additionalText visibility:public modality:FINAL [delegated,val] correspondingProperty: PROPERTY name:additionalText visibility:public modality:FINAL [delegated,val]
BLOCK_BODY BLOCK_BODY
@@ -232,7 +232,9 @@ FILE fqName:<root> fileName:/useImportedMember.kt
BRANCH BRANCH
if: CALL 'public final fun not (): kotlin.Boolean declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ if: CALL 'public final fun not (): kotlin.Boolean declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ $this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
arg0: ERROR_CALL 'Unresolved reference: <Inapplicable(WRONG_RECEIVER): [/I.fromInterface]>#' type=IrErrorType arg0: CALL 'public open fun fromInterface <T> (): T of <root>.I.fromInterface declared in <root>.I' type=kotlin.Int origin=null
<T>: <none>
$this: GET_VAR '<this>: <root>.I declared in <root>.I' type=<root>.I<*> origin=null
arg1: CONST Int type=kotlin.Int value=9 arg1: CONST Int type=kotlin.Int value=9
then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>' then: RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
CONST String type=kotlin.String value="9" CONST String type=kotlin.String value="9"