diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index bc9a03f608c..6715e8b1965 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.types.expressions; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.intellij.lang.ASTNode; @@ -39,6 +40,7 @@ import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.name.LabelName; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.resolve.scopes.FilteringScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; @@ -104,14 +106,30 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { } // To report NO_CLASS_OBJECT when no namespace found if (classifier != null) { - context.trace.report(NO_CLASS_OBJECT.on(expression, classifier)); + if (!context.namespacesAllowed) { + context.trace.report(NO_CLASS_OBJECT.on(expression, classifier)); + } context.trace.record(REFERENCE_TARGET, expression, classifier); - return classifier.getDefaultType(); + JetScope scopeForStaticMembersResolution = classifier instanceof ClassDescriptor + ? getStaticNestedClassesScope((ClassDescriptor) classifier) + : JetScope.EMPTY; + return new NamespaceType(referencedName, scopeForStaticMembersResolution); } temporaryTrace.commit(); return result[0]; } + @NotNull + private static JetScope getStaticNestedClassesScope(@NotNull ClassDescriptor descriptor) { + JetScope innerClassesScope = descriptor.getUnsubstitutedInnerClassesScope(); + return new FilteringScope(innerClassesScope, new Predicate() { + @Override + public boolean apply(@Nullable DeclarationDescriptor descriptor) { + return descriptor instanceof ClassDescriptor && !((ClassDescriptor) descriptor).isInner(); + } + }); + } + protected boolean furtherNameLookup(@NotNull JetSimpleNameExpression expression, @NotNull Name referencedName, @NotNull JetType[] result, ExpressionTypingContext context) { if (context.namespacesAllowed) { result[0] = lookupNamespaceType(expression, referencedName, context); diff --git a/compiler/testData/diagnostics/tests/ClassObjects.kt b/compiler/testData/diagnostics/tests/ClassObjects.kt index 716806c23f3..bc1e6576e87 100644 --- a/compiler/testData/diagnostics/tests/ClassObjects.kt +++ b/compiler/testData/diagnostics/tests/ClassObjects.kt @@ -21,7 +21,7 @@ object b { } val a = A.x -val c = B.x +val c = B.x val d = b.x val s = System // error diff --git a/compiler/testData/resolve/ClassObjects.jet b/compiler/testData/resolve/ClassObjects.jet index b661ddd2b53..f7574a7e1bf 100644 --- a/compiler/testData/resolve/ClassObjects.jet +++ b/compiler/testData/resolve/ClassObjects.jet @@ -11,5 +11,4 @@ package Jet86 } val a = `A`A.`A.x`x -val c = `B`B.`B.x`x val d = B().`B.x`x \ No newline at end of file diff --git a/idea/testData/checker/ClassObjects.kt b/idea/testData/checker/ClassObjects.kt index cc43a7556ae..7a36c4b4000 100644 --- a/idea/testData/checker/ClassObjects.kt +++ b/idea/testData/checker/ClassObjects.kt @@ -20,7 +20,7 @@ object b { } val a = A.x -val c = B.x +val c = B.x val d = b.x val s = System // error diff --git a/idea/testData/javaFacade/ea38770.kt b/idea/testData/javaFacade/ea38770.kt index 9c02663cfc0..de85a1894ba 100644 --- a/idea/testData/javaFacade/ea38770.kt +++ b/idea/testData/javaFacade/ea38770.kt @@ -1,3 +1,3 @@ -fun foo() { +fun foo() where class object T : Any { T.toString() }