refactor(javascript): break the semantic analysis import cycle (#8063)

* refactor(javascript): break the semantic analysis import cycle

Split shared semantic facts out of the analysis hub so projectors of
effects, evaluation, and identity no longer import one another in a cycle.

* refactor(javascript): share the import specifier reader

Read static imports in one module used by the boundary checker and both
cycle guards, so those rules cannot drift apart.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
This commit is contained in:
morlutoandCursor Agent authored and GitHub committed 2026-10-30 06:07:49 +08:00
1 parent 940d71a45a
commit 249b90c5e3
33 files changed
+1043 -772

No files matched your search

@@ -3,14 +3,14 @@ import * as t from "@babel/types";
import type { JavaScriptModuleOrigin } from "./javascriptSemanticIr.js";
import {
isUnshadowedGlobal,
resolveSemanticBindingState,
semanticScopeId,
semanticStableInitializer,
type JavaScriptSemanticAnalysisState,
type JavaScriptSemanticBindingState,
} from "./javascriptSemanticState.js";
import { semanticRequireOrigin } from "./javascriptSemanticRequireOrigin.js";
import { isUnshadowedGlobal } from "./javascriptSemanticMutationInitializers.js";
import { readSemanticRequireOrigin } from "./javascriptSemanticRequireOriginSlot.js";
import {
childNodes,
javaScriptAstChildKeys,
@@ -500,7 +500,7 @@ export const createSemanticModuleInterop = (
const required =
converted === undefined
? undefined
: semanticRequireOrigin(converted.input, state)?.origin;
: readSemanticRequireOrigin(converted.input, state)?.origin;
if (
converted === undefined ||
required === undefined ||
@@ -596,7 +596,7 @@ export const createSemanticModuleInterop = (
resolveSemanticBindingState(state, input, input.name) !== binding
)
return undefined;
const required = semanticRequireOrigin(initial.node, state)?.origin;
const required = readSemanticRequireOrigin(initial.node, state)?.origin;
if (required === undefined || required.importedPath.length !== 0)
return undefined;
if (convertedCall === undefined) return undefined;