@@ -84,18 +84,41 @@ def cmap(d, lc=None, fn=None): # type: (Union[int, float, str, unicode, Dict, L
8484 lc = [0 , 0 , 0 , 0 ]
8585 if fn is None :
8686 fn = "test"
87+
88+ if isinstance (d , CommentedMap ):
89+ for k ,v in d .iteritems ():
90+ if k in d .lc .data :
91+ d [k ] = cmap (v , lc = d .lc .data [k ], fn = d .lc .filename )
92+ else :
93+ d [k ] = cmap (v , lc , fn = d .lc .filename )
94+ return d
95+ if isinstance (d , CommentedSeq ):
96+ for k ,v in enumerate (d ):
97+ if k in d .lc .data :
98+ d [k ] = cmap (v , lc = d .lc .data [k ], fn = d .lc .filename )
99+ else :
100+ d [k ] = cmap (v , lc , fn = d .lc .filename )
101+ return d
87102 if isinstance (d , dict ):
88103 cm = CommentedMap ()
89104 for k ,v in d .iteritems ():
105+ if isinstance (v , CommentedBase ):
106+ uselc = [v .lc .line , v .lc .col , v .lc .line , v .lc .col ]
107+ else :
108+ uselc = lc
90109 cm [k ] = cmap (v )
91- cm .lc .add_kv_line_col (k , lc )
110+ cm .lc .add_kv_line_col (k , uselc )
92111 cm .lc .filename = fn
93112 return cm
94113 if isinstance (d , list ):
95114 cs = CommentedSeq ()
96115 for k ,v in enumerate (d ):
116+ if isinstance (v , CommentedBase ):
117+ uselc = [v .lc .line , v .lc .col , v .lc .line , v .lc .col ]
118+ else :
119+ uselc = lc
97120 cs .append (cmap (v ))
98- cs .lc .add_kv_line_col (k , lc )
121+ cs .lc .add_kv_line_col (k , uselc )
99122 cs .lc .filename = fn
100123 return cs
101124 else :
@@ -119,7 +142,7 @@ def makeError(self, msg): # type: (Text) -> Any
119142 if not isinstance (self .item , ruamel .yaml .comments .CommentedBase ):
120143 return self .raise_type (msg )
121144 errs = []
122- if self .key is None :
145+ if self .key is None or self . item . lc . data is None or self . key not in self . item . lc . data :
123146 lead = "%s:%i:%i:" % (self .item .lc .filename ,
124147 self .item .lc .line + 1 ,
125148 self .item .lc .col + 1 )
0 commit comments