Preserve explicitness across resolution shape changes

This commit is contained in:
2026-10-26 14:36:15 +00:00
parent 28ef9b6200
commit a893c7716c
7 changed files with 125 additions and 13 deletions

View File

@@ -274,7 +274,7 @@ func cloneMetadata(metadata Metadata) Metadata {
return cloned
}
func applyResolutionMetadata(metadata *Metadata, resolved resolutionResult) {
func applyResolutionMetadata(metadata *Metadata, resolved resolutionResult, entry resolutionInput) {
finalPaths := make(map[string]*document.Node)
indexDocument(resolved.final, Path{}, finalPaths)
snapshotCoverage, snapshotPointers := newResolutionCoverageIndexFromSnapshots(resolved.snapshots)
@@ -303,7 +303,7 @@ func applyResolutionMetadata(metadata *Metadata, resolved resolutionResult) {
appendResolutionDescendantHistory(metadata, resolved.snapshots, snapshotPointers, finalPaths, &deltaCoverage, snapshotIDs)
applyResolutionFieldOrigins(metadata.fields, resolved.snapshots, &deltaCoverage, snapshotIDs)
refreshResolutionFields(metadata.fields, finalPaths, resolved.snapshots, snapshotCoverage)
refreshResolutionFields(metadata.fields, finalPaths, resolved.final, entry, resolved.snapshots, snapshotCoverage)
}
func appendResolutionDescendantHistory(metadata *Metadata, snapshots []resolutionSnapshot, snapshotPointers []string, finalPaths map[string]*document.Node, deltaIndex *pathPrefixIndex, snapshotIDs []int) {
@@ -368,22 +368,29 @@ func applyResolutionFieldOrigins(fields map[string]FieldInfo, snapshots []resolu
}
}
func refreshResolutionFields(fields map[string]FieldInfo, finalPaths map[string]*document.Node, snapshots []resolutionSnapshot, snapshotCoverage *resolutionCoverageIndex) {
func refreshResolutionFields(fields map[string]FieldInfo, finalPaths map[string]*document.Node, final *document.Node, entry resolutionInput, snapshots []resolutionSnapshot, snapshotCoverage *resolutionCoverageIndex) {
for pointer := range fields {
if _, ok := finalPaths[pointer]; !ok {
delete(fields, pointer)
}
}
for pointer, node := range finalPaths {
walkDocument(final, Path{}, func(path Path, node *document.Node) {
pointer := path.String()
entryInfo, entryFound := entry.lookup(path)
if info, ok := fields[pointer]; ok {
info.Explicit = entryFound && entryInfo.Explicit
info.Null = node.Kind == document.Null
fields[pointer] = info
continue
return
}
origin := Origin{Layer: LayerResolution}
if snapshotID, ok := snapshotCoverage.deepestCoveringPointerID(pointer); ok {
origin = cloneOrigin(snapshots[snapshotID].change.Origin)
}
fields[pointer] = FieldInfo{Null: node.Kind == document.Null, Origin: origin}
}
fields[pointer] = FieldInfo{
Explicit: entryFound && entryInfo.Explicit,
Null: node.Kind == document.Null,
Origin: origin,
}
})
}