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)
|
else -> scopeTower.lexicalScope.findClassifier(name, scopeTower.location)
|
||||||
} ?: return
|
} ?: return
|
||||||
|
|
||||||
val kind =
|
val kind = getWrongResolutionToClassifier(classifier, asFunction) ?: return
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
add(ErrorCandidate.Classifier(classifier, kind))
|
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
|
object AnObject
|
||||||
typealias TO = AnObject
|
typealias TO = AnObject
|
||||||
|
|
||||||
val test6 = <!UNRESOLVED_REFERENCE!>TI<!>()
|
val test6 = <!RESOLUTION_TO_CLASSIFIER!>TI<!>()
|
||||||
val test6a = <!RESOLUTION_TO_CLASSIFIER!>Interface<!>()
|
val test6a = <!RESOLUTION_TO_CLASSIFIER!>Interface<!>()
|
||||||
|
|
||||||
val test7 = <!FUNCTION_EXPECTED!>TO<!>()
|
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
|
typealias Test5 = Outer.Inner
|
||||||
|
|
||||||
val test5 = <!UNRESOLVED_REFERENCE!>Test5<!>()
|
val test5 = <!RESOLUTION_TO_CLASSIFIER!>Test5<!>()
|
||||||
val test5a = Outer.<!RESOLUTION_TO_CLASSIFIER!>Inner<!>()
|
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 test5c = Outer().<!UNRESOLVED_REFERENCE!>TestInner<!>()
|
||||||
val test5d = Outer().Inner()
|
val test5d = Outer().Inner()
|
||||||
val test5e = Outer().Test5()
|
val test5e = Outer().Test5()
|
||||||
|
|||||||
@@ -22951,6 +22951,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("typeAliasConstructorForProjection.kt")
|
||||||
public void testTypeAliasConstructorForProjection() throws Exception {
|
public void testTypeAliasConstructorForProjection() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructorForProjection.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user