Fix incremental compilation problems related to type alias constructors

1. Determine source element for descriptors with NO_SOURCE recursively.

2. Always provide type abbreviation for type alias constructor
return type.

 #KT-15495 Fixed
This commit is contained in:
Dmitry Petrov
2017-05-17 13:02:18 +03:00
parent 2500a182e5
commit a2db4dc0d5
21 changed files with 97 additions and 30 deletions
@@ -79,14 +79,13 @@ fun isContainedByCompiledPartOfOurModule(descriptor: DeclarationDescriptor, outD
}
fun getSourceElement(descriptor: DeclarationDescriptor): SourceElement =
if (descriptor is CallableMemberDescriptor && descriptor.source === SourceElement.NO_SOURCE) {
descriptor.containingDeclaration.toSourceElement
}
else if (descriptor is DeserializedTypeAliasDescriptor) {
descriptor.containingDeclaration.toSourceElement
}
else {
descriptor.toSourceElement
when {
descriptor is CallableMemberDescriptor && descriptor.source === SourceElement.NO_SOURCE ->
getSourceElement(descriptor.containingDeclaration)
descriptor is DeserializedTypeAliasDescriptor ->
getSourceElement(descriptor.containingDeclaration)
else ->
descriptor.toSourceElement
}
private val DeclarationDescriptor.toSourceElement: SourceElement
@@ -1,6 +1,6 @@
package
public val test2: Base
public val test2: Obsolete /* = Base */
public val test3: Base.Companion
public fun test1(/*0*/ x: Obsolete /* = Base */): Obsolete /* = Base */
public fun test1a(/*0*/ x: kotlin.collections.List<Obsolete /* = Base */>): kotlin.collections.List<Obsolete /* = Base */>
@@ -1,7 +1,7 @@
package
public val test1: [ERROR : Type for C1_Alias()]
public val test2: C2
public val test2: C2_Alias /* = C2 */
@kotlin.SinceKotlin(version = "1.1") public open class C1 {
public constructor C1()
@@ -1,6 +1,6 @@
package
public fun test1(/*0*/ x: Outer): Outer.Inner
public fun test1(/*0*/ x: Outer): OI /* = Outer.Inner */
public fun test2(/*0*/ x: Generic<kotlin.Int>): GI<kotlin.Int> /* = Generic<kotlin.Int>.Inner */
public fun </*0*/ T> test3(/*0*/ x: Generic<T>): GI<T> /* = Generic<T>.Inner */
public fun </*0*/ T> test4(/*0*/ x: Generic<kotlin.collections.List<T>>): GI<kotlin.collections.List<T>> /* = Generic<kotlin.collections.List<T>>.Inner */
@@ -1,19 +1,19 @@
package
public val test1: AbstractClass
public val test1: Test1 /* = AbstractClass */
public val test1a: AbstractClass
public val test2: AnnotationClass
public val test2: Test2 /* = AnnotationClass */
public val test2a: AnnotationClass
public val test3: EnumClass
public val test3: Test3 /* = EnumClass */
public val test3a: EnumClass
public val test4: SealedClass
public val test4: Test4 /* = SealedClass */
public val test4a: SealedClass
public val test5: [ERROR : Type for Test5()]
public val test5a: [ERROR : Type for Outer.Inner()]
public val test5b: [ERROR : Type for Outer.TestInner()]
public val test5c: [ERROR : Type for Outer().TestInner()]
public val test5d: Outer.Inner
public val test5e: Outer.Inner
public val test5e: Test5 /* = Outer.Inner */
public abstract class AbstractClass {
public constructor AbstractClass()
@@ -4,7 +4,7 @@ public val test1: [ERROR : Type for MyAlias(1)]
public val test1a: [ERROR : Type for MyClass(1)]
public val test2: [ERROR : Type for MyAlias("")]
public val test2a: [ERROR : Type for MyClass("")]
public val test3: MyClass
public val test3: MyAlias /* = MyClass */
public val test3a: MyClass
public open class MyClass {
@@ -21,9 +21,9 @@ public final class MyDerived : MyClass {
public constructor MyDerived()
public final val test4: [ERROR : Type for MyAlias(1)]
public final val test4a: [ERROR : Type for MyClass(1)]
public final val test5: MyClass
public final val test5: MyAlias /* = MyClass */
public final val test5a: MyClass
public final val test6: MyClass
public final val test6: MyAlias /* = MyClass */
public final val test6a: MyClass
public final override /*1*/ /*fake_override*/ val x: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -2,9 +2,9 @@ package
public val test1: ObjectWithInvoke
public val test2: ObjectWithInvoke
public val test3: ClassWithCompanionObjectWithInvoke
public val test3: CWI /* = ClassWithCompanionObjectWithInvoke */
public val test4: kotlin.Any
public val test5: ClassWithCompanionObjectWithInvoke
public val test5: CWI /* = ClassWithCompanionObjectWithInvoke */
public val test5a: ClassWithCompanionObjectWithInvoke
public final class ClassWithCompanionObjectWithInvoke {
+2 -3
View File
@@ -57,9 +57,8 @@ FILE /kt16905.kt
FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String
$this: VALUE_PARAMETER this@Any: Any
TYPEALIAS typealias OI = Outer.Inner type=Outer.Inner
FUN public fun test(): Outer.Inner
FUN public fun test(): OI /* = Outer.Inner */
BLOCK_BODY
RETURN type=kotlin.Nothing from='test(): Outer.Inner'
RETURN type=kotlin.Nothing from='test(): OI /* = Outer.Inner */'
CALL 'constructor Inner()' type=Outer.Inner origin=null
$this: CALL 'constructor Outer()' type=Outer origin=null
@@ -185,11 +185,7 @@ class TypeAliasConstructorDescriptorImpl private constructor(
val returnType = run {
val returnTypeNoAbbreviation = substitutorForUnderlyingClass.substitute(constructor.returnType, Variance.INVARIANT)
?: return null
val abbreviation = typeAliasDescriptor.defaultType
if (returnTypeNoAbbreviation is SimpleType && abbreviation is SimpleType)
returnTypeNoAbbreviation.withAbbreviation(abbreviation)
else
returnTypeNoAbbreviation
returnTypeNoAbbreviation.unwrap().lowerIfFlexible().withAbbreviation(typeAliasDescriptor.defaultType)
}
val receiverParameterType = constructor.dispatchReceiverParameter?.let { substitutorForUnderlyingClass.safeSubstitute(it.type, Variance.INVARIANT) }
@@ -557,6 +557,18 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
doTest(fileName);
}
@TestMetadata("internalTypealiasConstructor")
public void testInternalTypealiasConstructor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/internalTypealiasConstructor/");
doTest(fileName);
}
@TestMetadata("internalTypealiasObject")
public void testInternalTypealiasObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/internalTypealiasObject/");
doTest(fileName);
}
@TestMetadata("localClassChanged")
public void testLocalClassChanged() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/localClassChanged/");
@@ -557,6 +557,18 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
doTest(fileName);
}
@TestMetadata("internalTypealiasConstructor")
public void testInternalTypealiasConstructor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/internalTypealiasConstructor/");
doTest(fileName);
}
@TestMetadata("internalTypealiasObject")
public void testInternalTypealiasObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/internalTypealiasObject/");
doTest(fileName);
}
@TestMetadata("localClassChanged")
public void testLocalClassChanged() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/localClassChanged/");
@@ -1,3 +1,4 @@
package foo
internal typealias TypeAlias = Int
internal typealias TypeAlias = Int
internal typealias TypeAlias2 = TypeAlias
@@ -2,4 +2,8 @@ package foo
internal fun useTypeAlias(x: TypeAlias) {
x.toString()
}
internal fun useTypeAlias2(x: TypeAlias2) {
x.toString()
}
@@ -0,0 +1,6 @@
package test
class C
internal typealias CAlias = C
internal typealias CAlias2 = CAlias
@@ -0,0 +1,11 @@
================ Step #1 =================
Cleaning output files:
out/production/module/META-INF/module.kotlin_module
out/production/module/test/UseTypeAliasConstructorKt.class
End of files
Compiling files:
src/useTypeAliasConstructor.kt
End of files
Exit code: OK
------------------------------------------
@@ -0,0 +1,4 @@
package test
val c = CAlias()
val c2 = CAlias2()
@@ -0,0 +1,8 @@
package test
class C {
companion object
}
internal typealias CAlias = C
internal typealias CAlias2 = CAlias
@@ -0,0 +1,11 @@
================ Step #1 =================
Cleaning output files:
out/production/module/META-INF/module.kotlin_module
out/production/module/test/UseTypeAliasObjectKt.class
End of files
Compiling files:
src/useTypeAliasObject.kt
End of files
Exit code: OK
------------------------------------------
@@ -0,0 +1,4 @@
package test
val cc = CAlias
val cc2 = CAlias2