Diagnostics improvements for corner cases
(class/package qualifier in non-qualifier position).
This commit is contained in:
@@ -399,14 +399,16 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
|
||||
val qualifierDescriptor = when {
|
||||
receiver is PackageQualifier -> {
|
||||
val childPackageFQN = receiver.packageView.fqName.child(name)
|
||||
val childPackageDescriptor = receiver.packageView.module.getPackage(childPackageFQN).check { !it.isEmpty() }
|
||||
childPackageDescriptor ?: receiver.packageView.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression))
|
||||
receiver.packageView.module.getPackage(childPackageFQN).check { !it.isEmpty() } ?:
|
||||
receiver.packageView.memberScope.getContributedClassifier(name, KotlinLookupLocation(expression))
|
||||
}
|
||||
receiver is ClassQualifier ->
|
||||
receiver.scope.getContributedClassifier(name, KotlinLookupLocation(expression))
|
||||
!receiver.exists() ->
|
||||
context.scope.findClassifier(name, KotlinLookupLocation(expression)) ?:
|
||||
context.scope.ownerDescriptor.module.getPackage(FqName.ROOT.child(name)).check { !it.isEmpty() }
|
||||
receiver is ReceiverValue ->
|
||||
receiver.type.memberScope.memberScopeAsImportingScope().findClassifier(name, KotlinLookupLocation(expression))
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
+8
-6
@@ -177,11 +177,13 @@ public class CallExpressionResolver {
|
||||
call, newContext, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, result);
|
||||
if (result[0]) {
|
||||
FunctionDescriptor functionDescriptor = resolvedCall != null ? resolvedCall.getResultingDescriptor() : null;
|
||||
temporaryForFunction.commit();
|
||||
boolean hasValueParameters = functionDescriptor == null || functionDescriptor.getValueParameters().size() > 0;
|
||||
context.trace.report(FUNCTION_CALL_EXPECTED.on(nameExpression, nameExpression, hasValueParameters));
|
||||
type = functionDescriptor != null ? functionDescriptor.getReturnType() : null;
|
||||
return TypeInfoFactoryKt.createTypeInfo(type, context);
|
||||
if (!(functionDescriptor instanceof ConstructorDescriptor)) {
|
||||
temporaryForFunction.commit();
|
||||
boolean hasValueParameters = functionDescriptor == null || functionDescriptor.getValueParameters().size() > 0;
|
||||
context.trace.report(FUNCTION_CALL_EXPECTED.on(nameExpression, nameExpression, hasValueParameters));
|
||||
type = functionDescriptor != null ? functionDescriptor.getReturnType() : null;
|
||||
return TypeInfoFactoryKt.createTypeInfo(type, context);
|
||||
}
|
||||
}
|
||||
|
||||
TemporaryTraceAndCache temporaryForQualifier = TemporaryTraceAndCache.create(context, "trace to resolve as qualifier", nameExpression);
|
||||
@@ -190,7 +192,7 @@ public class CallExpressionResolver {
|
||||
if (qualifier != null) {
|
||||
QualifiedExpressionResolveUtilKt.resolveQualifierAsStandaloneExpression(qualifier, contextForQualifier, symbolUsageValidator);
|
||||
temporaryForQualifier.commit();
|
||||
return TypeInfoFactoryKt.createTypeInfo(null, context);
|
||||
return TypeInfoFactoryKt.noTypeInfo(context);
|
||||
}
|
||||
|
||||
temporaryForVariable.commit();
|
||||
|
||||
@@ -3,24 +3,24 @@ package foo
|
||||
class X {}
|
||||
|
||||
val s = <!EXPRESSION_EXPECTED_PACKAGE_FOUND!>java<!>
|
||||
val ss = <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>
|
||||
val sss = <!FUNCTION_CALL_EXPECTED!>X<!>
|
||||
val x = "${<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>}"
|
||||
val ss = <!NO_COMPANION_OBJECT!>System<!>
|
||||
val sss = <!NO_COMPANION_OBJECT!>X<!>
|
||||
val x = "${<!NO_COMPANION_OBJECT!>System<!>}"
|
||||
val xs = java.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>lang<!>
|
||||
val xss = java.lang.<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>
|
||||
val xsss = foo.<!FUNCTION_CALL_EXPECTED!>X<!>
|
||||
val xss = java.lang.<!NO_COMPANION_OBJECT!>System<!>
|
||||
val xsss = foo.<!NO_COMPANION_OBJECT!>X<!>
|
||||
val xssss = <!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>
|
||||
val f = { <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!> }
|
||||
val f = { <!NO_COMPANION_OBJECT!>System<!> }
|
||||
|
||||
fun main(args : Array<String>) {
|
||||
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>java<!> = null
|
||||
<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED, VARIABLE_EXPECTED!>System<!> = <!NULL_FOR_NONNULL_TYPE!>null<!>
|
||||
<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!><!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>
|
||||
java.lang.<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED, VARIABLE_EXPECTED!>System<!> = <!NULL_FOR_NONNULL_TYPE!>null<!>
|
||||
java.lang.<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!><!UNNECESSARY_NOT_NULL_ASSERTION!>!!<!>
|
||||
<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!> is <!INCOMPATIBLE_TYPES!>Int<!>
|
||||
<!NO_COMPANION_OBJECT!>System<!> = null
|
||||
<!NO_COMPANION_OBJECT!>System<!>!!
|
||||
java.lang.<!NO_COMPANION_OBJECT!>System<!> = null
|
||||
java.lang.<!NO_COMPANION_OBJECT!>System<!>!!
|
||||
<!NO_COMPANION_OBJECT!>System<!> is Int
|
||||
<!INVISIBLE_MEMBER!>System<!>()
|
||||
(<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>)
|
||||
foo@ <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>
|
||||
null <!UNRESOLVED_REFERENCE!>in<!> <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>
|
||||
(<!NO_COMPANION_OBJECT!>System<!>)
|
||||
foo@ <!NO_COMPANION_OBJECT!>System<!>
|
||||
null in <!NO_COMPANION_OBJECT!>System<!>
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
package
|
||||
|
||||
package foo {
|
||||
public val f: () -> java.lang.System
|
||||
public val f: () -> ???
|
||||
public val s: [ERROR : Type for java]
|
||||
public val ss: java.lang.System
|
||||
public val sss: foo.X
|
||||
public val ss: [ERROR : Type for System]
|
||||
public val sss: [ERROR : Type for X]
|
||||
public val x: kotlin.String
|
||||
public val xs: [ERROR : Type for java.lang]
|
||||
public val xss: java.lang.System
|
||||
public val xsss: foo.X
|
||||
public val xss: [ERROR : Type for java.lang.System]
|
||||
public val xsss: [ERROR : Type for foo.X]
|
||||
public val xssss: [ERROR : Type for foo]
|
||||
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ val s: String = "test"
|
||||
|
||||
// FILE: test.kt
|
||||
fun ff() {
|
||||
val a = <!FUNCTION_CALL_EXPECTED!>Test<!>?.<!UNRESOLVED_REFERENCE!>FOO<!>
|
||||
val a = <!NO_COMPANION_OBJECT!>Test<!><!UNEXPECTED_SAFE_CALL!>?.<!>FOO
|
||||
val b = <!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!><!UNEXPECTED_SAFE_CALL!>?.<!>s
|
||||
<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>?.<!UNRESOLVED_REFERENCE!>out<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>println<!>(<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> b)
|
||||
<!NO_COMPANION_OBJECT!>System<!><!UNEXPECTED_SAFE_CALL!>?.<!>out.println(a + b)
|
||||
}
|
||||
@@ -36,7 +36,7 @@ val a = A.x
|
||||
val c = B.<!UNRESOLVED_REFERENCE!>x<!>
|
||||
val d = b.<!UNRESOLVED_REFERENCE!>x<!>
|
||||
|
||||
val s = <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!> // error
|
||||
val s = <!NO_COMPANION_OBJECT!>System<!> // error
|
||||
fun test() {
|
||||
System.out.println()
|
||||
java.lang.System.out.println()
|
||||
|
||||
@@ -4,7 +4,7 @@ package Jet86 {
|
||||
public val a: kotlin.Int = 1
|
||||
public val c: [ERROR : Type for B.x]
|
||||
public val d: [ERROR : Type for b.x]
|
||||
public val s: java.lang.System
|
||||
public val s: [ERROR : Type for System]
|
||||
public fun test(): kotlin.Unit
|
||||
|
||||
public final class A {
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ object O {
|
||||
fun f() {
|
||||
A.c
|
||||
A.hashCode()
|
||||
A().<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, FUNCTION_CALL_EXPECTED!>Nested<!>
|
||||
A().<!NO_COMPANION_OBJECT, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>Nested<!>
|
||||
A.Nested()
|
||||
A().Inner()
|
||||
A.Companion.<!UNRESOLVED_REFERENCE!>Nested<!>
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ enum class C {
|
||||
}
|
||||
|
||||
fun f() {
|
||||
C.E1.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, FUNCTION_CALL_EXPECTED!>A<!>
|
||||
C.E1.<!UNRESOLVED_REFERENCE!>A<!>
|
||||
C.E1.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>A<!>()
|
||||
C.E2.B()
|
||||
|
||||
|
||||
Vendored
+1
-1
@@ -3,5 +3,5 @@ package bar
|
||||
fun main(args : Array<String>) {
|
||||
class Some
|
||||
|
||||
<!FUNCTION_CALL_EXPECTED!>Some<!>[<!SYNTAX!><!>] <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>names<!> <!DEBUG_INFO_MISSING_UNRESOLVED!><!SYNTAX!>=<!> ["ads"]<!>
|
||||
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!><!NO_COMPANION_OBJECT!>Some<!>[<!SYNTAX!><!>]<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>names<!> <!DEBUG_INFO_MISSING_UNRESOLVED!><!SYNTAX!>=<!> ["ads"]<!>
|
||||
}
|
||||
+3
-3
@@ -28,7 +28,7 @@ fun test(with: WithClassObject, without: WithoutClassObject, obj: Obj) {
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>()
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>.foo()
|
||||
with.<!INVISIBLE_MEMBER, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, FUNCTION_CALL_EXPECTED!>NestedEnum<!>.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>A<!>
|
||||
with.<!NO_COMPANION_OBJECT, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedEnum<!>.A
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>()
|
||||
with.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>.foo()
|
||||
@@ -37,7 +37,7 @@ fun test(with: WithClassObject, without: WithoutClassObject, obj: Obj) {
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>()
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>.foo()
|
||||
without.<!INVISIBLE_MEMBER, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, FUNCTION_CALL_EXPECTED!>NestedEnum<!>.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>A<!>
|
||||
without.<!NO_COMPANION_OBJECT, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedEnum<!>.A
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>()
|
||||
without.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>.foo()
|
||||
@@ -46,7 +46,7 @@ fun test(with: WithClassObject, without: WithoutClassObject, obj: Obj) {
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>()
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedWithClassObject<!>.foo()
|
||||
obj.<!INVISIBLE_MEMBER, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE, FUNCTION_CALL_EXPECTED!>NestedEnum<!>.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>A<!>
|
||||
obj.<!NO_COMPANION_OBJECT, NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedEnum<!>.A
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>()
|
||||
obj.<!NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE!>NestedObj<!>.foo()
|
||||
|
||||
@@ -1 +1 @@
|
||||
val a: String = <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>Nothing<!>
|
||||
val a: String = <!NO_COMPANION_OBJECT!>Nothing<!>
|
||||
@@ -16,8 +16,8 @@ class E private constructor() {
|
||||
}
|
||||
}
|
||||
|
||||
val a = <!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>A<!>
|
||||
val a = <!NO_COMPANION_OBJECT!>A<!>
|
||||
<!EXPOSED_PROPERTY_TYPE!>val b = <!INVISIBLE_MEMBER!>B<!><!>
|
||||
val c = <!NO_VALUE_FOR_PARAMETER, FUNCTION_CALL_EXPECTED!>C<!>
|
||||
val c = <!NO_COMPANION_OBJECT!>C<!>
|
||||
val d = D
|
||||
val e = E(42)
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public val a: A
|
||||
public val a: [ERROR : Type for A]
|
||||
public val b: B.Companion
|
||||
public val c: C
|
||||
public val c: [ERROR : Type for C]
|
||||
public val d: D.Companion
|
||||
public val e: kotlin.Int
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ sealed class Tree {
|
||||
|
||||
fun maxIsClass(): Int = <!NO_ELSE_IN_WHEN!>when<!>(this) {
|
||||
Empty -> -1
|
||||
<!NO_VALUE_FOR_PARAMETER, FUNCTION_CALL_EXPECTED!>Leaf<!> -> 0
|
||||
<!NO_COMPANION_OBJECT!>Leaf<!> -> 0
|
||||
is Node -> <!DEBUG_INFO_SMARTCAST!>this<!>.left.max()
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ public class Test {
|
||||
// FILE: test.kt
|
||||
fun ff() {
|
||||
val a = Test.FOO
|
||||
val b = <!FUNCTION_CALL_EXPECTED!>Test<!>?.<!UNRESOLVED_REFERENCE!>FOO<!>
|
||||
System.out.println(a + <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>)
|
||||
<!INVISIBLE_MEMBER, FUNCTION_CALL_EXPECTED!>System<!>?.<!UNRESOLVED_REFERENCE!>out<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>println<!>(a + <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>)
|
||||
val b = <!NO_COMPANION_OBJECT!>Test<!><!UNEXPECTED_SAFE_CALL!>?.<!>FOO
|
||||
System.out.println(a + b)
|
||||
<!NO_COMPANION_OBJECT!>System<!><!UNEXPECTED_SAFE_CALL!>?.<!>out.println(a + b)
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
// "Import" "true"
|
||||
// ERROR: Function invocation 'ArrayList()' expected
|
||||
// ERROR: Please specify constructor invocation; classifier 'ArrayList' does not have a companion object
|
||||
|
||||
// KT-4000
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// "Import" "true"
|
||||
// ERROR: Function invocation 'ArrayList()' expected
|
||||
// ERROR: Please specify constructor invocation; classifier 'ArrayList' does not have a companion object
|
||||
|
||||
// KT-4000
|
||||
|
||||
|
||||
Reference in New Issue
Block a user