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

@@ -5,6 +5,7 @@ import {
semanticBindingCanBeRebound,
semanticOpaqueBindingReadMayHaveChanged,
} from "./javascriptSemanticOpaqueEffects.js";
import type { JavaScriptOpenReceiverFact } from "./javascriptSemanticReceiverFacts.js";
import * as t from "@babel/types";
import {
@@ -204,7 +205,10 @@ function* indexSemanticAmbientWritesSteps(
yield* indexJavaScriptAmbientWritesSteps(
state.program,
state,
createSemanticOpaqueGlobalObserver(state),
createSemanticOpaqueGlobalObserver(state, {
createAmbientPathResolver,
createSemanticModuleInterop,
}),
(node) => observePossibleCommonJsDelegateWrite(node, state),
);
if (state.opaqueEffects.globalSites.length > 0)
@@ -506,15 +510,7 @@ export function* analyzeParsedJavaScriptSemanticsSteps(
* Receiver identity facts for the overloaded `.open` syntax, plus
* `configuration` for `.get` reads of a `getConfiguration(...)` result.
*/
export type JavaScriptOpenReceiverFact =
| "window"
| "indexed-db"
| "cache-storage"
| "local"
| "local-indexed-db"
| "local-cache-storage"
| "configuration"
| "extension-state";
export type { JavaScriptOpenReceiverFact } from "./javascriptSemanticReceiverFacts.js";
/** Lexical receiver identities that select static endpoint interpretations. */
export interface JavaScriptReceiverFacts {