@@ -9,13 +9,15 @@ def initialize(raw_node, lenv)
99 @ret = nil
1010
1111 @changes = ChangeSet . new ( self , nil )
12+ @diagnostics = Set [ ]
1213 end
1314
1415 attr_reader :lenv
1516 attr_reader :prev_node
1617 attr_reader :static_ret
1718 attr_reader :ret
1819 attr_reader :changes
20+ attr_reader :diagnostics
1921
2022 def subnodes = { }
2123 def attrs = { }
@@ -99,6 +101,10 @@ def install(genv)
99101 def install_copy ( genv )
100102 @changes . copy_from ( ( @prev_node || raise ) . changes )
101103 @changes . reuse ( self )
104+ ( @prev_node || raise ) . diagnostics . each do |diag |
105+ diag . reuse ( self )
106+ @diagnostics << diag
107+ end
102108 each_subnode do |subnode |
103109 subnode . install_copy ( genv )
104110 end
@@ -120,6 +126,14 @@ def narrowings
120126 Narrowing ::EmptyNarrowings
121127 end
122128
129+ def add_diagnostic ( diag )
130+ @diagnostics << diag
131+ end
132+
133+ def remove_diagnostic ( diag )
134+ @diagnostics . delete ( diag )
135+ end
136+
123137 def diff ( prev_node )
124138 if prev_node . is_a? ( self . class ) && attrs . all? { |key , attr | attr == prev_node . send ( key ) }
125139 raise unless prev_node # annotation
@@ -163,13 +177,10 @@ def boxes(key)
163177 end
164178 end
165179
166- def diagnostics ( genv , &blk )
167- @changes . diagnostics . each ( &blk )
168- @changes . boxes . each_value do |box |
169- box . diagnostics ( genv , &blk )
170- end
180+ def each_diagnostic ( genv , &blk )
181+ @diagnostics . each ( &blk )
171182 each_subnode do |subnode |
172- subnode . diagnostics ( genv , &blk )
183+ subnode . each_diagnostic ( genv , &blk )
173184 end
174185 end
175186
0 commit comments