From d8bf6abc2bf7b081b085c9f24bfa30214e63d1df Mon Sep 17 00:00:00 2001 From: Eric Rakestraw Date: Sun, 25 Oct 2026 22:30:46 +0000 Subject: [PATCH] Isolate source directive processing --- docs/roadmap/implementation.md | 9 ++ internal/engine/acquisition.go | 145 +++++++++++++++++++-------------- 2 files changed, 92 insertions(+), 62 deletions(-) diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index e76163f..b09aaf4 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -685,6 +685,15 @@ destinations, selected overlays, and NoSource preserve callback counts, order, warnings, safe diagnostics, and retained declaration locations. Focused check: `go test ./internal/engine -run 'SourceVersion|Version|Directive|Destination'`. +Status: **complete** (first part of F02). Prior completed commits: `2736ddf`, +`deb9aa5`, `ae3408a`, `ea27f17`, `08a8c25`, `877c497`, `8aba43d`, `7bf2f0c`, +`0f9ecf1`, `119b42c`, `247a12b`, `4fcff5f`, `12d350a`, `08f2a8f`, `826062a`, +`e4a5ecb`, `3122e2f`, `6f6130f`, `4fd3bee`, and `4bf940c`. Validation passed: +`env GOTOOLCHAIN=local GOPROXY=off GOTELEMETRY=off go test ./internal/engine -run 'SourceVersion|Version|Directive|Destination' -count=1`, +`env GOTOOLCHAIN=local GOPROXY=off GOTELEMETRY=off go test ./internal/engine -count=1`, +`env GOTOOLCHAIN=local GOPROXY=off GOTELEMETRY=off go test ./... -count=1`, +and `git diff --check`. + ## Stage 22 — Isolate Standalone Placement And Acquisition Completion Finding: second part of **F02**. diff --git a/internal/engine/acquisition.go b/internal/engine/acquisition.go index 64364b3..f6e6bb1 100644 --- a/internal/engine/acquisition.go +++ b/internal/engine/acquisition.go @@ -39,7 +39,6 @@ func acquireInput(request inputAcquisitionRequest, policy acquisitionPolicy, sta versionState := state.versionState visited := tier.visited hostToken := tier.hostToken - role := request.role sourceID := "source-" + strconv.Itoa(accounting.sources+1) selectedSource := source if source.kind == sourceSearch { @@ -98,67 +97,10 @@ func acquireInput(request inputAcquisitionRequest, policy acquisitionPolicy, sta return input, directiveDiagnostics } } - var versionProcessing *sourceVersionProcessingResult - if directiveContext == rootDirectiveContextSource { - var sourceID string - if parsed.source != nil { - sourceID = parsed.source.ID - } - var processed sourceVersionProcessingResult - var failures []Diagnostic - if versionState != nil { - processed, failures = versionState.processWithDirectiveContext(parsed.document, role, destination, sourceID, request.input.placementMode, directiveContext) - } else { - processed = processSourceVersionWithDirectiveContext(parsed.document, request.protectionRule, role, destination, sourceVersionModeDefault, directiveContext) - failures = processed.diagnostics - } - if len(failures) != 0 { - return input, failures - } - versionProcessing = &processed - if role == sourceVersionMain && versionState != nil { - versionState.mainProcessing = &processed - } - } else if directiveContext == rootDirectiveContextLayered { - extracted, failures := extractRootDirectives(parsed.document, rootDirectiveContextLayered) - if len(failures) != 0 { - return input, failures - } - processed := sourceVersionProcessingResult{ - payload: extracted.body, imports: extracted.imports, sequences: extracted.sequences, - directiveContext: rootDirectiveContextLayered, - } - if versionState != nil && versionState.mode != sourceVersionModeDefault { - var sourceID string - if parsed.source != nil { - sourceID = parsed.source.ID - } - versionProcessed, versionFailures := versionState.process(extracted.body, role, destination, sourceID, request.input.placementMode) - if len(versionFailures) != 0 { - return input, versionFailures - } - versionProcessed.imports = extracted.imports - versionProcessed.sequences = append(cloneSequenceDeclarations(extracted.sequences), versionProcessed.sequences...) - versionProcessed.directiveContext = rootDirectiveContextLayered - processed = versionProcessed - if role == sourceVersionMain { - versionState.mainProcessing = &processed - } - } - versionProcessing = &processed - } else if versionState != nil && versionState.mode != sourceVersionModeDefault { - var sourceID string - if parsed.source != nil { - sourceID = parsed.source.ID - } - processed, failures := versionState.process(parsed.document, role, destination, sourceID, request.input.placementMode) - if len(failures) != 0 { - return input, failures - } - versionProcessing = &processed - if role == sourceVersionMain { - versionState.mainProcessing = &processed - } + request.directiveContext = directiveContext + versionProcessing, diagnostics := processAcquiredInputVersion(parsed, request, versionState) + if len(diagnostics) != 0 { + return input, diagnostics } request.input.source = selectedSource if request.input.imports && selectedSource.kind != sourceNone { @@ -235,6 +177,85 @@ func acquireInput(request inputAcquisitionRequest, policy acquisitionPolicy, sta return input, nil } +func processAcquiredInputVersion(parsed parsedSource, request inputAcquisitionRequest, state *sourceVersionState) (*sourceVersionProcessingResult, []Diagnostic) { + sourceID := "" + if parsed.source != nil { + sourceID = parsed.source.ID + } + + var result sourceVersionProcessingResult + hasResult := false + updateMainProcessing := false + switch request.directiveContext { + case rootDirectiveContextSource: + if state != nil { + processed, diagnostics := state.processWithDirectiveContext( + parsed.document, request.role, request.input.destination, sourceID, + request.input.placementMode, request.directiveContext, + ) + if len(diagnostics) != 0 { + return nil, diagnostics + } + result = processed + updateMainProcessing = request.role == sourceVersionMain + } else { + result = processSourceVersionWithDirectiveContext( + parsed.document, request.protectionRule, request.role, + request.input.destination, sourceVersionModeDefault, request.directiveContext, + ) + if len(result.diagnostics) != 0 { + return nil, result.diagnostics + } + } + hasResult = true + case rootDirectiveContextLayered: + extracted, diagnostics := extractRootDirectives(parsed.document, request.directiveContext) + if len(diagnostics) != 0 { + return nil, diagnostics + } + result = sourceVersionProcessingResult{ + payload: extracted.body, imports: extracted.imports, sequences: extracted.sequences, + directiveContext: request.directiveContext, + } + hasResult = true + if state != nil && state.mode != sourceVersionModeDefault { + processed, diagnostics := state.process( + extracted.body, request.role, request.input.destination, + sourceID, request.input.placementMode, + ) + if len(diagnostics) != 0 { + return nil, diagnostics + } + processed.imports = extracted.imports + processed.sequences = append(cloneSequenceDeclarations(extracted.sequences), processed.sequences...) + processed.directiveContext = request.directiveContext + result = processed + updateMainProcessing = request.role == sourceVersionMain + } + default: + if state != nil && state.mode != sourceVersionModeDefault { + processed, diagnostics := state.process( + parsed.document, request.role, request.input.destination, + sourceID, request.input.placementMode, + ) + if len(diagnostics) != 0 { + return nil, diagnostics + } + result = processed + hasResult = true + updateMainProcessing = request.role == sourceVersionMain + } + } + if !hasResult { + return nil, nil + } + if updateMainProcessing { + completed := result + state.mainProcessing = &completed + } + return &result, nil +} + func registerAcquiredSource(source Source, context *FilesystemContext, info *SourceInfo, visited map[resourceIdentity]importRoute, hostToken *namespaceToken) *Diagnostic { if visited == nil || info == nil || info.Path == "" { return nil