Reformat: ResolveElementCache
This commit is contained in:
@@ -49,10 +49,10 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import java.util.*
|
||||
|
||||
class ResolveElementCache(
|
||||
private val resolveSession: ResolveSession,
|
||||
private val project: Project,
|
||||
private val targetPlatform: TargetPlatform,
|
||||
private val codeFragmentAnalyzer: CodeFragmentAnalyzer
|
||||
private val resolveSession: ResolveSession,
|
||||
private val project: Project,
|
||||
private val targetPlatform: TargetPlatform,
|
||||
private val codeFragmentAnalyzer: CodeFragmentAnalyzer
|
||||
) : BodyResolveCache {
|
||||
private class CachedFullResolve(val bindingContext: BindingContext, resolveElement: KtElement) {
|
||||
private val modificationStamp: Long? = modificationStamp(resolveElement)
|
||||
@@ -62,8 +62,8 @@ class ResolveElementCache(
|
||||
private fun modificationStamp(resolveElement: KtElement): Long? {
|
||||
val file = resolveElement.containingFile
|
||||
return when {
|
||||
// for non-physical file we don't get OUT_OF_CODE_BLOCK_MODIFICATION_COUNT increased and must reset
|
||||
// data on any modification of the file
|
||||
// for non-physical file we don't get OUT_OF_CODE_BLOCK_MODIFICATION_COUNT increased and must reset
|
||||
// data on any modification of the file
|
||||
!file.isPhysical -> file.modificationStamp
|
||||
|
||||
resolveElement is KtDeclaration && KotlinCodeBlockModificationListener.isBlockDeclaration(resolveElement) -> resolveElement.getModificationStamp()
|
||||
@@ -74,19 +74,23 @@ class ResolveElementCache(
|
||||
}
|
||||
|
||||
// drop whole cache after change "out of code block"
|
||||
private val fullResolveCache: CachedValue<MutableMap<KtElement, CachedFullResolve>> = CachedValuesManager.getManager(project).createCachedValue(
|
||||
private val fullResolveCache: CachedValue<MutableMap<KtElement, CachedFullResolve>> =
|
||||
CachedValuesManager.getManager(project).createCachedValue(
|
||||
CachedValueProvider<MutableMap<KtElement, ResolveElementCache.CachedFullResolve>> {
|
||||
CachedValueProvider.Result.create(ContainerUtil.createConcurrentSoftValueMap<KtElement, CachedFullResolve>(),
|
||||
PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT,
|
||||
resolveSession.exceptionTracker)
|
||||
CachedValueProvider.Result.create(
|
||||
ContainerUtil.createConcurrentSoftValueMap<KtElement, CachedFullResolve>(),
|
||||
PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT,
|
||||
resolveSession.exceptionTracker
|
||||
)
|
||||
},
|
||||
false)
|
||||
false
|
||||
)
|
||||
|
||||
private class CachedPartialResolve(val bindingContext: BindingContext, file: KtFile, val mode: BodyResolveMode) {
|
||||
private val modificationStamp: Long? = modificationStamp(file)
|
||||
|
||||
fun isUpToDate(file: KtFile, newMode: BodyResolveMode) =
|
||||
modificationStamp == modificationStamp(file) && mode.doesNotLessThan(newMode)
|
||||
modificationStamp == modificationStamp(file) && mode.doesNotLessThan(newMode)
|
||||
|
||||
private fun modificationStamp(file: KtFile): Long? {
|
||||
return if (!file.isPhysical) // for non-physical file we don't get MODIFICATION_COUNT increased and must reset data on any modification of the file
|
||||
@@ -97,13 +101,16 @@ class ResolveElementCache(
|
||||
}
|
||||
|
||||
private val partialBodyResolveCache: CachedValue<MutableMap<KtExpression, CachedPartialResolve>> =
|
||||
CachedValuesManager.getManager(project).createCachedValue(
|
||||
CachedValueProvider<MutableMap<KtExpression, ResolveElementCache.CachedPartialResolve>> {
|
||||
CachedValueProvider.Result.create(ContainerUtil.createConcurrentSoftValueMap<KtExpression, CachedPartialResolve>(),
|
||||
PsiModificationTracker.MODIFICATION_COUNT,
|
||||
resolveSession.exceptionTracker)
|
||||
},
|
||||
false)
|
||||
CachedValuesManager.getManager(project).createCachedValue(
|
||||
CachedValueProvider<MutableMap<KtExpression, ResolveElementCache.CachedPartialResolve>> {
|
||||
CachedValueProvider.Result.create(
|
||||
ContainerUtil.createConcurrentSoftValueMap<KtExpression, CachedPartialResolve>(),
|
||||
PsiModificationTracker.MODIFICATION_COUNT,
|
||||
resolveSession.exceptionTracker
|
||||
)
|
||||
},
|
||||
false
|
||||
)
|
||||
|
||||
|
||||
private fun probablyNothingCallableNames(): ProbablyNothingCallableNames {
|
||||
@@ -113,19 +120,31 @@ class ResolveElementCache(
|
||||
}
|
||||
}
|
||||
|
||||
override fun resolveFunctionBody(function: KtNamedFunction)
|
||||
= getElementsAdditionalResolve(function, null, BodyResolveMode.FULL)
|
||||
override fun resolveFunctionBody(function: KtNamedFunction) = getElementsAdditionalResolve(function, null, BodyResolveMode.FULL)
|
||||
|
||||
fun resolvePrimaryConstructorParametersDefaultValues(ktClass: KtClass): BindingContext {
|
||||
return constructorAdditionalResolve(resolveSession, ktClass, ktClass.containingKtFile, BindingTraceFilter.NO_DIAGNOSTICS).bindingContext
|
||||
return constructorAdditionalResolve(
|
||||
resolveSession,
|
||||
ktClass,
|
||||
ktClass.containingKtFile,
|
||||
BindingTraceFilter.NO_DIAGNOSTICS
|
||||
).bindingContext
|
||||
}
|
||||
|
||||
@Deprecated("Use getElementsAdditionalResolve")
|
||||
fun getElementAdditionalResolve(resolveElement: KtElement, contextElement: KtElement, bodyResolveMode: BodyResolveMode): BindingContext {
|
||||
fun getElementAdditionalResolve(
|
||||
resolveElement: KtElement,
|
||||
contextElement: KtElement,
|
||||
bodyResolveMode: BodyResolveMode
|
||||
): BindingContext {
|
||||
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)
|
||||
}
|
||||
@@ -136,8 +155,7 @@ class ResolveElementCache(
|
||||
if (cachedFullResolve != null) {
|
||||
if (cachedFullResolve.isUpToDate(resolveElement)) {
|
||||
return cachedFullResolve.bindingContext
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
fullResolveMap.remove(resolveElement) // remove outdated cache entry
|
||||
}
|
||||
}
|
||||
@@ -155,10 +173,16 @@ class ResolveElementCache(
|
||||
}
|
||||
|
||||
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 cachedResults = statementsToResolve.map { partialResolveMap[it ?: resolveElement] }
|
||||
if (cachedResults.all { it != null && it.isUpToDate(file, bodyResolveMode) }) { // partial resolve is already cached for these statements
|
||||
if (cachedResults.all {
|
||||
it != null && it.isUpToDate(
|
||||
file,
|
||||
bodyResolveMode
|
||||
)
|
||||
}) { // partial resolve is already cached for these statements
|
||||
return CompositeBindingContext.create(cachedResults.map { it!!.bindingContext }.distinct())
|
||||
}
|
||||
|
||||
@@ -196,19 +220,17 @@ class ResolveElementCache(
|
||||
if (elementOfAdditionalResolve !is KtParameter) {
|
||||
val bindingContext = getElementsAdditionalResolve(elementOfAdditionalResolve, contextElements, bodyResolveMode)
|
||||
bindingContexts.add(bindingContext)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// Parameters for function literal could be met inside other parameters. We can't make resolveToDescriptors for internal elements.
|
||||
declarationsToResolve.addIfNotNull(elementOfAdditionalResolve.getNonStrictParentOfType<KtDeclaration>())
|
||||
addResolveSessionBindingContext = true
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
contextElements
|
||||
.mapNotNull { it.getNonStrictParentOfType<KtDeclaration>() }
|
||||
.filterTo(declarationsToResolve) {
|
||||
it !is KtAnonymousInitializer && it !is KtDestructuringDeclaration && it !is KtDestructuringDeclarationEntry
|
||||
}
|
||||
.mapNotNull { it.getNonStrictParentOfType<KtDeclaration>() }
|
||||
.filterTo(declarationsToResolve) {
|
||||
it !is KtAnonymousInitializer && it !is KtDestructuringDeclaration && it !is KtDestructuringDeclarationEntry
|
||||
}
|
||||
addResolveSessionBindingContext = true
|
||||
}
|
||||
}
|
||||
@@ -224,21 +246,21 @@ class ResolveElementCache(
|
||||
|
||||
private fun findElementOfAdditionalResolve(element: KtElement): KtElement? {
|
||||
val elementOfAdditionalResolve = KtPsiUtil.getTopmostParentOfTypes(
|
||||
element,
|
||||
KtNamedFunction::class.java,
|
||||
KtAnonymousInitializer::class.java,
|
||||
KtPrimaryConstructor::class.java,
|
||||
KtSecondaryConstructor::class.java,
|
||||
KtProperty::class.java,
|
||||
KtSuperTypeList::class.java,
|
||||
KtInitializerList::class.java,
|
||||
KtImportList::class.java,
|
||||
KtAnnotationEntry::class.java,
|
||||
KtTypeParameter::class.java,
|
||||
KtTypeConstraint::class.java,
|
||||
KtPackageDirective::class.java,
|
||||
KtCodeFragment::class.java,
|
||||
KtTypeAlias::class.java
|
||||
element,
|
||||
KtNamedFunction::class.java,
|
||||
KtAnonymousInitializer::class.java,
|
||||
KtPrimaryConstructor::class.java,
|
||||
KtSecondaryConstructor::class.java,
|
||||
KtProperty::class.java,
|
||||
KtSuperTypeList::class.java,
|
||||
KtInitializerList::class.java,
|
||||
KtImportList::class.java,
|
||||
KtAnnotationEntry::class.java,
|
||||
KtTypeParameter::class.java,
|
||||
KtTypeConstraint::class.java,
|
||||
KtPackageDirective::class.java,
|
||||
KtCodeFragment::class.java,
|
||||
KtTypeAlias::class.java
|
||||
) as KtElement?
|
||||
|
||||
when (elementOfAdditionalResolve) {
|
||||
@@ -271,9 +293,9 @@ class ResolveElementCache(
|
||||
}
|
||||
|
||||
private fun performElementAdditionalResolve(
|
||||
resolveElement: KtElement,
|
||||
contextElements: Collection<KtElement>?,
|
||||
bodyResolveMode: BodyResolveMode
|
||||
resolveElement: KtElement,
|
||||
contextElements: Collection<KtElement>?,
|
||||
bodyResolveMode: BodyResolveMode
|
||||
): Pair<BindingContext, StatementFilter> {
|
||||
if (contextElements == null) {
|
||||
assert(bodyResolveMode == BodyResolveMode.FULL)
|
||||
@@ -287,28 +309,70 @@ class ResolveElementCache(
|
||||
assert(resolveElement is KtDeclaration)
|
||||
if (bodyResolveMode != BodyResolveMode.FULL) {
|
||||
statementFilterUsed = PartialBodyResolveFilter(
|
||||
contextElements!!,
|
||||
resolveElement as KtDeclaration,
|
||||
probablyNothingCallableNames(),
|
||||
bodyResolveMode == BodyResolveMode.PARTIAL_FOR_COMPLETION)
|
||||
contextElements!!,
|
||||
resolveElement as KtDeclaration,
|
||||
probablyNothingCallableNames(),
|
||||
bodyResolveMode == BodyResolveMode.PARTIAL_FOR_COMPLETION
|
||||
)
|
||||
}
|
||||
return statementFilterUsed
|
||||
}
|
||||
|
||||
val trace: BindingTrace = when (resolveElement) {
|
||||
is KtNamedFunction -> functionAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter)
|
||||
is KtNamedFunction -> functionAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
file,
|
||||
createStatementFilter(),
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtAnonymousInitializer -> initializerAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter)
|
||||
is KtAnonymousInitializer -> initializerAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
file,
|
||||
createStatementFilter(),
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtPrimaryConstructor -> constructorAdditionalResolve(resolveSession, resolveElement.parent as KtClassOrObject, file, bodyResolveMode.bindingTraceFilter)
|
||||
is KtPrimaryConstructor -> constructorAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement.parent as KtClassOrObject,
|
||||
file,
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtSecondaryConstructor -> secondaryConstructorAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter)
|
||||
is KtSecondaryConstructor -> secondaryConstructorAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
file,
|
||||
createStatementFilter(),
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtProperty -> propertyAdditionalResolve(resolveSession, resolveElement, file, createStatementFilter(), bodyResolveMode.bindingTraceFilter)
|
||||
is KtProperty -> propertyAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
file,
|
||||
createStatementFilter(),
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtSuperTypeList -> delegationSpecifierAdditionalResolve(resolveSession, resolveElement, resolveElement.getParent() as KtClassOrObject, file, bodyResolveMode.bindingTraceFilter)
|
||||
is KtSuperTypeList -> delegationSpecifierAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
resolveElement.getParent() as KtClassOrObject,
|
||||
file,
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtInitializerList -> delegationSpecifierAdditionalResolve(resolveSession, resolveElement, resolveElement.getParent() as KtEnumEntry, file, bodyResolveMode.bindingTraceFilter)
|
||||
is KtInitializerList -> delegationSpecifierAdditionalResolve(
|
||||
resolveSession,
|
||||
resolveElement,
|
||||
resolveElement.getParent() as KtEnumEntry,
|
||||
file,
|
||||
bodyResolveMode.bindingTraceFilter
|
||||
)
|
||||
|
||||
is KtImportList -> {
|
||||
val resolver = resolveSession.fileScopeProvider.getImportResolver(resolveElement.getContainingKtFile())
|
||||
@@ -320,8 +384,7 @@ class ResolveElementCache(
|
||||
val annotationEntry = resolveElement.annotationEntries.firstOrNull()
|
||||
if (annotationEntry != null) {
|
||||
annotationAdditionalResolve(resolveSession, annotationEntry)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
resolveSession.trace
|
||||
}
|
||||
}
|
||||
@@ -341,24 +404,26 @@ class ResolveElementCache(
|
||||
else -> {
|
||||
if (resolveElement.getParentOfType<KtPackageDirective>(true) != null) {
|
||||
packageRefAdditionalResolve(resolveSession, resolveElement, bodyResolveMode.bindingTraceFilter)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
error("Invalid type of the topmost parent: $resolveElement\n${resolveElement.getElementTextWithContext()}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val controlFlowTrace = DelegatingBindingTrace(trace.bindingContext, "Element control flow resolve", resolveElement, allowSliceRewrite = true)
|
||||
val controlFlowTrace =
|
||||
DelegatingBindingTrace(trace.bindingContext, "Element control flow resolve", resolveElement, allowSliceRewrite = true)
|
||||
ControlFlowInformationProvider(
|
||||
resolveElement, controlFlowTrace, resolveElement.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
|
||||
resolveElement, controlFlowTrace, resolveElement.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
|
||||
).checkDeclaration()
|
||||
controlFlowTrace.addOwnDataTo(trace, null, false)
|
||||
|
||||
return Pair(trace.bindingContext, statementFilterUsed)
|
||||
}
|
||||
|
||||
private fun packageRefAdditionalResolve(resolveSession: ResolveSession, ktElement: KtElement,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun packageRefAdditionalResolve(
|
||||
resolveSession: ResolveSession, ktElement: KtElement,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(ktElement, bindingTraceFilter)
|
||||
|
||||
if (ktElement is KtSimpleNameExpression) {
|
||||
@@ -404,8 +469,7 @@ class ResolveElementCache(
|
||||
val declaration = modifierList?.getParentOfType<KtDeclaration>(true)
|
||||
if (declaration != null) {
|
||||
doResolveAnnotations(getAnnotationsByDeclaration(resolveSession, modifierList, declaration))
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
val fileAnnotationList = ktAnnotationEntry.getParentOfType<KtFileAnnotationList>(true)
|
||||
if (fileAnnotationList != null) {
|
||||
doResolveAnnotations(resolveSession.getFileAnnotations(fileAnnotationList.containingKtFile))
|
||||
@@ -422,12 +486,16 @@ class ResolveElementCache(
|
||||
ForceResolveUtil.forceResolveAllContents(annotations)
|
||||
}
|
||||
|
||||
private fun getAnnotationsByDeclaration(resolveSession: ResolveSession, modifierList: KtModifierList, declaration: KtDeclaration): Annotations {
|
||||
private fun getAnnotationsByDeclaration(
|
||||
resolveSession: ResolveSession,
|
||||
modifierList: KtModifierList,
|
||||
declaration: KtDeclaration
|
||||
): Annotations {
|
||||
var descriptor = resolveSession.resolveToDescriptor(declaration)
|
||||
if (declaration is KtClass) {
|
||||
if (modifierList == declaration.primaryConstructorModifierList) {
|
||||
descriptor = (descriptor as ClassDescriptor).unsubstitutedPrimaryConstructor
|
||||
?: error("No constructor found: ${declaration.getText()}")
|
||||
?: error("No constructor found: ${declaration.getText()}")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,9 +513,11 @@ class ResolveElementCache(
|
||||
return resolveSession.trace
|
||||
}
|
||||
|
||||
private fun delegationSpecifierAdditionalResolve(resolveSession: ResolveSession, ktElement: KtElement,
|
||||
classOrObject: KtClassOrObject, file: KtFile,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun delegationSpecifierAdditionalResolve(
|
||||
resolveSession: ResolveSession, ktElement: KtElement,
|
||||
classOrObject: KtClassOrObject, file: KtFile,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(ktElement, bindingTraceFilter)
|
||||
val descriptor = resolveSession.resolveToDescriptor(classOrObject) as LazyClassDescriptor
|
||||
|
||||
@@ -455,20 +525,24 @@ class ResolveElementCache(
|
||||
ForceResolveUtil.forceResolveAllContents(descriptor.typeConstructor.supertypes)
|
||||
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, StatementFilter.NONE)
|
||||
bodyResolver.resolveSuperTypeEntryList(DataFlowInfo.EMPTY,
|
||||
classOrObject,
|
||||
descriptor,
|
||||
descriptor.unsubstitutedPrimaryConstructor,
|
||||
descriptor.scopeForConstructorHeaderResolution,
|
||||
descriptor.scopeForMemberDeclarationResolution)
|
||||
bodyResolver.resolveSuperTypeEntryList(
|
||||
DataFlowInfo.EMPTY,
|
||||
classOrObject,
|
||||
descriptor,
|
||||
descriptor.unsubstitutedPrimaryConstructor,
|
||||
descriptor.scopeForConstructorHeaderResolution,
|
||||
descriptor.scopeForMemberDeclarationResolution
|
||||
)
|
||||
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun propertyAdditionalResolve(resolveSession: ResolveSession, property: KtProperty,
|
||||
file: KtFile,
|
||||
statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun propertyAdditionalResolve(
|
||||
resolveSession: ResolveSession, property: KtProperty,
|
||||
file: KtFile,
|
||||
statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(property, bindingTraceFilter)
|
||||
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, statementFilter)
|
||||
@@ -488,15 +562,17 @@ class ResolveElementCache(
|
||||
|
||||
for (accessor in property.accessors) {
|
||||
ControlFlowInformationProvider(
|
||||
accessor, trace, accessor.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
|
||||
accessor, trace, accessor.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
|
||||
).checkDeclaration()
|
||||
}
|
||||
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun scriptAdditionalResolve(resolveSession: ResolveSession, script: KtScript,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun scriptAdditionalResolve(
|
||||
resolveSession: ResolveSession, script: KtScript,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(script, bindingTraceFilter)
|
||||
val scriptDescriptor = resolveSession.resolveToDescriptor(script) as ScriptDescriptor
|
||||
ForceResolveUtil.forceResolveAllContents(scriptDescriptor)
|
||||
@@ -504,9 +580,11 @@ class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun functionAdditionalResolve(resolveSession: ResolveSession, namedFunction: KtNamedFunction, file: KtFile,
|
||||
statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun functionAdditionalResolve(
|
||||
resolveSession: ResolveSession, namedFunction: KtNamedFunction, file: KtFile,
|
||||
statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(namedFunction, bindingTraceFilter)
|
||||
|
||||
val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(namedFunction)
|
||||
@@ -521,9 +599,11 @@ class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun secondaryConstructorAdditionalResolve(resolveSession: ResolveSession, constructor: KtSecondaryConstructor,
|
||||
file: KtFile, statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun secondaryConstructorAdditionalResolve(
|
||||
resolveSession: ResolveSession, constructor: KtSecondaryConstructor,
|
||||
file: KtFile, statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(constructor, bindingTraceFilter)
|
||||
|
||||
val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(constructor)
|
||||
@@ -538,20 +618,33 @@ class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun constructorAdditionalResolve(resolveSession: ResolveSession, klass: KtClassOrObject, file: KtFile, filter : BindingTraceFilter): BindingTrace {
|
||||
private fun constructorAdditionalResolve(
|
||||
resolveSession: ResolveSession,
|
||||
klass: KtClassOrObject,
|
||||
file: KtFile,
|
||||
filter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(klass, filter)
|
||||
|
||||
val classDescriptor = resolveSession.resolveToDescriptor(klass) as ClassDescriptor
|
||||
val constructorDescriptor = classDescriptor.unsubstitutedPrimaryConstructor
|
||||
?: error("Can't get primary constructor for descriptor '$classDescriptor' " +
|
||||
"in from class '${klass.getElementTextWithContext()}'")
|
||||
?: error(
|
||||
"Can't get primary constructor for descriptor '$classDescriptor' " +
|
||||
"in from class '${klass.getElementTextWithContext()}'"
|
||||
)
|
||||
ForceResolveUtil.forceResolveAllContents(constructorDescriptor)
|
||||
|
||||
val primaryConstructor = klass.primaryConstructor
|
||||
if (primaryConstructor != null) {
|
||||
val scope = resolveSession.declarationScopeProvider.getResolutionScopeForDeclaration(primaryConstructor)
|
||||
val bodyResolver = createBodyResolver(resolveSession, trace, file, StatementFilter.NONE)
|
||||
bodyResolver.resolveConstructorParameterDefaultValues(DataFlowInfo.EMPTY, trace, primaryConstructor, constructorDescriptor, scope)
|
||||
bodyResolver.resolveConstructorParameterDefaultValues(
|
||||
DataFlowInfo.EMPTY,
|
||||
trace,
|
||||
primaryConstructor,
|
||||
constructorDescriptor,
|
||||
scope
|
||||
)
|
||||
|
||||
forceResolveAnnotationsInside(primaryConstructor)
|
||||
}
|
||||
@@ -559,8 +652,10 @@ class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun typealiasAdditionalResolve(resolveSession: ResolveSession, typeAlias: KtTypeAlias,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun typealiasAdditionalResolve(
|
||||
resolveSession: ResolveSession, typeAlias: KtTypeAlias,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(typeAlias, bindingTraceFilter)
|
||||
val typeAliasDescriptor = resolveSession.resolveToDescriptor(typeAlias)
|
||||
ForceResolveUtil.forceResolveAllContents(typeAliasDescriptor)
|
||||
@@ -568,9 +663,11 @@ class ResolveElementCache(
|
||||
return trace
|
||||
}
|
||||
|
||||
private fun initializerAdditionalResolve(resolveSession: ResolveSession, anonymousInitializer: KtAnonymousInitializer,
|
||||
file: KtFile, statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter): BindingTrace {
|
||||
private fun initializerAdditionalResolve(
|
||||
resolveSession: ResolveSession, anonymousInitializer: KtAnonymousInitializer,
|
||||
file: KtFile, statementFilter: StatementFilter,
|
||||
bindingTraceFilter: BindingTraceFilter
|
||||
): BindingTrace {
|
||||
val trace = createDelegatingTrace(anonymousInitializer, bindingTraceFilter)
|
||||
|
||||
val classOrObjectDescriptor = resolveSession.resolveToDescriptor(anonymousInitializer.containingDeclaration) as LazyClassDescriptor
|
||||
@@ -592,32 +689,39 @@ class ResolveElementCache(
|
||||
}
|
||||
|
||||
private fun createBodyResolver(
|
||||
resolveSession: ResolveSession,
|
||||
trace: BindingTrace,
|
||||
file: KtFile,
|
||||
statementFilter: StatementFilter
|
||||
resolveSession: ResolveSession,
|
||||
trace: BindingTrace,
|
||||
file: KtFile,
|
||||
statementFilter: StatementFilter
|
||||
): BodyResolver {
|
||||
val globalContext = SimpleGlobalContext(resolveSession.storageManager, resolveSession.exceptionTracker)
|
||||
val module = resolveSession.moduleDescriptor
|
||||
return createContainerForBodyResolve(
|
||||
globalContext.withProject(file.project).withModule(module),
|
||||
trace,
|
||||
targetPlatform,
|
||||
statementFilter,
|
||||
file.jvmTarget,
|
||||
file.languageVersionSettings
|
||||
globalContext.withProject(file.project).withModule(module),
|
||||
trace,
|
||||
targetPlatform,
|
||||
statementFilter,
|
||||
file.jvmTarget,
|
||||
file.languageVersionSettings
|
||||
).get<BodyResolver>()
|
||||
}
|
||||
|
||||
// All additional resolve should be done to separate trace
|
||||
private fun createDelegatingTrace(resolveElement: KtElement, filter: BindingTraceFilter): BindingTrace {
|
||||
return resolveSession.storageManager.createSafeTrace(
|
||||
DelegatingBindingTrace(resolveSession.bindingContext, "trace to resolve element", resolveElement, filter, allowSliceRewrite = true))
|
||||
DelegatingBindingTrace(
|
||||
resolveSession.bindingContext,
|
||||
"trace to resolve element",
|
||||
resolveElement,
|
||||
filter,
|
||||
allowSliceRewrite = true
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private class BodyResolveContextForLazy(
|
||||
private val topDownAnalysisMode: TopDownAnalysisMode,
|
||||
private val declaringScopes: Function1<KtDeclaration, LexicalScope?>
|
||||
private val topDownAnalysisMode: TopDownAnalysisMode,
|
||||
private val declaringScopes: Function1<KtDeclaration, LexicalScope?>
|
||||
) : BodiesResolveContext {
|
||||
override fun getFiles(): Collection<KtFile> = setOf()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user