diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index afe851e3b6c..f5065ee630a 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -732,13 +732,22 @@ public class JetTypeInferrer { } @Override - public void visitObjectLiteralExpression(JetObjectLiteralExpression expression) { - TopDownAnalyzer topDownAnalyzer = new TopDownAnalyzer(semanticServices, trace); + public void visitObjectLiteralExpression(final JetObjectLiteralExpression expression) { + 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()); - ClassDescriptor classDescriptor = trace.getBindingContext().getClassDescriptor(expression.getObjectDeclaration()); - if (classDescriptor != null) { - result = classDescriptor.getDefaultType(); - } } @Override diff --git a/idea/testData/checker/regression/Jet81.jet b/idea/testData/checker/regression/Jet81.jet new file mode 100644 index 00000000000..cafc4840db7 --- /dev/null +++ b/idea/testData/checker/regression/Jet81.jet @@ -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 = b + val y = 1 +} + +val b = a.x +val c = a.y