Generate proper error candidates for type aliases
#KT-17745 Fixed Target versions 1.1.5
This commit is contained in:
+26
-18
@@ -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<!>()
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
interface IFoo
|
||||
|
||||
typealias Test = IFoo
|
||||
|
||||
val testAsFunction = <!RESOLUTION_TO_CLASSIFIER!>Test<!>()
|
||||
val testAsValue = <!NO_COMPANION_OBJECT!>Test<!>
|
||||
+11
@@ -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
|
||||
+2
-2
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user