mirror of
				https://github.com/goccy/go-yaml.git
				synced 2025-10-30 21:01:06 +00:00 
			
		
		
		
	fix comment map (#635)
This commit is contained in:
		
							parent
							
								
									c8cc5c583f
								
							
						
					
					
						commit
						d225e247cc
					
				
					 2 changed files with 85 additions and 3 deletions
				
			
		
							
								
								
									
										14
									
								
								decode.go
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								decode.go
									
										
									
									
									
								
							|  | @ -7,6 +7,7 @@ import ( | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"maps" | ||||||
| 	"math" | 	"math" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  | @ -30,6 +31,7 @@ type Decoder struct { | ||||||
| 	aliasValueMap        map[*ast.AliasNode]any | 	aliasValueMap        map[*ast.AliasNode]any | ||||||
| 	anchorValueMap       map[string]reflect.Value | 	anchorValueMap       map[string]reflect.Value | ||||||
| 	customUnmarshalerMap map[reflect.Type]func(interface{}, []byte) error | 	customUnmarshalerMap map[reflect.Type]func(interface{}, []byte) error | ||||||
|  | 	commentMaps          []CommentMap | ||||||
| 	toCommentMap         CommentMap | 	toCommentMap         CommentMap | ||||||
| 	opts                 []DecodeOption | 	opts                 []DecodeOption | ||||||
| 	referenceFiles       []string | 	referenceFiles       []string | ||||||
|  | @ -1957,6 +1959,12 @@ func (d *Decoder) parse(bytes []byte) (*ast.File, error) { | ||||||
| 		if v != nil { | 		if v != nil { | ||||||
| 			normalizedFile.Docs = append(normalizedFile.Docs, doc) | 			normalizedFile.Docs = append(normalizedFile.Docs, doc) | ||||||
| 		} | 		} | ||||||
|  | 		cm := CommentMap{} | ||||||
|  | 		maps.Copy(cm, d.toCommentMap) | ||||||
|  | 		d.commentMaps = append(d.commentMaps, cm) | ||||||
|  | 		for k := range d.toCommentMap { | ||||||
|  | 			delete(d.toCommentMap, k) | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return normalizedFile, nil | 	return normalizedFile, nil | ||||||
| } | } | ||||||
|  | @ -1980,9 +1988,6 @@ func (d *Decoder) decodeInit() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	d.parsedFile = file | 	d.parsedFile = file | ||||||
| 	for k := range d.toCommentMap { |  | ||||||
| 		delete(d.toCommentMap, k) |  | ||||||
| 	} |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1995,6 +2000,9 @@ func (d *Decoder) decode(ctx context.Context, v reflect.Value) error { | ||||||
| 	if body == nil { | 	if body == nil { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  | 	if len(d.commentMaps) > d.streamIndex { | ||||||
|  | 		maps.Copy(d.toCommentMap, d.commentMaps[d.streamIndex]) | ||||||
|  | 	} | ||||||
| 	if err := d.decodeValue(ctx, v.Elem(), body); err != nil { | 	if err := d.decodeValue(ctx, v.Elem(), body); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								yaml_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								yaml_test.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,74 @@ | ||||||
|  | package yaml_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | 	"reflect" | ||||||
|  | 	"strings" | ||||||
|  | 	"testing" | ||||||
|  | 
 | ||||||
|  | 	"github.com/goccy/go-yaml" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestRoundTripWithComment(t *testing.T) { | ||||||
|  | 	yml := ` | ||||||
|  | # head comment | ||||||
|  | key: value # line comment | ||||||
|  | ` | ||||||
|  | 	var v struct { | ||||||
|  | 		Key string | ||||||
|  | 	} | ||||||
|  | 	comments := yaml.CommentMap{} | ||||||
|  | 
 | ||||||
|  | 	if err := yaml.UnmarshalWithOptions([]byte(yml), &v, yaml.Strict(), yaml.CommentToMap(comments)); err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	out, err := yaml.MarshalWithOptions(v, yaml.WithComment(comments)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	got := "\n" + string(out) | ||||||
|  | 	if yml != got { | ||||||
|  | 		t.Fatalf("failed to get round tripped yaml: %s", got) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestStreamDecodingWithComment(t *testing.T) { | ||||||
|  | 	yml := ` | ||||||
|  | a: | ||||||
|  |   b: | ||||||
|  |     c: # comment | ||||||
|  | --- | ||||||
|  | foo: bar # comment | ||||||
|  | --- | ||||||
|  | - a | ||||||
|  | - b | ||||||
|  | - c # comment | ||||||
|  | ` | ||||||
|  | 	cm := yaml.CommentMap{} | ||||||
|  | 	dec := yaml.NewDecoder(strings.NewReader(yml), yaml.CommentToMap(cm)) | ||||||
|  | 	var commentPathsWithDocIndex [][]string | ||||||
|  | 	for { | ||||||
|  | 		var v any | ||||||
|  | 		if err := dec.Decode(&v); err != nil { | ||||||
|  | 			if err == io.EOF { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			t.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 		paths := make([]string, 0, len(cm)) | ||||||
|  | 		for k := range cm { | ||||||
|  | 			paths = append(paths, k) | ||||||
|  | 		} | ||||||
|  | 		commentPathsWithDocIndex = append(commentPathsWithDocIndex, paths) | ||||||
|  | 		for k := range cm { | ||||||
|  | 			delete(cm, k) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if !reflect.DeepEqual(commentPathsWithDocIndex, [][]string{ | ||||||
|  | 		{"$.a.b.c"}, | ||||||
|  | 		{"$.foo"}, | ||||||
|  | 		{"$[2]"}, | ||||||
|  | 	}) { | ||||||
|  | 		t.Fatalf("failed to get comment: %v", commentPathsWithDocIndex) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Masaaki Goshima
						Masaaki Goshima