diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 60f4033e81d..378ae4dc240 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -250,7 +250,7 @@ public class ExpressionCodegen extends JetVisitor { @Override public void visitReferenceExpression(JetReferenceExpression expression) { - final DeclarationDescriptor descriptor = bindingContext.resolve(expression); + final DeclarationDescriptor descriptor = bindingContext.resolveReferenceExpression(expression); if (descriptor instanceof ValueParameterDescriptor) { final int index = ((ValueParameterDescriptor) descriptor).getIndex(); v.visitVarInsn(Opcodes.ALOAD, index); // TODO +1 for non-static methods diff --git a/idea/src/org/jetbrains/jet/lang/JetSemanticServices.java b/idea/src/org/jetbrains/jet/lang/JetSemanticServices.java index 0387abc4ab5..e963564c1c6 100644 --- a/idea/src/org/jetbrains/jet/lang/JetSemanticServices.java +++ b/idea/src/org/jetbrains/jet/lang/JetSemanticServices.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang; +import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.resolve.ClassDescriptorResolver; import org.jetbrains.jet.lang.types.BindingTrace; import org.jetbrains.jet.lang.types.JetStandardLibrary; @@ -17,6 +18,10 @@ public class JetSemanticServices { this.typeInferrer = new JetTypeInferrer(BindingTrace.DUMMY, this); } + public JetSemanticServices(Project project) { + this(new JetStandardLibrary(project)); + } + public JetStandardLibrary getStandardLibrary() { return standardLibrary; } diff --git a/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java b/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java index cd6e21d1ff6..99b8e1ae228 100644 --- a/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java +++ b/idea/src/org/jetbrains/jet/lang/annotations/JetPsiChecker.java @@ -4,7 +4,11 @@ import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.Annotator; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.JetSemanticServices; +import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.TopDownAnalyzer; +import org.jetbrains.jet.lang.types.Type; /** * @author abreslav @@ -12,10 +16,21 @@ import org.jetbrains.jet.lang.psi.JetFile; public class JetPsiChecker implements Annotator { @Override - public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) { + public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) { if (element instanceof JetFile) { JetFile file = (JetFile) element; -// JetScope jetScope = FileContentsResolver.INSTANCE.resolveFileContents(JetStandardClasses.STANDARD_CLASSES, file); + JetSemanticServices semanticServices = new JetSemanticServices(element.getProject()); + final BindingContext bindingContext = new TopDownAnalyzer(semanticServices).process(semanticServices.getStandardLibrary().getLibraryScope(), file.getRootNamespace().getDeclarations()); + file.getRootNamespace().accept(new JetVisitor() { + @Override + public void visitClass(JetClass klass) { + for (JetDelegationSpecifier specifier : klass.getDelegationSpecifiers()) { + JetTypeReference typeReference = specifier.getTypeReference(); + Type type = bindingContext.resolveTypeReference(typeReference); + holder.createInfoAnnotation(typeReference, type.toString()); + } + } + }); } } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java index ad2d9d71a72..dd687ba3b85 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -12,9 +12,9 @@ public interface BindingContext { FunctionDescriptor getFunctionDescriptor(JetFunction declaration); PropertyDescriptor getPropertyDescriptor(JetProperty declaration); - Type getType(JetTypeReference typeReference); Type getExpressionType(JetExpression expression); - DeclarationDescriptor resolve(JetReferenceExpression referenceExpression); - JetScope getTopLevelScope(); + + DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression); + Type resolveTypeReference(JetTypeReference typeReference); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 95a3249a39d..f7683f3e3cd 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -72,7 +72,7 @@ public class TopDownAnalyzer { } @Override - public Type getType(JetTypeReference typeReference) { + public Type resolveTypeReference(JetTypeReference typeReference) { return types.get(typeReference); } @@ -82,7 +82,7 @@ public class TopDownAnalyzer { } @Override - public DeclarationDescriptor resolve(JetReferenceExpression referenceExpression) { + public DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression) { return resolutionResults.get(referenceExpression); } diff --git a/idea/testData/checker/Properties.jet b/idea/testData/checker/Properties.jet index ac8822a534a..04793824d60 100644 --- a/idea/testData/checker/Properties.jet +++ b/idea/testData/checker/Properties.jet @@ -1,2 +1,2 @@ -val foo +val foo = 1 diff --git a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java index ec3eeb240f6..040da36583c 100644 --- a/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java +++ b/idea/tests/org/jetbrains/jet/resolve/JetResolveTest.java @@ -63,7 +63,7 @@ public class JetResolveTest extends LightDaemonAnalyzerTestCase { assertEquals(library.getIntType(), expressionType); { - DeclarationDescriptor resolve = bindingContext.resolve((JetReferenceExpression) fooDecl.getBodyExpression()); + DeclarationDescriptor resolve = bindingContext.resolveReferenceExpression((JetReferenceExpression) fooDecl.getBodyExpression()); assertSame(bindingContext.getFunctionDescriptor(fooDecl).getUnsubstitutedValueParameters().get(0), resolve); } @@ -71,7 +71,7 @@ public class JetResolveTest extends LightDaemonAnalyzerTestCase { JetFunction fooBDecl = (JetFunction) classADecl.getDeclarations().get(2); JetCallExpression fooBBody = (JetCallExpression) fooBDecl.getBodyExpression(); JetReferenceExpression refToFoo = (JetReferenceExpression) fooBBody.getCalleeExpression(); - FunctionDescriptor mustBeFoo = (FunctionDescriptor) bindingContext.resolve(refToFoo); + FunctionDescriptor mustBeFoo = (FunctionDescriptor) bindingContext.resolveReferenceExpression(refToFoo); assertSame(bindingContext.getFunctionDescriptor(fooDecl), FunctionDescriptorUtil.getOriginal(mustBeFoo)); } @@ -80,7 +80,7 @@ public class JetResolveTest extends LightDaemonAnalyzerTestCase { JetCallExpression fooIntBody = (JetCallExpression) fooIntDecl.getBodyExpression(); JetDotQualifiedExpression qualifiedPlus = (JetDotQualifiedExpression) fooIntBody.getCalleeExpression(); JetReferenceExpression refToPlus = (JetReferenceExpression) qualifiedPlus.getSelectorExpression(); - FunctionDescriptor mustBePlus = (FunctionDescriptor) bindingContext.resolve(refToPlus); + FunctionDescriptor mustBePlus = (FunctionDescriptor) bindingContext.resolveReferenceExpression(refToPlus); FunctionGroup plusGroup = library.getInt().getMemberScope(Collections.emptyList()).getFunctionGroup("plus"); Collection pluses = plusGroup.getPossiblyApplicableFunctions(Collections.emptyList(), Collections.singletonList(library.getIntType())); FunctionDescriptor intPlus = null; @@ -97,7 +97,7 @@ public class JetResolveTest extends LightDaemonAnalyzerTestCase { assertSame(a, mustBeA); JetTypeReference propertyTypeRef = aDecl.getPropertyTypeRef(); - Type type = bindingContext.getType(propertyTypeRef); + Type type = bindingContext.resolveTypeReference(propertyTypeRef); assertEquals(library.getIntType(), type); }