Generate proper error candidates for type aliases

#KT-17745 Fixed Target versions 1.1.5
This commit is contained in:
Dmitry Petrov
2017-07-19 15:34:49 +03:00
parent b4d8337ca5
commit c9d54d7110
6 changed files with 52 additions and 21 deletions
@@ -86,24 +86,32 @@ private fun ErrorCandidateContext.asClassifierCall(asFunction: Boolean) {
else -> scopeTower.lexicalScope.findClassifier(name, scopeTower.location)
} ?: return
val kind =
when (classifier) {
is TypeParameterDescriptor -> if (asFunction) TYPE_PARAMETER_AS_FUNCTION else TYPE_PARAMETER_AS_VALUE
is ClassDescriptor -> {
when (classifier.kind) {
ClassKind.INTERFACE -> if (asFunction) INTERFACE_AS_FUNCTION else INTERFACE_AS_VALUE
ClassKind.OBJECT -> if (asFunction) OBJECT_AS_FUNCTION else return
ClassKind.CLASS -> when {
asFunction && explicitReceiver is QualifierReceiver? && classifier.isInner -> INNER_CLASS_CONSTRUCTOR_NO_RECEIVER
!asFunction -> CLASS_AS_VALUE
else -> return
}
else -> return
}
}
else -> return
}
val kind = getWrongResolutionToClassifier(classifier, asFunction) ?: return
add(ErrorCandidate.Classifier(classifier, kind))
}
private fun ErrorCandidateContext.getWrongResolutionToClassifier(classifier: ClassifierDescriptor, asFunction: Boolean): WrongResolutionToClassifier? =
when (classifier) {
is TypeAliasDescriptor -> classifier.classDescriptor?.let { getWrongResolutionToClassifier(it, asFunction) }
is TypeParameterDescriptor -> if (asFunction) TYPE_PARAMETER_AS_FUNCTION else TYPE_PARAMETER_AS_VALUE
is ClassDescriptor -> {
when (classifier.kind) {
ClassKind.INTERFACE -> if (asFunction) INTERFACE_AS_FUNCTION else INTERFACE_AS_VALUE
ClassKind.OBJECT -> if (asFunction) OBJECT_AS_FUNCTION else null
ClassKind.CLASS -> when {
asFunction && explicitReceiver is QualifierReceiver? && classifier.isInner -> INNER_CLASS_CONSTRUCTOR_NO_RECEIVER
!asFunction -> CLASS_AS_VALUE
else -> null
}
else -> null
}
}
else -> null
}
@@ -17,7 +17,7 @@ typealias TI = Interface
object AnObject
typealias TO = AnObject
val test6 = <!UNRESOLVED_REFERENCE!>TI<!>()
val test6 = <!RESOLUTION_TO_CLASSIFIER!>TI<!>()
val test6a = <!RESOLUTION_TO_CLASSIFIER!>Interface<!>()
val test7 = <!FUNCTION_EXPECTED!>TO<!>()
@@ -0,0 +1,6 @@
interface IFoo
typealias Test = IFoo
val testAsFunction = <!RESOLUTION_TO_CLASSIFIER!>Test<!>()
val testAsValue = <!NO_COMPANION_OBJECT!>Test<!>
@@ -0,0 +1,11 @@
package
public val testAsFunction: [ERROR : Type for Test()]
public val testAsValue: [ERROR : Type for Test]
public interface IFoo {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public typealias Test = IFoo
@@ -26,9 +26,9 @@ class Outer {
}
typealias Test5 = Outer.Inner
val test5 = <!UNRESOLVED_REFERENCE!>Test5<!>()
val test5 = <!RESOLUTION_TO_CLASSIFIER!>Test5<!>()
val test5a = Outer.<!RESOLUTION_TO_CLASSIFIER!>Inner<!>()
val test5b = Outer.<!UNRESOLVED_REFERENCE!>TestInner<!>()
val test5b = Outer.<!RESOLUTION_TO_CLASSIFIER!>TestInner<!>()
val test5c = Outer().<!UNRESOLVED_REFERENCE!>TestInner<!>()
val test5d = Outer().Inner()
val test5e = Outer().Test5()
@@ -22951,6 +22951,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("typeAliasConstructorForInterface.kt")
public void testTypeAliasConstructorForInterface() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForInterface.kt");
doTest(fileName);
}
@TestMetadata("typeAliasConstructorForProjection.kt")
public void testTypeAliasConstructorForProjection() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt");