More advanced partial body resolve caching
This commit is contained in:
@@ -47,7 +47,7 @@ public abstract class ElementResolver protected constructor(
|
||||
public val resolveSession: ResolveSession
|
||||
) {
|
||||
public open fun getElementAdditionalResolve(resolveElement: JetElement, contextElement: JetElement, bodyResolveMode: BodyResolveMode): BindingContext {
|
||||
return performElementAdditionalResolve(resolveElement, resolveElement, bodyResolveMode)
|
||||
return performElementAdditionalResolve(resolveElement, resolveElement, bodyResolveMode).first
|
||||
}
|
||||
|
||||
protected open fun probablyNothingCallableNames(): ProbablyNothingCallableNames
|
||||
@@ -74,7 +74,7 @@ public abstract class ElementResolver protected constructor(
|
||||
return resolveSession.getBindingContext()
|
||||
}
|
||||
|
||||
protected fun findElementOfAdditionalResolve(element: JetElement): JetElement? {
|
||||
private fun findElementOfAdditionalResolve(element: JetElement): JetElement? {
|
||||
val elementOfAdditionalResolve = JetPsiUtil.getTopmostParentOfTypes(
|
||||
element,
|
||||
javaClass<JetNamedFunction>(),
|
||||
@@ -107,7 +107,7 @@ public abstract class ElementResolver protected constructor(
|
||||
}
|
||||
}
|
||||
|
||||
protected fun performElementAdditionalResolve(resolveElement: JetElement, contextElement: JetElement, bodyResolveMode: BodyResolveMode): BindingContext {
|
||||
protected fun performElementAdditionalResolve(resolveElement: JetElement, contextElement: JetElement, bodyResolveMode: BodyResolveMode): Pair<BindingContext, StatementFilter> {
|
||||
val file = resolveElement.getContainingJetFile()
|
||||
|
||||
val statementFilter = if (bodyResolveMode != BodyResolveMode.FULL && resolveElement is JetDeclaration)
|
||||
@@ -158,7 +158,7 @@ public abstract class ElementResolver protected constructor(
|
||||
JetFlowInformationProvider(resolveElement, controlFlowTrace).checkDeclaration()
|
||||
controlFlowTrace.addOwnDataTo(trace, null, false)
|
||||
|
||||
return trace.getBindingContext()
|
||||
return Pair(trace.getBindingContext(), statementFilter)
|
||||
}
|
||||
|
||||
private fun packageRefAdditionalResolve(resolveSession: ResolveSession, jetElement: JetElement): BindingTrace {
|
||||
@@ -447,8 +447,9 @@ public abstract class ElementResolver protected constructor(
|
||||
return null
|
||||
}
|
||||
|
||||
protected abstract fun createAdditionalCheckerProvider(jetFile: JetFile, module: ModuleDescriptor): AdditionalCheckerProvider
|
||||
protected abstract fun getDynamicTypesSettings(jetFile: JetFile): DynamicTypesSettings
|
||||
protected abstract fun createAdditionalCheckerProvider(file: JetFile, module: ModuleDescriptor): AdditionalCheckerProvider
|
||||
|
||||
protected abstract fun getDynamicTypesSettings(file: JetFile): DynamicTypesSettings
|
||||
|
||||
private class BodyResolveContextForLazy(
|
||||
private val topDownAnalysisMode: TopDownAnalysisMode,
|
||||
|
||||
@@ -46,7 +46,10 @@ class PartialBodyResolveFilter(
|
||||
private val nothingFunctionNames = HashSet(probablyNothingCallableNames.functionNames())
|
||||
private val nothingVariableNames = HashSet(probablyNothingCallableNames.propertyNames())
|
||||
|
||||
override val filter: ((JetExpression) -> Boolean)? = { statementMarks.statementMark(it) != MarkLevel.SKIP }
|
||||
override val filter: ((JetExpression) -> Boolean)? = { statementMarks.statementMark(it) != MarkLevel.NONE }
|
||||
|
||||
val allStatementsToResolve: Collection<JetExpression>
|
||||
get() = statementMarks.allMarkedStatements()
|
||||
|
||||
init {
|
||||
assert(declaration.isAncestor(elementToResolve))
|
||||
@@ -532,14 +535,14 @@ class PartialBodyResolveFilter(
|
||||
}
|
||||
|
||||
private enum class MarkLevel {
|
||||
SKIP,
|
||||
NONE,
|
||||
TAKE,
|
||||
NEED_REFERENCE_RESOLVE,
|
||||
NEED_COMPLETION
|
||||
}
|
||||
|
||||
companion object {
|
||||
public fun findResolveElement(element: JetElement, declaration: JetDeclaration): JetExpression? {
|
||||
public fun findStatementToResolve(element: JetElement, declaration: JetDeclaration): JetExpression? {
|
||||
return element.parentsWithSelf.takeWhile { it != declaration }.firstOrNull { it.isStatement() } as JetExpression?
|
||||
}
|
||||
|
||||
@@ -628,7 +631,7 @@ class PartialBodyResolveFilter(
|
||||
statementMarks[statement] = level
|
||||
|
||||
val block = statement.getParent() as JetBlockExpression
|
||||
val currentBlockLevel = blockLevels[block] ?: MarkLevel.SKIP
|
||||
val currentBlockLevel = blockLevels[block] ?: MarkLevel.NONE
|
||||
if (currentBlockLevel < level) {
|
||||
blockLevels[block] = level
|
||||
}
|
||||
@@ -636,10 +639,13 @@ class PartialBodyResolveFilter(
|
||||
}
|
||||
|
||||
fun statementMark(statement: JetExpression): MarkLevel
|
||||
= statementMarks[statement] ?: MarkLevel.SKIP
|
||||
= statementMarks[statement] ?: MarkLevel.NONE
|
||||
|
||||
fun allMarkedStatements(): Collection<JetExpression>
|
||||
= statementMarks.keySet()
|
||||
|
||||
fun lastMarkedStatement(block: JetBlockExpression, minLevel: MarkLevel): JetExpression? {
|
||||
val level = blockLevels[block] ?: MarkLevel.SKIP
|
||||
val level = blockLevels[block] ?: MarkLevel.NONE
|
||||
if (level < minLevel) return null // optimization
|
||||
return block.getLastChild().siblings(forward = false)
|
||||
.filterIsInstance<JetExpression>()
|
||||
|
||||
Reference in New Issue
Block a user