@@ -327,17 +327,45 @@ class MacroBuilder; implements org.mirah.macros.Compiler
327327 script
328328 end
329329
330+ # Macro names are defined as <declaring-type>$Extensions$<macro-name><opt-counter>
331+ #
330332 def extensionName ( macroDef : MacroDefinition )
333+ macro_mangled = macroDef . name . identifier .
334+ replace ( '[' , 'lbracket_' ) .
335+ replace ( ']' , 'rbracket_' ) .
336+ replace ( '+' , 'plus_' ) .
337+ replace ( '-' , 'minus_' ) .
338+ replace ( '=' , 'eq_' ) .
339+ replace ( '>' , 'gt_' ) .
340+ replace ( '<' , 'lt_' ) .
341+ replace ( '/' , 'div_' ) .
342+ replace ( '?' , 'is_' )
343+ base_name = "#{ registerableTypeName ( macroDef ) } $#{ macro_mangled } "
344+ ct = counter_for_name ( base_name )
345+ if ct > 0
346+ "#{ base_name } #{ ct } "
347+ else
348+ base_name
349+ end
350+ end
351+
352+
353+ def counter_for_name ( macro_def_name_klass : String )
354+ # TODO, I think the .intValue / cast in put may be unnecessary
355+ counter = Integer ( @extension_counters . get ( macro_def_name_klass ) )
356+ if counter . nil?
357+ id = 0
358+ else
359+ id = counter . intValue + 1
360+ end
361+ @extension_counters . put ( macro_def_name_klass , Integer . new ( id ) )
362+ id
363+ end
364+
365+ def registerableTypeName ( macroDef : MacroDefinition )
331366 enclosing_type = @scopes . getScope ( macroDef ) . selfType . peekInferredType
332367 if !enclosing_type . isError
333- counter :Integer = @extension_counters . get ( enclosing_type )
334- if counter . nil?
335- id = 1
336- else
337- id = counter . intValue + 1
338- end
339- @extension_counters . put ( enclosing_type , Integer . new ( id ) )
340- "#{ enclosing_type . name } $Extension#{ id } "
368+ "#{ enclosing_type . name } $Extensions"
341369 else
342370 raise InternalError . new ( "Cannot use error type #{ enclosing_type } as base name for macros." )
343371 end
0 commit comments