diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index 165d264cc99..70cb89ddb88 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -86,6 +86,11 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl return null; } + @Override + public boolean isClassObjectAValue() { + return true; + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitClassDescriptor(this, data); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassifierDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassifierDescriptor.java index 48fc0d4f991..a1f19ab3162 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassifierDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassifierDescriptor.java @@ -17,4 +17,6 @@ public interface ClassifierDescriptor extends DeclarationDescriptor { @Nullable JetType getClassObjectType(); + + boolean isClassObjectAValue(); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index fef61c7690c..9c45cb6b4d3 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -95,6 +95,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { return original.getClassObjectType(); } + @Override + public boolean isClassObjectAValue() { + return original.isClassObjectAValue(); + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitClassDescriptor(this, data); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 0096fc610ae..e1eab068401 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -209,6 +209,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme return classObjectType; } + @Override + public boolean isClassObjectAValue() { + return true; + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitClassDescriptor(this, data); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java index 74f3580c93b..830e90a96bd 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java @@ -140,6 +140,11 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement return classObjectBoundsAsType; } + @Override + public boolean isClassObjectAValue() { + return true; + } + public int getIndex() { return index; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java index 245216bac1a..30b69267b8e 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java @@ -108,6 +108,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements return classObjectType; } + @Override + public boolean isClassObjectAValue() { + return false; + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitClassDescriptor(this, data); diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 4c1dc329db4..0d7fcfa5468 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -709,7 +709,7 @@ public class JetTypeInferrer { ClassifierDescriptor classifier = scope.getClassifier(referencedName); if (classifier != null) { JetType classObjectType = classifier.getClassObjectType(); - if (classObjectType != null) { + if (classObjectType != null && (isNamespacePosition() || classifier.isClassObjectAValue())) { result = classObjectType; } else { @@ -727,6 +727,10 @@ public class JetTypeInferrer { } } + public boolean isNamespacePosition() { + return false; + } + protected boolean furtherNameLookup(@NotNull JetSimpleNameExpression expression, @NotNull String referencedName) { NamespaceType namespaceType = lookupNamespaceType(expression, referencedName); if (namespaceType != null) { @@ -1867,6 +1871,11 @@ public class JetTypeInferrer { super(scope, preferBlock); } + @Override + public boolean isNamespacePosition() { + return true; + } + @NotNull @Override public TypeInferrerVisitor createNew(JetScope scope, boolean preferBlock) { diff --git a/idea/testData/checker/ClassObjects.jet b/idea/testData/checker/ClassObjects.jet new file mode 100644 index 00000000000..9df55d64496 --- /dev/null +++ b/idea/testData/checker/ClassObjects.jet @@ -0,0 +1,30 @@ +namespace Jet86 + +class A { + class object { + val x = 1 + } + class object { // error + val x = 1 + } +} + +class B() { + val x = 12 +} + +object b { + class object { + val x = 1 + } // error +} + +val a = A.x +val c = B.x +val d = b.x + +val s = System // error +fun test() { + System.out?.println() + java.lang.System.out?.println() +} \ No newline at end of file diff --git a/idea/testData/resolve/ClassObjects.jet b/idea/testData/resolve/ClassObjects.jet new file mode 100644 index 00000000000..6e8eb80ac82 --- /dev/null +++ b/idea/testData/resolve/ClassObjects.jet @@ -0,0 +1,15 @@ +namespace Jet86 + +~A~class A { + class object { + ~A.x~val x = 1 + } +} + +~B~class B() { + ~B.x~val x = 12 +} + +val a = `A`A.`A.x`x +val c = `B`B.`!null`x +val d = new B().`B.x`x \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java b/idea/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java index 5566cb2cf2e..09e5c7e9c21 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java +++ b/idea/tests/org/jetbrains/jet/resolve/ExpectedResolveData.java @@ -115,8 +115,8 @@ public class ExpectedResolveData { String name = entry.getValue(); PsiElement element = file.findElementAt(position); + JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class); if ("!".equals(name)) { - JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class); assertTrue( "Must have been unresolved: " + renderReferenceInContext(referenceExpression) + @@ -124,6 +124,15 @@ public class ExpectedResolveData { unresolvedReferences.contains(referenceExpression)); continue; } + else if ("!null".equals(name)) { + assertTrue( + "Must have been resolved to null: " + + renderReferenceInContext(referenceExpression) + + " but was resolved to " + DescriptorRenderer.TEXT.render(bindingContext.resolveReferenceExpression(referenceExpression)), + bindingContext.getExpressionType(referenceExpression) == null + ); + continue; + } PsiElement expected = nameToDeclaration.get(name); if (expected == null && name.startsWith("$")) {