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;
}
@Override
public boolean isClassObjectAValue() {
return true;
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data);
@@ -17,4 +17,6 @@ public interface ClassifierDescriptor extends DeclarationDescriptor {
@Nullable
JetType getClassObjectType();
boolean isClassObjectAValue();
}
@@ -95,6 +95,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
return original.getClassObjectType();
}
@Override
public boolean isClassObjectAValue() {
return original.isClassObjectAValue();
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data);
@@ -209,6 +209,11 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
return classObjectType;
}
@Override
public boolean isClassObjectAValue() {
return true;
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data);
@@ -140,6 +140,11 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement
return classObjectBoundsAsType;
}
@Override
public boolean isClassObjectAValue() {
return true;
}
public int getIndex() {
return index;
}
@@ -108,6 +108,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
return classObjectType;
}
@Override
public boolean isClassObjectAValue() {
return false;
}
@Override
public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
return visitor.visitClassDescriptor(this, data);
@@ -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) {
+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();
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("$")) {