Fixed incorrect PARTIAL resolve inside code fragments
This commit is contained in:
@@ -201,32 +201,29 @@ public abstract class ElementResolver protected(
|
|||||||
|
|
||||||
private fun codeFragmentAdditionalResolve(resolveSession: ResolveSession, codeFragment: JetCodeFragment, trace: BindingTrace, bodyResolveMode: BodyResolveMode) {
|
private fun codeFragmentAdditionalResolve(resolveSession: ResolveSession, codeFragment: JetCodeFragment, trace: BindingTrace, bodyResolveMode: BodyResolveMode) {
|
||||||
val codeFragmentExpression = codeFragment.getContentElement() as? JetExpression ?: return
|
val codeFragmentExpression = codeFragment.getContentElement() as? JetExpression ?: return
|
||||||
val contextElement = codeFragment.getContext()
|
val contextElement = codeFragment.correctedContext
|
||||||
|
|
||||||
val scopeForContextElement: JetScope?
|
val scopeForContextElement: JetScope?
|
||||||
val dataFlowInfoForContextElement: DataFlowInfo
|
val dataFlowInfoForContextElement: DataFlowInfo
|
||||||
|
when (contextElement) {
|
||||||
|
is JetClassOrObject -> {
|
||||||
|
val descriptor = resolveSession.resolveToDescriptor(contextElement) as LazyClassDescriptor
|
||||||
|
scopeForContextElement = descriptor.getScopeForMemberDeclarationResolution()
|
||||||
|
dataFlowInfoForContextElement = DataFlowInfo.EMPTY
|
||||||
|
}
|
||||||
|
|
||||||
if (contextElement is JetClassOrObject) {
|
is JetExpression -> {
|
||||||
val descriptor = resolveSession.resolveToDescriptor(contextElement) as LazyClassDescriptor
|
// do not use PARTIAL body resolve mode because because it does not know about names used in our fragment
|
||||||
|
val contextResolveMode = if (bodyResolveMode == BodyResolveMode.PARTIAL)
|
||||||
|
BodyResolveMode.PARTIAL_FOR_COMPLETION
|
||||||
|
else
|
||||||
|
bodyResolveMode
|
||||||
|
val contextForElement = resolveToElement(contextElement, contextResolveMode)
|
||||||
|
scopeForContextElement = contextForElement[BindingContext.RESOLUTION_SCOPE, contextElement]
|
||||||
|
dataFlowInfoForContextElement = contextForElement.getDataFlowInfo(contextElement)
|
||||||
|
}
|
||||||
|
|
||||||
scopeForContextElement = descriptor.getScopeForMemberDeclarationResolution()
|
else -> return
|
||||||
dataFlowInfoForContextElement = DataFlowInfo.EMPTY
|
|
||||||
}
|
|
||||||
else if (contextElement is JetBlockExpression) {
|
|
||||||
val newContextElement = contextElement.getStatements().lastOrNull() as? JetExpression ?: return
|
|
||||||
|
|
||||||
val contextForElement = resolveToElement(contextElement, BodyResolveMode.FULL)
|
|
||||||
|
|
||||||
scopeForContextElement = contextForElement[BindingContext.RESOLUTION_SCOPE, newContextElement]
|
|
||||||
dataFlowInfoForContextElement = contextForElement.getDataFlowInfo(newContextElement)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (contextElement !is JetExpression) return
|
|
||||||
|
|
||||||
val contextForElement = resolveToElement(contextElement, bodyResolveMode)
|
|
||||||
|
|
||||||
scopeForContextElement = contextForElement[BindingContext.RESOLUTION_SCOPE, contextElement]
|
|
||||||
dataFlowInfoForContextElement = contextForElement.getDataFlowInfo(contextElement)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scopeForContextElement == null) return
|
if (scopeForContextElement == null) return
|
||||||
@@ -239,6 +236,16 @@ public abstract class ElementResolver protected(
|
|||||||
TypeUtils.NO_EXPECTED_TYPE, resolveSession.getModuleDescriptor())
|
TypeUtils.NO_EXPECTED_TYPE, resolveSession.getModuleDescriptor())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: this code should be moved into debugger which should set correct context for its code fragment
|
||||||
|
private val JetCodeFragment.correctedContext: PsiElement?
|
||||||
|
get() {
|
||||||
|
val context = getContext()
|
||||||
|
if (context is JetBlockExpression) {
|
||||||
|
return context.getStatements().filterIsInstance<JetExpression>().lastOrNull() ?: context
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
|
||||||
private fun annotationAdditionalResolve(resolveSession: ResolveSession, jetAnnotationEntry: JetAnnotationEntry) {
|
private fun annotationAdditionalResolve(resolveSession: ResolveSession, jetAnnotationEntry: JetAnnotationEntry) {
|
||||||
val modifierList = jetAnnotationEntry.getParentOfType<JetModifierList>(true)
|
val modifierList = jetAnnotationEntry.getParentOfType<JetModifierList>(true)
|
||||||
val declaration = modifierList?.getParentOfType<JetDeclaration>(true)
|
val declaration = modifierList?.getParentOfType<JetDeclaration>(true)
|
||||||
|
|||||||
Reference in New Issue
Block a user