From 68c65a5014bc7370a09cce11ec42895c1001ac19 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 18 Dec 2018 14:36:14 +0300 Subject: [PATCH] KT-25156: Fix stack overflow on top level destructuring with lambda init Support destructuring in additional resolve pass (resolveToElements) #KT-25156 Fixed --- .../idea/project/ResolveElementCache.kt | 29 +++++++++++++++---- .../highlighter/TopLevelDestructuring.kt | 13 +++++++++ .../HighlightingTestGenerated.java | 5 ++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 idea/testData/highlighter/TopLevelDestructuring.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index f60d653c581..b1618456643 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -33,10 +33,7 @@ import org.jetbrains.kotlin.frontend.di.createContainerForBodyResolve import org.jetbrains.kotlin.idea.caches.resolve.CodeFragmentAnalyzer import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType -import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.* @@ -256,7 +253,8 @@ class ResolveElementCache( KtTypeConstraint::class.java, KtPackageDirective::class.java, KtCodeFragment::class.java, - KtTypeAlias::class.java + KtTypeAlias::class.java, + KtDestructuringDeclaration::class.java ) as KtElement? when (elementOfAdditionalResolve) { @@ -314,6 +312,12 @@ class ResolveElementCache( } val trace: BindingTrace = when (resolveElement) { + is KtDestructuringDeclaration -> destructuringDeclarationAdditionalResolve( + resolveSession, + resolveElement, + bodyResolveMode.bindingTraceFilter + ) + is KtNamedFunction -> functionAdditionalResolve( resolveSession, resolveElement, @@ -535,6 +539,21 @@ class ResolveElementCache( return trace } + + private fun destructuringDeclarationAdditionalResolve( + resolveSession: ResolveSession, + declaration: KtDestructuringDeclaration, + bindingTraceFilter: BindingTraceFilter + ): BindingTrace { + for (entry in declaration.entries) { + val descriptor = resolveSession.resolveToDescriptor(entry) as PropertyDescriptor + ForceResolveUtil.forceResolveAllContents(descriptor) + forceResolveAnnotationsInside(entry) + } + + return createDelegatingTrace(declaration, bindingTraceFilter) + } + private fun propertyAdditionalResolve( resolveSession: ResolveSession, property: KtProperty, file: KtFile, diff --git a/idea/testData/highlighter/TopLevelDestructuring.kt b/idea/testData/highlighter/TopLevelDestructuring.kt new file mode 100644 index 00000000000..8d4b9c41f5a --- /dev/null +++ b/idea/testData/highlighter/TopLevelDestructuring.kt @@ -0,0 +1,13 @@ + + +val (a, b) by lazy { Pair(1, 2) } +val (c, d) = run { Pair(3, 4) } + + +class Foo { + val (a, b) by lazy { Pair(1, 2) } + val (c, d) = run { Pair(3, 4) } +} + +// NO_CHECK_INFOS +// WITH_RUNTIME \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightingTestGenerated.java index 9310e866ef6..499581ebbc8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightingTestGenerated.java @@ -114,6 +114,11 @@ public class HighlightingTestGenerated extends AbstractHighlightingTest { runTest("idea/testData/highlighter/Todo.kt"); } + @TestMetadata("TopLevelDestructuring.kt") + public void testTopLevelDestructuring() throws Exception { + runTest("idea/testData/highlighter/TopLevelDestructuring.kt"); + } + @TestMetadata("TopLevelOpenSuspendFun.kt") public void testTopLevelOpenSuspendFun() throws Exception { runTest("idea/testData/highlighter/TopLevelOpenSuspendFun.kt");