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;
|
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) {
|
||||||
|
|||||||
@@ -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();
|
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("$")) {
|
||||||
|
|||||||
Reference in New Issue
Block a user