This commit is contained in:
Valentin Kipyatkov
2016-09-06 18:33:11 +03:00
parent bcfa31de2b
commit 5a5a6d47b3
@@ -114,7 +114,7 @@ class ResolveElementCache(
} }
override fun resolveFunctionBody(function: KtNamedFunction) override fun resolveFunctionBody(function: KtNamedFunction)
= getElementsAdditionalResolve(function, emptyList(), BodyResolveMode.FULL) = getElementsAdditionalResolve(function, null, BodyResolveMode.FULL)
fun resolvePrimaryConstructorParametersDefaultValues(ktClass: KtClass): BindingContext { fun resolvePrimaryConstructorParametersDefaultValues(ktClass: KtClass): BindingContext {
return constructorAdditionalResolve(resolveSession, ktClass, ktClass.getContainingKtFile()).bindingContext return constructorAdditionalResolve(resolveSession, ktClass, ktClass.getContainingKtFile()).bindingContext
@@ -125,7 +125,11 @@ class ResolveElementCache(
return getElementsAdditionalResolve(resolveElement, listOf(contextElement), bodyResolveMode) return getElementsAdditionalResolve(resolveElement, listOf(contextElement), bodyResolveMode)
} }
fun getElementsAdditionalResolve(resolveElement: KtElement, contextElements: Collection<KtElement>, bodyResolveMode: BodyResolveMode): BindingContext { fun getElementsAdditionalResolve(resolveElement: KtElement, contextElements: Collection<KtElement>?, bodyResolveMode: BodyResolveMode): BindingContext {
if (contextElements == null) {
assert(bodyResolveMode == BodyResolveMode.FULL)
}
// check if full additional resolve already performed and is up-to-date // check if full additional resolve already performed and is up-to-date
val fullResolveMap = fullResolveCache.value val fullResolveMap = fullResolveCache.value
val cachedFullResolve = fullResolveMap[resolveElement] val cachedFullResolve = fullResolveMap[resolveElement]
@@ -140,18 +144,18 @@ class ResolveElementCache(
when (bodyResolveMode) { when (bodyResolveMode) {
BodyResolveMode.FULL -> { BodyResolveMode.FULL -> {
val bindingContext = performElementAdditionalResolve(resolveElement, emptyList(), BodyResolveMode.FULL).first val bindingContext = performElementAdditionalResolve(resolveElement, null, BodyResolveMode.FULL).first
fullResolveMap[resolveElement] = CachedFullResolve(bindingContext, resolveElement) fullResolveMap[resolveElement] = CachedFullResolve(bindingContext, resolveElement)
return bindingContext return bindingContext
} }
BodyResolveMode.PARTIAL -> { BodyResolveMode.PARTIAL -> {
if (resolveElement !is KtDeclaration) { if (resolveElement !is KtDeclaration) {
return getElementsAdditionalResolve(resolveElement, emptyList(), BodyResolveMode.FULL) return getElementsAdditionalResolve(resolveElement, null, BodyResolveMode.FULL)
} }
val file = resolveElement.getContainingKtFile() val file = resolveElement.getContainingKtFile()
val statementsToResolve = contextElements.map { PartialBodyResolveFilter.findStatementToResolve(it, resolveElement) }.distinct() val statementsToResolve = contextElements!!.map { PartialBodyResolveFilter.findStatementToResolve(it, resolveElement) }.distinct()
val partialResolveMap = partialBodyResolveCache.value val partialResolveMap = partialBodyResolveCache.value
val cachedResults = statementsToResolve.map { partialResolveMap[it ?: resolveElement] } val cachedResults = statementsToResolve.map { partialResolveMap[it ?: resolveElement] }
if (cachedResults.all { it != null && it.isUpToDate(file) }) { // partial resolve is already cached for these statements if (cachedResults.all { it != null && it.isUpToDate(file) }) { // partial resolve is already cached for these statements
@@ -181,7 +185,7 @@ class ResolveElementCache(
BodyResolveMode.PARTIAL_FOR_COMPLETION -> { BodyResolveMode.PARTIAL_FOR_COMPLETION -> {
if (resolveElement !is KtDeclaration) { if (resolveElement !is KtDeclaration) {
return getElementsAdditionalResolve(resolveElement, emptyList(), BodyResolveMode.FULL) return getElementsAdditionalResolve(resolveElement, null, BodyResolveMode.FULL)
} }
// not cached // not cached
@@ -280,8 +284,15 @@ class ResolveElementCache(
} }
} }
private fun performElementAdditionalResolve(resolveElement: KtElement, contextElements: Collection<KtElement>, private fun performElementAdditionalResolve(
bodyResolveMode: BodyResolveMode): Pair<BindingContext, StatementFilter> { resolveElement: KtElement,
contextElements: Collection<KtElement>?,
bodyResolveMode: BodyResolveMode
): Pair<BindingContext, StatementFilter> {
if (contextElements == null) {
assert(bodyResolveMode == BodyResolveMode.FULL)
}
val file = resolveElement.getContainingKtFile() val file = resolveElement.getContainingKtFile()
var statementFilterUsed = StatementFilter.NONE var statementFilterUsed = StatementFilter.NONE
@@ -290,7 +301,7 @@ class ResolveElementCache(
assert(resolveElement is KtDeclaration) assert(resolveElement is KtDeclaration)
if (bodyResolveMode != BodyResolveMode.FULL) { if (bodyResolveMode != BodyResolveMode.FULL) {
statementFilterUsed = PartialBodyResolveFilter( statementFilterUsed = PartialBodyResolveFilter(
contextElements, contextElements!!,
resolveElement as KtDeclaration, resolveElement as KtDeclaration,
probablyNothingCallableNames(), probablyNothingCallableNames(),
bodyResolveMode == BodyResolveMode.PARTIAL_FOR_COMPLETION) bodyResolveMode == BodyResolveMode.PARTIAL_FOR_COMPLETION)