Can't omit default object name in imports and types

There should be only one way to denote a type (A.Default.B can't be denoted as A.B)
This commit is contained in:
Pavel V. Talanov
2015-02-16 17:45:23 +03:00
parent 640d2de5b9
commit cceb5738c8
17 changed files with 27 additions and 35 deletions
@@ -37,11 +37,6 @@ public class Importer {
else if (descriptor is ClassDescriptor && QualifiedExpressionResolver.canAllUnderImportFromClass(descriptor)) {
allUnderImportScopes.add(descriptor.getStaticScope())
allUnderImportScopes.add(descriptor.getUnsubstitutedInnerClassesScope())
val classObjectDescriptor = descriptor.getDefaultObjectDescriptor()
if (classObjectDescriptor != null) {
allUnderImportScopes.add(classObjectDescriptor.getUnsubstitutedInnerClassesScope())
}
}
}
@@ -21,6 +21,7 @@ import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.Mutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -108,7 +109,8 @@ public class QualifiedExpressionResolver {
JetSimpleNameExpression referenceExpression = JetPsiUtil.getLastReference(importedReference);
if (importDirective.isAllUnder()) {
if (!canAllUnderImportFrom(descriptors) && referenceExpression != null) {
trace.report(CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON.on(referenceExpression, (ClassDescriptor) descriptors.iterator().next()));
ClassDescriptor toReportOn = KotlinPackage.filterIsInstance(descriptors, ClassDescriptor.class).iterator().next();
trace.report(CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON.on(referenceExpression, toReportOn));
}
if (referenceExpression == null || !canImportMembersFrom(descriptors, referenceExpression, trace, lookupMode)) {
@@ -298,11 +300,6 @@ public class QualifiedExpressionResolver {
results.add(lookupSimpleNameReference(selector, scope, lookupMode, false));
results.add(lookupSimpleNameReference(selector, descriptor.getStaticScope(), lookupMode, true));
ClassDescriptor classObject = descriptor.getDefaultObjectDescriptor();
if (classObject != null) {
addResultsForClass(results, selector, lookupMode, classObject);
}
}
@@ -11,7 +11,7 @@ class A {
}
}
fun foo(x : A.Season) : String {
fun foo(x : A.Default.Season) : String {
return when (x) {
A.Season.WINTER -> "winter"
A.Season.SPRING -> "spring"
@@ -1,6 +1,6 @@
package f
import f.A.B
import f.A.Default.B
class A {
class object {
@@ -5,12 +5,12 @@ import b.B //class
import b.foo //function
import b.ext //extension function
import b.value //property
import b.C.<!CANNOT_BE_IMPORTED!>bar<!> //function from class object
import b.C.<!CANNOT_BE_IMPORTED!>cValue<!> //property from class object
import b.C.Default.<!CANNOT_BE_IMPORTED!>bar<!> //function from class object
import b.C.Default.<!CANNOT_BE_IMPORTED!>cValue<!> //property from class object
import b.<!CANNOT_IMPORT_FROM_ELEMENT!>constant<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>fff<!> //function from val
import b.<!CANNOT_IMPORT_FROM_ELEMENT!>constant<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>dValue<!> //property from val
import b.constant
import b.E.<!CANNOT_BE_IMPORTED!>f<!> //val from class object
import b.E.Default.<!CANNOT_BE_IMPORTED!>f<!> //val from class object
import <!UNRESOLVED_REFERENCE!>smth<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>illegal<!>
import b.C.<!UNRESOLVED_REFERENCE!>smth<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>illegal<!>
import b.<!CANNOT_IMPORT_FROM_ELEMENT!>bar<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>smth<!>
@@ -85,8 +85,8 @@ fun foo() {
//FILE:d.kt
package d
import d.A.B
import d.A.C
import d.A.Default.B
import d.A.Default.C
val b : B = B()
val c : B = C
@@ -21,10 +21,10 @@ public class M1 {
public val a: A = A()
public val b: A.B = A.B()
public val c: A.C = A.C
public val d: A.D = A.D()
public val e: A.D.E = A.D.E
public val d: A.Default.D = A.D()
public val e: A.Default.D.E = A.D.E
public val f: A.F = A().F()
public val g: A.G = A.G()
public val g: A.Default.G = A.G()
}
// MODULE: m2
@@ -47,8 +47,8 @@ public class A {
public fun a(p: A) {}
public fun b(p: A.B) {}
public fun c(p: A.C) {}
public fun d(p: A.D) {}
public fun e(p: A.D.E) {}
public fun d(p: A.Default.D) {}
public fun e(p: A.Default.D.E) {}
public fun f(p: A.F) {}
public fun g(p: A.G) {}
@@ -10,6 +10,6 @@ class Foo {
}
class User {
fun main() : Unit {
var <!UNUSED_VARIABLE!>boo<!> : Foo.Bar? /* <-- this reference is red */ = Foo.Bar()
var <!UNUSED_VARIABLE!>boo<!> : Foo.Default.Bar? /* <-- this reference is red */ = Foo.Default.Bar()
}
}
@@ -1,7 +1,7 @@
// import all members from class object
package c
import c.A.*
import c.A.Default.B
import c.<!CANNOT_IMPORT_ON_DEMAND_FROM_SINGLETON!>M<!>.*
fun foo() {
@@ -36,8 +36,8 @@ object N {
package b
import b.N.M
import b.A.P
import b.A.B
import b.A.Default.P
import b.A.Default.B
fun foo() {
val <!UNUSED_VARIABLE!>b<!> : B = B()
@@ -10,4 +10,4 @@ class A {
}
}
A.Anno1 A.B.Anno2 class C
A.Default.Anno1 A.Default.B.Anno2 class C
@@ -4,6 +4,6 @@ class A {
}
}
val v: A.Inner = <caret>
val v: A.Default.Inner = <caret>
// ELEMENT: Inner
@@ -4,6 +4,6 @@ class A {
}
}
val v: A.Inner = A.Inner()<caret>
val v: A.Default.Inner = A.Inner()
// ELEMENT: Inner
@@ -3,7 +3,7 @@ package test
import dependency.*
public class DependencyOnNestedClasses : D.Nested() {
fun f(nc: D.NestedInClassObject, i: D.Inner, ii: D.Inner.Inner, nn: D.Nested.Nested): D.Nested {
fun f(nc: D.Default.NestedInClassObject, i: D.Inner, ii: D.Inner.Inner, nn: D.Nested.Nested): D.Nested {
return D.Nested()
}
}
@@ -3,7 +3,7 @@ package test
import dependency.*
public class DependencyOnNestedClasses : D.Nested() {
fun f(nc: D.NestedInClassObject, i: D.Inner, ii: D.Inner.Inner, nn: D.Nested.Nested): D.Nested {
fun f(nc: D.Default.NestedInClassObject, i: D.Inner, ii: D.Inner.Inner, nn: D.Nested.Nested): D.Nested {
return D.Nested()
}
}
@@ -22,7 +22,7 @@ class C {
}
}
fun C.D.text() {
fun C.Default.D.text() {
Nested()
::Nested
}
@@ -1,4 +1,4 @@
import MyClass.*
import MyClass.Default.TEST
fun main() {
TEST
@@ -1,4 +1,4 @@
import MyClass.TEST
import MyClass.Default.TEST
fun main() {
TEST