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 03aa716c118..e8e0fb98c39 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 @@ -61,20 +61,19 @@ public class ResolveElementCache(resolveSession: ResolveSession, private val pro if (bodyResolveMode != BodyResolveMode.FULL && !hasElementAdditionalResolveCached(resolveElement) && resolveElement is JetDeclaration) { if (bodyResolveMode == BodyResolveMode.PARTIAL) { val statementToResolve = PartialBodyResolveFilter.findStatementToResolve(contextElement, resolveElement) - if (statementToResolve != null) { - val map = partialBodyResolveCache.getValue() - map[statementToResolve]?.let { return it } + val map = partialBodyResolveCache.getValue() + map[statementToResolve ?: resolveElement]?.let { return it } - val (bindingContext, statementFilter) = performElementAdditionalResolve(resolveElement, statementToResolve, BodyResolveMode.PARTIAL) + val (bindingContext, statementFilter) = performElementAdditionalResolve(resolveElement, contextElement, BodyResolveMode.PARTIAL) - for (statement in (statementFilter as PartialBodyResolveFilter).allStatementsToResolve) { - if (!map.containsKey(statement)) { - map[statement] = bindingContext - } + for (statement in (statementFilter as PartialBodyResolveFilter).allStatementsToResolve) { + if (!map.containsKey(statement)) { + map[statement] = bindingContext } - - return bindingContext } + map[resolveElement] = bindingContext // we use the whole declaration key in the map to obtain resolve not inside any block (e.g. default parameter values) + + return bindingContext } else { return performElementAdditionalResolve(resolveElement, contextElement, bodyResolveMode).first diff --git a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt index 371180bc9e7..b221940bd9d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/ResolveElementCacheTest.kt @@ -29,7 +29,7 @@ public class ResolveElementCacheTest : JetLightCodeInsightFixtureTestCase() { private val FILE_TEXT = """ class C { - fun a() { + fun a(p: Int = 0) { b(1, 2) val x = c() d(x) @@ -144,4 +144,16 @@ class C { assert(bindingContext3 !== bindingContext1) } } + + public fun testPartialResolveCachedForDefaultParameterValue() { + doTest { + val defaultValue = (members[0] as JetNamedFunction).getValueParameters()[0].getDefaultValue() + val bindingContext1 = defaultValue!!.analyze(BodyResolveMode.PARTIAL) + val bindingContext2 = defaultValue.analyze(BodyResolveMode.PARTIAL) + assert(bindingContext1 === bindingContext2) + + val bindingContext3 = statements[0].analyze(BodyResolveMode.PARTIAL) + assert(bindingContext3 !== bindingContext2) + } + } }