Retain ordered acquisition scopes
This commit is contained in:
@@ -11,12 +11,58 @@ type assembledInput struct {
|
||||
parsed parsedSource
|
||||
document *document.Node
|
||||
composition *composedDocument
|
||||
acquisition []acquisitionScope
|
||||
inheritance *inheritanceScope
|
||||
sources []SourceInfo
|
||||
contexts map[string]ResourceContext
|
||||
versionState *sourceVersionState
|
||||
}
|
||||
|
||||
// acquiredContribution keeps a source-local payload beside its placed document.
|
||||
// The latter is used for composition; the former preserves the acquisition
|
||||
// boundary for later scoped assembly and evidence.
|
||||
type acquiredContribution struct {
|
||||
source SourceInfo
|
||||
payload *document.Node
|
||||
document *document.Node
|
||||
destination Path
|
||||
relativeDestination Path
|
||||
processing *sourceVersionProcessingResult
|
||||
}
|
||||
|
||||
// acquisitionScope is the ordered strict mapping scope produced by one input
|
||||
// and its ordinary imports.
|
||||
type acquisitionScope struct {
|
||||
destination Path
|
||||
contributions []acquiredContribution
|
||||
}
|
||||
|
||||
func cloneAcquisitionScope(scope acquisitionScope) acquisitionScope {
|
||||
cloned := acquisitionScope{destination: scope.destination.clone()}
|
||||
if scope.contributions != nil {
|
||||
cloned.contributions = make([]acquiredContribution, len(scope.contributions))
|
||||
for index, contribution := range scope.contributions {
|
||||
cloned.contributions[index] = acquiredContribution{
|
||||
source: cloneSourceInfo(contribution.source), payload: contribution.payload,
|
||||
document: contribution.document, destination: contribution.destination.clone(),
|
||||
relativeDestination: contribution.relativeDestination.clone(), processing: contribution.processing,
|
||||
}
|
||||
}
|
||||
}
|
||||
return cloned
|
||||
}
|
||||
|
||||
func cloneAcquisitionScopes(scopes []acquisitionScope) []acquisitionScope {
|
||||
if scopes == nil {
|
||||
return nil
|
||||
}
|
||||
cloned := make([]acquisitionScope, len(scopes))
|
||||
for index, scope := range scopes {
|
||||
cloned[index] = cloneAcquisitionScope(scope)
|
||||
}
|
||||
return cloned
|
||||
}
|
||||
|
||||
func assembleBaseInput[T any](source Source, options Options[T]) (assembledInput, []Diagnostic) {
|
||||
return assembleBaseInputTracked(source, options, Path{}, &importAccounting{}, nil, nil)
|
||||
}
|
||||
@@ -76,6 +122,7 @@ func assembleBaseInputTrackedForRole[T any](source Source, options Options[T], d
|
||||
if len(diagnostics) != 0 {
|
||||
return input, diagnostics
|
||||
}
|
||||
input.acquisition = cloneAcquisitionScopes(input.composition.acquisition)
|
||||
input.document = input.composition.root
|
||||
} else {
|
||||
input.sources = sourceInfos(parsed.source)
|
||||
@@ -93,7 +140,15 @@ func assembleBaseInputTrackedForRole[T any](source Source, options Options[T], d
|
||||
if err != nil {
|
||||
return input, []Diagnostic{sourceDiagnostic(CodeSourceLimitExceeded, parsed.source.ID, "configuration exceeds the source depth or node limit after destination placement")}
|
||||
}
|
||||
localPayload := input.document
|
||||
input.document = placed
|
||||
input.acquisition = []acquisitionScope{{
|
||||
destination: destination.clone(),
|
||||
contributions: []acquiredContribution{{
|
||||
source: cloneSourceInfo(*parsed.source), payload: localPayload,
|
||||
document: placed, destination: destination.clone(), processing: versionProcessing,
|
||||
}},
|
||||
}}
|
||||
rawNodes := countInputNodes(parsed.document)
|
||||
placementNodes := destinationWrapperNodeCount(destination)
|
||||
if accounting.sources+1 > limits.sources || accounting.bytes+parsed.bytes > limits.bytes || accounting.nodes+rawNodes+placementNodes > limits.nodes {
|
||||
@@ -185,5 +240,6 @@ func compositionForInput(input assembledInput) (*composedDocument, []Diagnostic)
|
||||
}
|
||||
composition.inputBytes = input.parsed.bytes
|
||||
composition.inputNodes = countInputNodes(input.document)
|
||||
composition.acquisition = cloneAcquisitionScopes(input.acquisition)
|
||||
return composition, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user