JET-86: Report errors for class objects
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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("$")) {
|
||||
|
||||
Reference in New Issue
Block a user