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 {
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
}
@@ -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 {
@@ -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<!>
@@ -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()
@@ -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"]<!>
}
@@ -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
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<!><!>
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