Diagnostics improvements for corner cases

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