[FIR] Fix analysis of FirScript contents
Running the `FirScriptCodegenTestGenerated.testSecondLevelFunction` test results in "Expected is `FirResolvedDeclarationStatus`, but was `FirDeclarationStatusImpl`. This is similar to the `FirIdeNormalAnalysisSourceModuleCodeFragmentCollectDiagnosticsTestGenerated.testLocalFunction` test, but that one was fixed by `9514f8f8`. Looks like the situation here is the same, it's just `FirScript` that needs to be fixed. The changed regarding the approximation is needed to avoid exposing the anonymous type in `FirScriptLazyDeclarationResolveTestGenerated.testDelegatesScript`. The difference in the `ScriptInBlockModificationTestGenerated.testRawContractScript` test appeared because previously the contract used to be `FirRawContractDescription`, but it now resolves to `FirEmptyContractDescription`.
This commit is contained in:
committed by
Space Team
parent
a1cb6258bc
commit
fa600a58ac
+1
-1
@@ -50,7 +50,7 @@ internal abstract class LLFirAbstractBodyTargetResolver(
|
||||
}
|
||||
|
||||
override fun withScript(firScript: FirScript, action: () -> Unit) {
|
||||
transformer.context.withScopesForScript(firScript, transformer.components, action)
|
||||
transformer.context.withScript(firScript, transformer.components, action)
|
||||
}
|
||||
|
||||
override fun withFile(firFile: FirFile, action: () -> Unit) {
|
||||
|
||||
+1
-1
@@ -294,7 +294,7 @@ private class ContextCollectorVisitor(
|
||||
}
|
||||
|
||||
override fun visitScript(script: FirScript) {
|
||||
context.withScopesForScript(script, holder) {
|
||||
context.withScript(script, holder) {
|
||||
withInterceptor {
|
||||
super.visitScript(script)
|
||||
}
|
||||
|
||||
+1
-7
@@ -1,11 +1,5 @@
|
||||
BEFORE MODIFICATION:
|
||||
public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] arg: R|kotlin/Any?|, [ResolvedTo(BODY_RESOLVE)] num: R|kotlin/Int?|, [ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit|
|
||||
[Contract description] <
|
||||
<Unresolved name: returns>#().<Unresolved name: implies>#((R|<local>/arg| is R|kotlin/String|)),
|
||||
<Unresolved name: returns>#().<Unresolved name: implies>#(!=(R|<local>/num|, Null(null))),
|
||||
<Unresolved name: callsInPlace>#(R|<local>/block|, <Unresolved name: InvocationKind>#.<Unresolved name: EXACTLY_ONCE>#)
|
||||
>
|
||||
{
|
||||
public final [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] arg: R|kotlin/Any?|, [ResolvedTo(BODY_RESOLVE)] num: R|kotlin/Int?|, [ResolvedTo(BODY_RESOLVE)] block: R|() -> kotlin/Unit|): R|kotlin/Unit| {
|
||||
<Unresolved name: require>#((R|<local>/arg| is R|kotlin/String|))
|
||||
<Unresolved name: require>#(!=(R|<local>/num|, Null(null)))
|
||||
R|<local>/block|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Unit|>|()
|
||||
|
||||
@@ -434,7 +434,7 @@ fun shouldApproximateAnonymousTypesOfNonLocalDeclaration(containingCallableVisib
|
||||
fun FirDeclaration.visibilityForApproximation(container: FirDeclaration?): Visibility {
|
||||
if (this !is FirMemberDeclaration) return Visibilities.Local
|
||||
val containerVisibility =
|
||||
if (container == null || container is FirFile) Visibilities.Public
|
||||
if (container == null || container is FirFile || container is FirScript) Visibilities.Public
|
||||
else (container as? FirRegularClass)?.visibility ?: Visibilities.Local
|
||||
if (containerVisibility == Visibilities.Local || visibility == Visibilities.Local) return Visibilities.Local
|
||||
if (containerVisibility == Visibilities.Private) return Visibilities.Private
|
||||
|
||||
+5
-2
@@ -505,7 +505,8 @@ class BodyResolveContext(
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> withScopesForScript(
|
||||
@OptIn(PrivateForInline::class)
|
||||
fun <T> withScript(
|
||||
owner: FirScript,
|
||||
holder: SessionHolder,
|
||||
f: () -> T
|
||||
@@ -537,7 +538,9 @@ class BodyResolveContext(
|
||||
)
|
||||
|
||||
return withTowerDataContexts(newContexts) {
|
||||
f()
|
||||
withContainer(owner) {
|
||||
f()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -618,7 +618,7 @@ open class FirDeclarationsResolveTransformer(
|
||||
|
||||
fun withScript(script: FirScript, action: () -> FirScript): FirScript {
|
||||
dataFlowAnalyzer.enterScript(script)
|
||||
val result = context.withScopesForScript(script, components) {
|
||||
val result = context.withScript(script, components) {
|
||||
action()
|
||||
}
|
||||
dataFlowAnalyzer.exitScript() // TODO: FirScript should be a FirControlFlowGraphOwner, KT-59683
|
||||
|
||||
Reference in New Issue
Block a user