diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt index f42226fb844..768c59eb254 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt @@ -235,6 +235,14 @@ private class MergedDiagnostics(val diagnostics: Collection, overrid override fun noSuppression() = this } +/** + * Keep in mind: trace fallbacks to [resolveContext] (is used during resolve) that does not have any + * traces of earlier resolve for this [element] + * + * When trace turned into [BindingContext] it fallbacks to [parentContext]: + * It is expected that all slices specific to [element] (and its descendants) are stored in this binding context + * and for the rest elements it falls back to [parentContext]. + */ private class StackedCompositeBindingContextTrace( val depth: Int, // depth of stack over original ktFile bindingContext val element: KtElement, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt index 4d0c927f32a..d6e8c9bfa83 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt @@ -238,7 +238,19 @@ class KotlinCodeBlockModificationListener( // adding annotations to accessor is the same as change contract of property (element !is KtAnnotated || element.annotationEntries.isEmpty()) } - ?.let { return BlockModificationScopeElement(blockDeclaration, it) } + ?.let { expression -> + val declaration = if (blockDeclaration.initializer != null) + blockDeclaration + else + KtPsiUtil.getTopmostParentOfTypes( + blockDeclaration, + // property could be initialized on a class level + KtClass::class.java, + // ktFile to check top level property declarations + KtFile::class.java + ) as KtElement + return BlockModificationScopeElement(declaration, expression) + } } } }