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

@@ -14,13 +14,18 @@ import { javaScriptRuntimeContext } from "./javascriptSourceParser.js";
import type { JavaScriptModuleOrigin } from "./javascriptSemanticIr.js";
import {
resolveSemanticBindingState,
isUnmodifiedCommonJsWrapperBinding,
commonJsWrapperBindingDeclaration,
semanticResolutionBlocked,
semanticStableInitializer,
semanticBindingHasPriorValueWrite,
type JavaScriptSemanticAnalysisState,
} from "./javascriptSemanticState.js";
import {
commonJsWrapperBindingDeclaration,
isUnmodifiedCommonJsWrapperBinding,
semanticBindingAtRead,
semanticBindingHasPriorValueWrite,
semanticEffectTiming,
semanticTopLevelEffectFollowsCapture,
} from "./javascriptSemanticMutationInitializers.js";
import {
semanticStaticPropertyKey,
semanticMemberChain,
@@ -31,11 +36,6 @@ import {
staticSourceRelativeUrlPath,
stringValue,
} from "./javascriptStaticAnalysisHelpers.js";
import {
semanticEffectTiming,
semanticBindingAtRead,
semanticTopLevelEffectFollowsCapture,
} from "./javascriptSemanticMutationInitializers.js";
import { createSemanticModuleInterop } from "./javascriptModuleInterop.js";
import { createSemanticReturnedReferences } from "./javascriptSemanticReturnedReferences.js";
import { semanticIterationSources } from "./javascriptSemanticIterationSources.js";
@@ -53,22 +53,20 @@ import {
type SemanticAliasSelectionPath,
} from "./javascriptSemanticAliasSelections.js";
import { SEMANTIC_ALIAS_SELECTION_LIMIT } from "./javascriptSemanticResourceLimits.js";
import {
semanticRequireOriginReaders,
type JavaScriptRequireLoaderFact,
type JavaScriptRequireOrigin,
} from "./javascriptSemanticRequireOriginSlot.js";
import {
isUnmodifiedGlobalReference,
isUnmodifiedImportMetaUrl,
} from "./javascriptSemanticAmbientWrites.js";
export interface JavaScriptRequireOrigin {
readonly origin: JavaScriptModuleOrigin;
readonly call: t.CallExpression;
}
export type JavaScriptRequireLoaderFact =
| "commonjs-loader"
| "factory-loader"
| "create-require"
| "local"
| "unknown";
export type {
JavaScriptRequireLoaderFact,
JavaScriptRequireOrigin,
} from "./javascriptSemanticRequireOriginSlot.js";
const possibleCommonJsDelegateWriteStates =
new WeakSet<JavaScriptSemanticAnalysisState>();
@@ -1661,3 +1659,6 @@ export const semanticMutableBuiltinOrigin = <Key = never>(
? { specifier, path }
: undefined;
};
semanticRequireOriginReaders.origin = semanticRequireOrigin;
semanticRequireOriginReaders.loader = semanticRequireLoaderAt;