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");