Implemented ability to analyze to multiple elements at once

This commit is contained in:
Valentin Kipyatkov
2016-09-05 21:15:28 +03:00
parent 36c2b01047
commit bcfa31de2b
12 changed files with 130 additions and 44 deletions
@@ -30,6 +30,7 @@ interface ResolutionFacade {
val project: Project
fun analyze(element: KtElement, bodyResolveMode: BodyResolveMode = BodyResolveMode.FULL): BindingContext
fun analyze(elements: Collection<KtElement>, bodyResolveMode: BodyResolveMode): BindingContext
fun analyzeFullyAndGetResult(elements: Collection<KtElement>): AnalysisResult
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.resolve.lazy
import com.intellij.psi.PsiElement
import com.intellij.util.SmartList
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
@@ -26,14 +25,12 @@ import org.jetbrains.kotlin.resolve.StatementFilter
import org.jetbrains.kotlin.util.isProbablyNothing
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.swap
import java.util.ArrayList
import java.util.HashMap
import java.util.HashSet
import java.util.*
//TODO: do resolve anonymous object's body
class PartialBodyResolveFilter(
elementToResolve: KtElement,
elementsToResolve: Collection<KtElement>,
private val declaration: KtDeclaration,
probablyNothingCallableNames: ProbablyNothingCallableNames,
forCompletion: Boolean
@@ -50,7 +47,7 @@ class PartialBodyResolveFilter(
get() = statementMarks.allMarkedStatements()
init {
assert(declaration.isAncestor(elementToResolve))
elementsToResolve.forEach { assert(declaration.isAncestor(it)) }
assert(!KtPsiUtil.isLocal(declaration)) { "Should never be invoked on local declaration otherwise we may miss some local declarations with type Nothing" }
declaration.forEachDescendantOfType<KtCallableDeclaration> { declaration ->
@@ -67,7 +64,9 @@ class PartialBodyResolveFilter(
}
}
statementMarks.mark(elementToResolve, if (forCompletion) MarkLevel.NEED_COMPLETION else MarkLevel.NEED_REFERENCE_RESOLVE)
elementsToResolve.forEach {
statementMarks.mark(it, if (forCompletion) MarkLevel.NEED_COMPLETION else MarkLevel.NEED_REFERENCE_RESOLVE)
}
declaration.forTopLevelBlocksInside { processBlock(it) }
}