Fixed partial resolve for default parameter values
This commit is contained in:
@@ -61,20 +61,19 @@ public class ResolveElementCache(resolveSession: ResolveSession, private val pro
|
|||||||
if (bodyResolveMode != BodyResolveMode.FULL && !hasElementAdditionalResolveCached(resolveElement) && resolveElement is JetDeclaration) {
|
if (bodyResolveMode != BodyResolveMode.FULL && !hasElementAdditionalResolveCached(resolveElement) && resolveElement is JetDeclaration) {
|
||||||
if (bodyResolveMode == BodyResolveMode.PARTIAL) {
|
if (bodyResolveMode == BodyResolveMode.PARTIAL) {
|
||||||
val statementToResolve = PartialBodyResolveFilter.findStatementToResolve(contextElement, resolveElement)
|
val statementToResolve = PartialBodyResolveFilter.findStatementToResolve(contextElement, resolveElement)
|
||||||
if (statementToResolve != null) {
|
val map = partialBodyResolveCache.getValue()
|
||||||
val map = partialBodyResolveCache.getValue()
|
map[statementToResolve ?: resolveElement]?.let { return it }
|
||||||
map[statementToResolve]?.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) {
|
for (statement in (statementFilter as PartialBodyResolveFilter).allStatementsToResolve) {
|
||||||
if (!map.containsKey(statement)) {
|
if (!map.containsKey(statement)) {
|
||||||
map[statement] = bindingContext
|
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 {
|
else {
|
||||||
return performElementAdditionalResolve(resolveElement, contextElement, bodyResolveMode).first
|
return performElementAdditionalResolve(resolveElement, contextElement, bodyResolveMode).first
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public class ResolveElementCacheTest : JetLightCodeInsightFixtureTestCase() {
|
|||||||
private val FILE_TEXT =
|
private val FILE_TEXT =
|
||||||
"""
|
"""
|
||||||
class C {
|
class C {
|
||||||
fun a() {
|
fun a(p: Int = 0) {
|
||||||
b(1, 2)
|
b(1, 2)
|
||||||
val x = c()
|
val x = c()
|
||||||
d(x)
|
d(x)
|
||||||
@@ -144,4 +144,16 @@ class C {
|
|||||||
assert(bindingContext3 !== bindingContext1)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user