JET-81 Assertion fails when processing in self-referring anonymous objects
This commit is contained in:
@@ -732,13 +732,22 @@ public class JetTypeInferrer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) {
|
public void visitObjectLiteralExpression(final JetObjectLiteralExpression expression) {
|
||||||
TopDownAnalyzer topDownAnalyzer = new TopDownAnalyzer(semanticServices, trace);
|
TopDownAnalyzer topDownAnalyzer = new TopDownAnalyzer(semanticServices, new BindingTraceAdapter(trace) {
|
||||||
|
@Override
|
||||||
|
public void recordDeclarationResolution(@NotNull PsiElement declaration, @NotNull DeclarationDescriptor descriptor) {
|
||||||
|
if (declaration == expression.getObjectDeclaration()) {
|
||||||
|
JetType defaultType = ((ClassDescriptor) descriptor).getDefaultType();
|
||||||
|
result = defaultType;
|
||||||
|
if (!trace.isProcessed(expression)) {
|
||||||
|
recordExpressionType(expression, defaultType);
|
||||||
|
markAsProcessed(expression);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.recordDeclarationResolution(declaration, descriptor);
|
||||||
|
}
|
||||||
|
});
|
||||||
topDownAnalyzer.processObject(scope, scope.getContainingDeclaration(), expression.getObjectDeclaration());
|
topDownAnalyzer.processObject(scope, scope.getContainingDeclaration(), expression.getObjectDeclaration());
|
||||||
ClassDescriptor classDescriptor = trace.getBindingContext().getClassDescriptor(expression.getObjectDeclaration());
|
|
||||||
if (classDescriptor != null) {
|
|
||||||
result = classDescriptor.getDefaultType();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
// JET-81 Assertion fails when processing self-referring anonymous objects
|
||||||
|
|
||||||
|
val y = object {
|
||||||
|
val a = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
val z = y.a;
|
||||||
|
|
||||||
|
object A {
|
||||||
|
val x = A
|
||||||
|
}
|
||||||
|
|
||||||
|
val a = object {
|
||||||
|
{
|
||||||
|
b + 1
|
||||||
|
}
|
||||||
|
val x = <error>b</error>
|
||||||
|
val y = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
val b = a.x
|
||||||
|
val c = a.y
|
||||||
Reference in New Issue
Block a user