diff --git a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java index 3e04d107a8b..633da7780e4 100644 --- a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java +++ b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/ElementResolver.java @@ -95,22 +95,11 @@ public abstract class ElementResolver { elementOfAdditionalResolve = jetElement; } - if (partialBodyResolve && elementOfAdditionalResolve instanceof JetDeclarationWithBody) { - JetExpression body = ((JetDeclarationWithBody) elementOfAdditionalResolve).getBodyExpression(); + if (partialBodyResolve && elementOfAdditionalResolve instanceof JetDeclaration) { //TODO: do not resolve with filter if whole body resolve cached already - boolean inBody = body != null && PsiTreeUtil.isAncestor(body, jetElement, false); - Function1 filter; - if (inBody) { - filter = new PartialBodyResolveFilter(jetElement, body, probablyNothingCallableNames()); - } - else { // do as less as possible body-resolve - filter = new Function1() { - @Override - public Boolean invoke(JetElement element) { - return false; - } - }; - } + Function1 filter = new PartialBodyResolveFilter( + jetElement, + (JetDeclaration) elementOfAdditionalResolve, probablyNothingCallableNames()); return elementAdditionalResolve(elementOfAdditionalResolve, filter); } @@ -155,7 +144,7 @@ public abstract class ElementResolver { initializerAdditionalResolve(resolveSession, (JetClassInitializer) resolveElement, trace, file, bodyResolveFilter); } else if (resolveElement instanceof JetProperty) { - propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file); + propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file, bodyResolveFilter); } else if (resolveElement instanceof JetDelegationSpecifierList) { delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) resolveElement, trace, file); @@ -334,7 +323,12 @@ public abstract class ElementResolver { descriptor.getScopeForMemberDeclarationResolution()); } - private void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) { + private void propertyAdditionalResolve( + final ResolveSession resolveSession, + final JetProperty jetProperty, + BindingTrace trace, + JetFile file, + @Nullable Function1 bodyResolveFilter) { JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty); BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy( @@ -347,7 +341,7 @@ public abstract class ElementResolver { return resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration); } }); - BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, null); + BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, bodyResolveFilter); PropertyDescriptor descriptor = (PropertyDescriptor) resolveSession.resolveToDescriptor(jetProperty); ForceResolveUtil.forceResolveAllContents(descriptor); @@ -388,7 +382,7 @@ public abstract class ElementResolver { JetClass klass, BindingTrace trace, JetFile file, - @Nullable Function1 filter + @Nullable Function1 bodyResolveFilter ) { JetScope scope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(klass); @@ -399,7 +393,7 @@ public abstract class ElementResolver { classDescriptor, JetPsiUtil.getElementTextWithContext(klass)); - BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, filter); + BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, bodyResolveFilter); bodyResolver.resolveConstructorParameterDefaultValuesAndAnnotations(createEmptyContext(resolveSession), trace, klass, constructorDescriptor, scope); } diff --git a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt index 8bf9ca15841..d4b817ebc7c 100644 --- a/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt +++ b/idea/ide-common/src/org/jetbrains/jet/lang/resolve/lazy/PartialBodyResolveFilter.kt @@ -25,15 +25,15 @@ import java.util.ArrayList import java.util.HashMap import com.intellij.psi.PsiElement import org.jetbrains.jet.JetNodeTypes -import org.jetbrains.jet.lang.psi.psiUtil.isAncestor import org.jetbrains.jet.lang.psi.psiUtil.isProbablyNothing import org.jetbrains.jet.utils.addToStdlib.firstOrNullIsInstance +import org.jetbrains.jet.lang.psi.psiUtil.isAncestor //TODO: do resolve anonymous object's body class PartialBodyResolveFilter( elementToResolve: JetElement, - private val body: JetExpression, + private val declaration: JetDeclaration, probablyNothingCallableNames: ProbablyNothingCallableNames ) : (JetElement) -> Boolean { @@ -43,9 +43,9 @@ class PartialBodyResolveFilter( private val nothingPropertyNames = probablyNothingCallableNames.propertyNames() ;{ - assert(body.isAncestor(elementToResolve, strict = false)) + assert(declaration.isAncestor(elementToResolve)) - body.accept(object : JetVisitorVoid() { + declaration.accept(object : JetVisitorVoid() { override fun visitNamedFunction(function: JetNamedFunction) { super.visitNamedFunction(function) @@ -60,7 +60,7 @@ class PartialBodyResolveFilter( }) statementTree.mark(elementToResolve, MarkLevel.NEED_COMPLETION) - statementTree.blocks(body).forEach { + statementTree.blocks(declaration).forEach { processBlock(it) } } @@ -489,7 +489,7 @@ class PartialBodyResolveFilter( private val statementMarks = HashMap() private val blockLevels = HashMap() - val topLevelBlocks: Collection = blocks(body) + val topLevelBlocks: Collection = blocks(declaration) fun blocks(statement: JetExpression): Collection = blocks(statement : JetElement) @@ -510,7 +510,7 @@ class PartialBodyResolveFilter( fun mark(element: PsiElement, level: MarkLevel) { var e = element - while (e != body) { + while (e != declaration) { if (e.isStatement()) { markStatement(e as JetExpression, level) } diff --git a/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.dump b/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.dump new file mode 100644 index 00000000000..0295e0e9d6d --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.dump @@ -0,0 +1,14 @@ +Resolve target: val v: kotlin.Int +---------------------------------------------- +var prop: Int + get() { + // STATEMENT DELETED: print("get") + val v = 1 + v + // STATEMENT DELETED: return 1 + } + set { + // STATEMENT DELETED: print("set") + // STATEMENT DELETED: val v = 2 + // STATEMENT DELETED: print("yes") + } \ No newline at end of file diff --git a/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.kt b/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.kt new file mode 100644 index 00000000000..0498f9af377 --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.kt @@ -0,0 +1,12 @@ +var prop: Int + get() { + print("get") + val v = 1 + v + return 1 + } + set { + print("set") + val v = 2 + print("yes") + } \ No newline at end of file diff --git a/idea/testData/resolve/partialBodyResolve/PropertyValue.kt.todo b/idea/testData/resolve/partialBodyResolve/PropertyValue.kt.todo new file mode 100644 index 00000000000..804c9086ca6 --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/PropertyValue.kt.todo @@ -0,0 +1,6 @@ +val prop: Int = run { + print("a") + val v = 1 + v + 1 +} diff --git a/idea/tests/org/jetbrains/jet/resolve/PartialBodyResolveTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/PartialBodyResolveTestGenerated.java index 138b85f116c..1afb4ec5a9b 100644 --- a/idea/tests/org/jetbrains/jet/resolve/PartialBodyResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/PartialBodyResolveTestGenerated.java @@ -312,6 +312,12 @@ public class PartialBodyResolveTestGenerated extends AbstractPartialBodyResolveT doTest(fileName); } + @TestMetadata("PropertyAccessorBody.kt") + public void testPropertyAccessorBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/partialBodyResolve/PropertyAccessorBody.kt"); + doTest(fileName); + } + @TestMetadata("ReturnLambda.kt") public void testReturnLambda() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/partialBodyResolve/ReturnLambda.kt");