Fixed partial resolve for default parameter values

This commit is contained in:
Valentin Kipyatkov
2015-07-13 17:46:29 +03:00
parent 02de67417a
commit ea25e5d02a
2 changed files with 22 additions and 11 deletions
@@ -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
@@ -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)
}
}
}