JET-86: Report errors for class objects

This commit is contained in:
Andrey Breslav
2011-06-04 15:32:45 +04:00
parent a1ce9eefb5
commit cc54631209
10 changed files with 92 additions and 2 deletions
@@ -86,6 +86,11 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
return null; return null;
} }
@Override
public boolean isClassObjectAValue() {
return true;
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data); return visitor.visitClassDescriptor(this, data);
@@ -17,4 +17,6 @@ public interface ClassifierDescriptor extends DeclarationDescriptor {
@Nullable @Nullable
JetType getClassObjectType(); JetType getClassObjectType();
boolean isClassObjectAValue();
} }
@@ -95,6 +95,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.getClassObjectType(); return original.getClassObjectType();
} }
@Override
public boolean isClassObjectAValue() {
return original.isClassObjectAValue();
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data); return visitor.visitClassDescriptor(this, data);
@@ -209,6 +209,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
return classObjectType; return classObjectType;
} }
@Override
public boolean isClassObjectAValue() {
return true;
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data); return visitor.visitClassDescriptor(this, data);
@@ -140,6 +140,11 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement
return classObjectBoundsAsType; return classObjectBoundsAsType;
} }
@Override
public boolean isClassObjectAValue() {
return true;
}
public int getIndex() { public int getIndex() {
return index; return index;
} }
@@ -108,6 +108,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
return classObjectType; return classObjectType;
} }
@Override
public boolean isClassObjectAValue() {
return false;
}
@Override @Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) { public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data); return visitor.visitClassDescriptor(this, data);
@@ -709,7 +709,7 @@ public class JetTypeInferrer {
ClassifierDescriptor classifier = scope.getClassifier(referencedName); ClassifierDescriptor classifier = scope.getClassifier(referencedName);
if (classifier != null) { if (classifier != null) {
JetType classObjectType = classifier.getClassObjectType(); JetType classObjectType = classifier.getClassObjectType();
if (classObjectType != null) { if (classObjectType != null && (isNamespacePosition() || classifier.isClassObjectAValue())) {
result = classObjectType; result = classObjectType;
} }
else { else {
@@ -727,6 +727,10 @@ public class JetTypeInferrer {
} }
} }
public boolean isNamespacePosition() {
return false;
}
protected boolean furtherNameLookup(@NotNull JetSimpleNameExpression expression, @NotNull String referencedName) { protected boolean furtherNameLookup(@NotNull JetSimpleNameExpression expression, @NotNull String referencedName) {
NamespaceType namespaceType = lookupNamespaceType(expression, referencedName); NamespaceType namespaceType = lookupNamespaceType(expression, referencedName);
if (namespaceType != null) { if (namespaceType != null) {
@@ -1867,6 +1871,11 @@ public class JetTypeInferrer {
super(scope, preferBlock); super(scope, preferBlock);
} }
@Override
public boolean isNamespacePosition() {
return true;
}
@NotNull @NotNull
@Override @Override
public TypeInferrerVisitor createNew(JetScope scope, boolean preferBlock) { public TypeInferrerVisitor createNew(JetScope scope, boolean preferBlock) {
+30
View File
@@ -0,0 +1,30 @@
namespace Jet86
class A {
class object {
val x = 1
}
<error>class object { // error
val x = 1
}</error>
}
class B() {
val x = 12
}
object b {
<error>class object {
val x = 1
}</error> // error
}
val a = A.x
val c = <error>B</error>.x
val d = b.<error>x</error>
val s = <error>System</error> // error
fun test() {
System.out?.println()
java.lang.System.out?.println()
}
+15
View File
@@ -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
@@ -115,8 +115,8 @@ public class ExpectedResolveData {
String name = entry.getValue(); String name = entry.getValue();
PsiElement element = file.findElementAt(position); PsiElement element = file.findElementAt(position);
JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class);
if ("!".equals(name)) { if ("!".equals(name)) {
JetReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, JetReferenceExpression.class);
assertTrue( assertTrue(
"Must have been unresolved: " + "Must have been unresolved: " +
renderReferenceInContext(referenceExpression) + renderReferenceInContext(referenceExpression) +
@@ -124,6 +124,15 @@ public class ExpectedResolveData {
unresolvedReferences.contains(referenceExpression)); unresolvedReferences.contains(referenceExpression));
continue; 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); PsiElement expected = nameToDeclaration.get(name);
if (expected == null && name.startsWith("$")) { if (expected == null && name.startsWith("$")) {