@@ -107,7 +107,7 @@ public void addMessage(final long messageId, final List<Token> messageTokens)
107107
108108 captureTypes (messageTokens , 0 , messageTokens .size () - 1 );
109109 compressConstantEnums (messageTokens );
110- countComponentTokens (messageTokens );
110+ updateComponentTokenCounts (messageTokens );
111111
112112 messagesByIdMap .put (messageId , new ArrayList <>(messageTokens ));
113113 }
@@ -236,6 +236,37 @@ public String applicableNamespace()
236236 return namespaceName == null ? packageName : namespaceName ;
237237 }
238238
239+ /**
240+ * Iterate over a list of {@link Token}s and update their counts of how many tokens make up each component.
241+ *
242+ * @param tokens not be updated.
243+ */
244+ public static void updateComponentTokenCounts (final List <Token > tokens )
245+ {
246+ final Map <String , Deque <Integer >> map = new HashMap <>();
247+
248+ for (int i = 0 , size = tokens .size (); i < size ; i ++)
249+ {
250+ final Token token = tokens .get (i );
251+ final Signal signal = token .signal ();
252+
253+ if (signal .name ().startsWith ("BEGIN_" ))
254+ {
255+ final String componentType = signal .name ().substring (6 );
256+ map .computeIfAbsent (componentType , (key ) -> new LinkedList <>()).push (i );
257+ }
258+ else if (signal .name ().startsWith ("END_" ))
259+ {
260+ final String componentType = signal .name ().substring (4 );
261+ final int beginIndex = map .get (componentType ).pop ();
262+
263+ final int componentTokenCount = (i - beginIndex ) + 1 ;
264+ tokens .get (beginIndex ).componentTokenCount (componentTokenCount );
265+ token .componentTokenCount (componentTokenCount );
266+ }
267+ }
268+ }
269+
239270 private static void compressConstantEnums (final List <Token > tokens )
240271 {
241272 final Iterator <Token > iter = tokens .iterator ();
@@ -271,32 +302,6 @@ private static void compressConstantEnums(final List<Token> tokens)
271302 }
272303 }
273304
274- private static void countComponentTokens (final List <Token > tokens )
275- {
276- final Map <String , Deque <Integer >> map = new HashMap <>();
277-
278- for (int i = 0 , size = tokens .size (); i < size ; i ++)
279- {
280- final Token token = tokens .get (i );
281- final Signal signal = token .signal ();
282-
283- if (signal .name ().startsWith ("BEGIN_" ))
284- {
285- final String componentType = signal .name ().substring (6 );
286- map .computeIfAbsent (componentType , (key ) -> new LinkedList <>()).push (i );
287- }
288- else if (signal .name ().startsWith ("END_" ))
289- {
290- final String componentType = signal .name ().substring (4 );
291- final int beginIndex = map .get (componentType ).pop ();
292-
293- final int componentTokenCount = (i - beginIndex ) + 1 ;
294- tokens .get (beginIndex ).componentTokenCount (componentTokenCount );
295- token .componentTokenCount (componentTokenCount );
296- }
297- }
298- }
299-
300305 private void captureTypes (final List <Token > tokens , final int beginIndex , final int endIndex )
301306 {
302307 for (int i = beginIndex ; i <= endIndex ; i ++)
@@ -336,6 +341,8 @@ private int captureType(final List<Token> tokens, final int index, final Signal
336341 }
337342 while (endSignal != token .signal () || !name .equals (token .name ()));
338343
344+
345+ updateComponentTokenCounts (typeTokens );
339346 typesByNameMap .put (name , typeTokens );
340347
341348 return i ;
0 commit comments