diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index 051582e5988..62013b7a696 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -107,7 +107,7 @@ public class OverloadResolver { ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; inClasses.put(classDescriptor, klass.getConstructors()); } - else { + else if (!(containingDeclaration instanceof FunctionDescriptor)) { throw new IllegalStateException(); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 69ef8569ede..d2be06c6289 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerBasic; import org.jetbrains.jet.lang.ModuleConfiguration; import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetObjectDeclaration; @@ -191,12 +192,12 @@ public class TopDownAnalyzer { doProcess(outerScope, standardLibraryNamespace.getBuilder(), toAnalyze); } - public static void processObject( + public static void processClassOrObject( @NotNull Project project, @NotNull final BindingTrace trace, @NotNull JetScope outerScope, @NotNull final DeclarationDescriptor containingDeclaration, - @NotNull JetObjectDeclaration object + @NotNull JetClassOrObject object ) { ModuleDescriptor moduleDescriptor = new ModuleDescriptor(Name.special("")); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java index d7d1713d26c..928d5abd6e9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java @@ -80,7 +80,8 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { }; ObservableBindingTrace traceAdapter = new ObservableBindingTrace(temporaryTrace); traceAdapter.addHandler(CLASS, handler); - TopDownAnalyzer.processObject(context.expressionTypingServices.getProject(), traceAdapter, context.scope, context.scope.getContainingDeclaration(), expression.getObjectDeclaration()); + TopDownAnalyzer.processClassOrObject(context.expressionTypingServices.getProject(), traceAdapter, context.scope, + context.scope.getContainingDeclaration(), expression.getObjectDeclaration()); DelegatingBindingTrace cloneDelta = new DelegatingBindingTrace(new BindingTraceContext().getBindingContext()); temporaryTrace.addAllMyDataTo(cloneDelta); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index c09adcc84b4..aabeaf652cd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -79,7 +79,8 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito @Override public JetType visitObjectDeclaration(JetObjectDeclaration declaration, ExpressionTypingContext context) { - TopDownAnalyzer.processObject(context.expressionTypingServices.getProject(), context.trace, scope, scope.getContainingDeclaration(), declaration); + TopDownAnalyzer.processClassOrObject(context.expressionTypingServices.getProject(), context.trace, scope, + scope.getContainingDeclaration(), declaration); ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration); if (classDescriptor != null) { VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver() @@ -136,7 +137,13 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito @Override public JetType visitClass(JetClass klass, ExpressionTypingContext context) { - return super.visitClass(klass, context); // TODO + TopDownAnalyzer.processClassOrObject(context.expressionTypingServices.getProject(), context.trace, scope, + scope.getContainingDeclaration(), klass); + ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, klass); + if (classDescriptor != null) { + scope.addClassifierDescriptor(classDescriptor); + } + return DataFlowUtils.checkStatementType(klass, context); } @Override diff --git a/compiler/testData/diagnostics/tests/IdeTemplates.jet b/compiler/testData/diagnostics/tests/IdeTemplates.jet index b6887d409bc..09e92932894 100644 --- a/compiler/testData/diagnostics/tests/IdeTemplates.jet +++ b/compiler/testData/diagnostics/tests/IdeTemplates.jet @@ -18,25 +18,24 @@ fun main(args : Array) { else -> <##> } - var <##> = <##> + var <##> = <##> - class <##> { + class <##> { <##> - } + } - class <##> { - var <##> : <##> - get() { - <##> - } + class <##> { + var <##> : <##> + get() { + <##> + } set(value) { - <##> - } - - val <##> : <##> - get() { - <##> - } - } -} + <##> + } + val <##> : <##> + get() { + <##> + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt2142.jet b/compiler/testData/diagnostics/tests/declarationChecks/kt2142.jet new file mode 100644 index 00000000000..4410e01c0a1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt2142.jet @@ -0,0 +1,8 @@ +//KT-2142 function local classes do not work + +package a + +fun foo() { + class Foo() {} + Foo() // Unresolved reference Foo +} \ No newline at end of file