rgen 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. data/CHANGELOG +28 -0
  2. data/Rakefile +3 -4
  3. data/lib/ea_support/uml13_ea_metamodel.rb +3 -3
  4. data/lib/ea_support/uml13_ea_to_uml13.rb +33 -2
  5. data/lib/ea_support/uml13_to_uml13_ea.rb +7 -0
  6. data/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +4 -4
  7. data/lib/mmgen/templates/metamodel_generator.tpl +143 -143
  8. data/lib/rgen/ecore/ecore.rb +11 -1
  9. data/lib/rgen/ecore/ecore_interface.rb +47 -0
  10. data/lib/rgen/ecore/ecore_to_ruby.rb +166 -0
  11. data/lib/rgen/ecore/{ecore_transformer.rb → ruby_to_ecore.rb} +11 -11
  12. data/lib/rgen/environment.rb +15 -2
  13. data/lib/rgen/fragment/dump_file_cache.rb +63 -0
  14. data/lib/rgen/fragment/fragmented_model.rb +139 -0
  15. data/lib/rgen/fragment/model_fragment.rb +268 -0
  16. data/lib/rgen/instantiator/abstract_xml_instantiator.rb +44 -72
  17. data/lib/rgen/instantiator/default_xml_instantiator.rb +2 -2
  18. data/lib/rgen/instantiator/ecore_xml_instantiator.rb +16 -1
  19. data/lib/rgen/instantiator/json_instantiator.rb +16 -2
  20. data/lib/rgen/instantiator/nodebased_xml_instantiator.rb +118 -138
  21. data/lib/rgen/instantiator/qualified_name_resolver.rb +5 -1
  22. data/lib/rgen/instantiator/reference_resolver.rb +126 -24
  23. data/lib/rgen/instantiator/xmi11_instantiator.rb +6 -2
  24. data/lib/rgen/metamodel_builder.rb +18 -6
  25. data/lib/rgen/metamodel_builder/builder_extensions.rb +431 -407
  26. data/lib/rgen/metamodel_builder/builder_runtime.rb +8 -8
  27. data/lib/rgen/metamodel_builder/constant_order_helper.rb +4 -4
  28. data/lib/rgen/metamodel_builder/data_types.rb +5 -1
  29. data/lib/rgen/metamodel_builder/intermediate/feature.rb +167 -0
  30. data/lib/rgen/metamodel_builder/module_extension.rb +2 -2
  31. data/lib/rgen/model_builder.rb +10 -5
  32. data/lib/rgen/model_builder/builder_context.rb +17 -1
  33. data/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
  34. data/lib/rgen/serializer/qualified_name_provider.rb +45 -0
  35. data/lib/rgen/template_language/template_container.rb +3 -1
  36. data/lib/rgen/{auto_class_creator.rb → util/auto_class_creator.rb} +6 -1
  37. data/lib/rgen/util/cached_glob.rb +67 -0
  38. data/lib/rgen/util/file_cache_map.rb +104 -0
  39. data/lib/rgen/util/file_change_detector.rb +78 -0
  40. data/lib/rgen/{method_delegation.rb → util/method_delegation.rb} +18 -3
  41. data/lib/rgen/{model_comparator.rb → util/model_comparator.rb} +17 -5
  42. data/lib/rgen/{model_comparator_base.rb → util/model_comparator_base.rb} +6 -1
  43. data/lib/rgen/{model_dumper.rb → util/model_dumper.rb} +6 -1
  44. data/lib/rgen/{name_helper.rb → util/name_helper.rb} +6 -1
  45. data/lib/rgen/util/pattern_matcher.rb +329 -0
  46. data/lib/transformers/uml13_to_ecore.rb +103 -60
  47. data/test/ecore_self_test.rb +43 -42
  48. data/test/json_test.rb +15 -0
  49. data/test/metamodel_builder_test.rb +361 -206
  50. data/test/metamodel_from_ecore_test.rb +45 -0
  51. data/test/metamodel_order_test.rb +10 -4
  52. data/test/metamodel_roundtrip_test.rb +2 -2
  53. data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +1 -1
  54. data/test/metamodel_roundtrip_test/houseMetamodel_Regenerated.ecore +50 -50
  55. data/test/method_delegation_test.rb +9 -9
  56. data/test/model_builder/ecore_internal.rb +19 -9
  57. data/test/model_builder/serializer_test.rb +1 -1
  58. data/test/reference_resolver_test.rb +79 -12
  59. data/test/rgen_test.rb +2 -0
  60. data/test/template_language_test.rb +7 -0
  61. data/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
  62. data/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
  63. data/test/testmodel/ea_testmodel_regenerated.xml +588 -583
  64. data/test/transformer_test.rb +3 -3
  65. data/test/util/file_cache_map_test.rb +91 -0
  66. data/test/util/file_cache_map_test/testdir/fileA +1 -0
  67. data/test/util_test.rb +4 -0
  68. data/test/xml_instantiator_test.rb +139 -135
  69. metadata +49 -104
  70. data/lib/rgen/ecore/ecore_instantiator.rb +0 -31
  71. data/lib/rgen/metamodel_builder/metamodel_description.rb +0 -232
  72. data/redist/xmlscan/ChangeLog +0 -1301
  73. data/redist/xmlscan/README +0 -34
  74. data/redist/xmlscan/THANKS +0 -11
  75. data/redist/xmlscan/doc/changes.html +0 -74
  76. data/redist/xmlscan/doc/changes.rd +0 -80
  77. data/redist/xmlscan/doc/en/conformance.html +0 -136
  78. data/redist/xmlscan/doc/en/conformance.rd +0 -152
  79. data/redist/xmlscan/doc/en/manual.html +0 -356
  80. data/redist/xmlscan/doc/en/manual.rd +0 -402
  81. data/redist/xmlscan/doc/ja/conformance.ja.html +0 -118
  82. data/redist/xmlscan/doc/ja/conformance.ja.rd +0 -134
  83. data/redist/xmlscan/doc/ja/manual.ja.html +0 -325
  84. data/redist/xmlscan/doc/ja/manual.ja.rd +0 -370
  85. data/redist/xmlscan/doc/src/Makefile +0 -41
  86. data/redist/xmlscan/doc/src/conformance.rd.src +0 -256
  87. data/redist/xmlscan/doc/src/langsplit.rb +0 -110
  88. data/redist/xmlscan/doc/src/manual.rd.src +0 -614
  89. data/redist/xmlscan/install.rb +0 -41
  90. data/redist/xmlscan/lib/xmlscan/encoding.rb +0 -311
  91. data/redist/xmlscan/lib/xmlscan/htmlscan.rb +0 -289
  92. data/redist/xmlscan/lib/xmlscan/namespace.rb +0 -352
  93. data/redist/xmlscan/lib/xmlscan/parser.rb +0 -299
  94. data/redist/xmlscan/lib/xmlscan/scanner.rb +0 -1109
  95. data/redist/xmlscan/lib/xmlscan/version.rb +0 -22
  96. data/redist/xmlscan/lib/xmlscan/visitor.rb +0 -158
  97. data/redist/xmlscan/lib/xmlscan/xmlchar.rb +0 -441
  98. data/redist/xmlscan/memo/CONFORMANCE +0 -1249
  99. data/redist/xmlscan/memo/PRODUCTIONS +0 -195
  100. data/redist/xmlscan/memo/contentspec.ry +0 -335
  101. data/redist/xmlscan/samples/chibixml.rb +0 -105
  102. data/redist/xmlscan/samples/getxmlchar.rb +0 -122
  103. data/redist/xmlscan/samples/rexml.rb +0 -159
  104. data/redist/xmlscan/samples/xmlbench.rb +0 -88
  105. data/redist/xmlscan/samples/xmlbench/parser/chibixml.rb +0 -22
  106. data/redist/xmlscan/samples/xmlbench/parser/nqxml.rb +0 -29
  107. data/redist/xmlscan/samples/xmlbench/parser/rexml.rb +0 -62
  108. data/redist/xmlscan/samples/xmlbench/parser/xmlparser.rb +0 -22
  109. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-0.0.10.rb +0 -62
  110. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-chibixml.rb +0 -22
  111. data/redist/xmlscan/samples/xmlbench/parser/xmlscan-rexml.rb +0 -22
  112. data/redist/xmlscan/samples/xmlbench/parser/xmlscan.rb +0 -99
  113. data/redist/xmlscan/samples/xmlbench/xmlbench-lib.rb +0 -116
  114. data/redist/xmlscan/samples/xmlconftest.rb +0 -200
  115. data/redist/xmlscan/test.rb +0 -7
  116. data/redist/xmlscan/tests/deftestcase.rb +0 -73
  117. data/redist/xmlscan/tests/runtest.rb +0 -47
  118. data/redist/xmlscan/tests/testall.rb +0 -14
  119. data/redist/xmlscan/tests/testencoding.rb +0 -438
  120. data/redist/xmlscan/tests/testhtmlscan.rb +0 -752
  121. data/redist/xmlscan/tests/testnamespace.rb +0 -457
  122. data/redist/xmlscan/tests/testparser.rb +0 -591
  123. data/redist/xmlscan/tests/testscanner.rb +0 -1749
  124. data/redist/xmlscan/tests/testxmlchar.rb +0 -143
  125. data/redist/xmlscan/tests/visitor.rb +0 -34
@@ -1,7 +1,7 @@
1
1
  # RGen Framework
2
2
  # (c) Martin Thiede, 2006
3
3
 
4
- require 'rgen/name_helper'
4
+ require 'rgen/util/name_helper'
5
5
 
6
6
  module RGen
7
7
 
@@ -11,27 +11,27 @@ module MetamodelBuilder
11
11
  # The methods provided by this module are used by the methods generated
12
12
  # by the class methods of MetamodelBuilder::BuilderExtensions
13
13
  module BuilderRuntime
14
- include NameHelper
14
+ include Util::NameHelper
15
15
 
16
16
  def is_a?(c)
17
17
  return super unless c.const_defined?(:ClassModule)
18
18
  kind_of?(c::ClassModule)
19
19
  end
20
20
 
21
- def addGeneric(role, value)
22
- send("add#{firstToUpper(role)}",value)
21
+ def addGeneric(role, value, index=-1)
22
+ send("add#{firstToUpper(role.to_s)}",value, index)
23
23
  end
24
24
 
25
25
  def removeGeneric(role, value)
26
- send("remove#{firstToUpper(role)}",value)
26
+ send("remove#{firstToUpper(role.to_s)}",value)
27
27
  end
28
28
 
29
29
  def setGeneric(role, value)
30
- send("#{role}=",value)
30
+ send("set#{firstToUpper(role.to_s)}",value)
31
31
  end
32
32
 
33
33
  def hasManyMethods(role)
34
- respond_to?("add#{firstToUpper(role)}")
34
+ respond_to?("add#{firstToUpper(role.to_s)}")
35
35
  end
36
36
 
37
37
  def setOrAddGeneric(role, value)
@@ -43,7 +43,7 @@ module BuilderRuntime
43
43
  end
44
44
 
45
45
  def getGeneric(role)
46
- send("#{role}")
46
+ send("get#{firstToUpper(role.to_s)}")
47
47
  end
48
48
 
49
49
  def getGenericAsArray(role)
@@ -38,7 +38,7 @@ ConstantOrderHelper = Class.new do
38
38
  def classCreated(c)
39
39
  handlePendingEnum
40
40
  cont = containerModule(c)
41
- name = c.name.split("::").last
41
+ name = (c.name || "").split("::").last
42
42
  return unless cont.respond_to?(:_constantOrder) && !cont._constantOrder.include?(name)
43
43
  cont._constantOrder << name
44
44
  end
@@ -46,7 +46,7 @@ ConstantOrderHelper = Class.new do
46
46
  def moduleCreated(m)
47
47
  handlePendingEnum
48
48
  cont = containerModule(m)
49
- name = m.name.split("::").last
49
+ name = (m.name || "").split("::").last
50
50
  return unless cont.respond_to?(:_constantOrder) && !cont._constantOrder.include?(name)
51
51
  cont._constantOrder << name
52
52
  @currentModule = m
@@ -60,7 +60,7 @@ ConstantOrderHelper = Class.new do
60
60
  private
61
61
 
62
62
  def containerModule(m)
63
- containerName = m.name.split("::")[0..-2].join("::")
63
+ containerName = (m.name || "").split("::")[0..-2].join("::")
64
64
  containerName.empty? ? nil : eval(containerName, TOPLEVEL_BINDING)
65
65
  end
66
66
 
@@ -72,7 +72,7 @@ ConstantOrderHelper = Class.new do
72
72
  newConstants = m.constants - m._constantOrder
73
73
  const = newConstants.find{|c| m.const_get(c).object_id == @pendingEnum.object_id}
74
74
  if const
75
- m._constantOrder << const
75
+ m._constantOrder << const.to_s
76
76
  break
77
77
  end
78
78
  end
@@ -43,7 +43,11 @@ module DataTypes
43
43
  def literals_as_strings
44
44
  literals.collect do |l|
45
45
  if l.is_a?(Symbol)
46
- ":"+l.to_s
46
+ if l.to_s =~ /^\d|\W/
47
+ ":'"+l.to_s+"'"
48
+ else
49
+ ":"+l.to_s
50
+ end
47
51
  elsif l.is_a?(TrueClass) || l.is_a?(FalseClass)
48
52
  l.to_s
49
53
  else
@@ -0,0 +1,167 @@
1
+ require 'rgen/metamodel_builder/data_types'
2
+
3
+ module RGen
4
+
5
+ module MetamodelBuilder
6
+
7
+ module Intermediate
8
+
9
+ class Feature
10
+ attr_reader :etype, :impl_type
11
+
12
+ def value(prop)
13
+ @props[prop]
14
+ end
15
+
16
+ def annotations
17
+ @annotations ||= []
18
+ end
19
+
20
+ def many?
21
+ value(:upperBound) > 1 || value(:upperBound) == -1
22
+ end
23
+
24
+ def reference?
25
+ is_a?(Reference)
26
+ end
27
+
28
+ protected
29
+
30
+ def check(props)
31
+ @props.keys.each do |p|
32
+ kind = props[p]
33
+ raise StandardError.new("invalid property #{p}") unless kind
34
+ raise StandardError.new("property '#{p}' not set") if value(p).nil? && kind == :required
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ class Attribute < Feature
41
+
42
+ Properties = {
43
+ :name => :required,
44
+ :ordered => :required,
45
+ :unique => :required,
46
+ :changeable => :required,
47
+ :volatile => :required,
48
+ :transient => :required,
49
+ :unsettable => :required,
50
+ :derived => :required,
51
+ :lowerBound => :required,
52
+ :upperBound => :required,
53
+ :defaultValueLiteral => :optional
54
+ }
55
+
56
+ Defaults = {
57
+ :ordered => true,
58
+ :unique => true,
59
+ :changeable => true,
60
+ :volatile => false,
61
+ :transient => false,
62
+ :unsettable => false,
63
+ :derived => false,
64
+ :lowerBound => 0
65
+ }
66
+
67
+ Types = {
68
+ String => :EString,
69
+ Integer => :EInt,
70
+ Float => :EFloat,
71
+ RGen::MetamodelBuilder::DataTypes::Boolean => :EBoolean,
72
+ Object => :ERubyObject,
73
+ Class => :ERubyClass
74
+ }
75
+
76
+ def self.default_value(prop)
77
+ Defaults[prop]
78
+ end
79
+
80
+ def self.properties
81
+ Properties.keys.sort{|a,b| a.to_s <=> b.to_s}
82
+ end
83
+
84
+ def initialize(type, props)
85
+ @props = Defaults.merge(props)
86
+ type ||= String
87
+ @etype = Types[type]
88
+ if @etype
89
+ @impl_type = type
90
+ elsif type.is_a?(RGen::MetamodelBuilder::DataTypes::Enum)
91
+ @etype = :EEnumerable
92
+ @impl_type = type
93
+ else
94
+ raise ArgumentError.new("invalid type '#{type}'")
95
+ end
96
+ if @props[:derived]
97
+ @props[:changeable] = false
98
+ @props[:volatile] = true
99
+ @props[:transient] = true
100
+ end
101
+ check(Properties)
102
+ end
103
+
104
+ end
105
+
106
+ class Reference < Feature
107
+ attr_accessor :opposite
108
+
109
+ Properties = {
110
+ :name => :required,
111
+ :ordered => :required,
112
+ :unique => :required,
113
+ :changeable => :required,
114
+ :volatile => :required,
115
+ :transient => :required,
116
+ :unsettable => :required,
117
+ :derived => :required,
118
+ :lowerBound => :required,
119
+ :upperBound => :required,
120
+ :resolveProxies => :required,
121
+ :containment => :required
122
+ }
123
+
124
+ Defaults = {
125
+ :ordered => true,
126
+ :unique => true,
127
+ :changeable => true,
128
+ :volatile => false,
129
+ :transient => false,
130
+ :unsettable => false,
131
+ :derived => false,
132
+ :lowerBound => 0,
133
+ :resolveProxies => true
134
+ }
135
+
136
+ def self.default_value(prop)
137
+ Defaults[prop]
138
+ end
139
+
140
+ def self.properties
141
+ Properties.keys.sort{|a,b| a.to_s <=> b.to_s}
142
+ end
143
+
144
+ def initialize(type, props)
145
+ @props = Defaults.merge(props)
146
+ if type.respond_to?(:_metamodel_description)
147
+ @etype = nil
148
+ @impl_type = type
149
+ else
150
+ raise ArgumentError.new("'#{type}' (#{type.class}) is not a MMBase in reference #{props[:name]}")
151
+ end
152
+ if @props[:derived]
153
+ @props[:changeable] = false
154
+ @props[:volatile] = true
155
+ @props[:transient] = true
156
+ end
157
+ check(Properties)
158
+ end
159
+
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
@@ -1,4 +1,4 @@
1
- require 'rgen/ecore/ecore_instantiator'
1
+ require 'rgen/ecore/ecore_interface'
2
2
  require 'rgen/metamodel_builder/intermediate/annotation'
3
3
 
4
4
  module RGen
@@ -8,7 +8,7 @@ module MetamodelBuilder
8
8
  # This module is used to extend modules which should be
9
9
  # part of RGen metamodels
10
10
  module ModuleExtension
11
- include RGen::ECore::ECoreInstantiator
11
+ include RGen::ECore::ECoreInterface
12
12
 
13
13
  def annotation(hash)
14
14
  _annotations << Intermediate::Annotation.new(hash)
@@ -1,5 +1,5 @@
1
1
  require 'rgen/model_builder/builder_context'
2
- require 'rgen/method_delegation'
2
+ require 'rgen/util/method_delegation'
3
3
  #require 'ruby-prof'
4
4
 
5
5
  module RGen
@@ -10,18 +10,23 @@ module ModelBuilder
10
10
  resolver = ReferenceResolver.new
11
11
  bc = BuilderContext.new(package, builderMethodsModule, resolver, env)
12
12
  contextModule = eval("Module.nesting", block.binding).first
13
- MethodDelegation.registerDelegate(bc, contextModule, "const_missing")
13
+ Util::MethodDelegation.registerDelegate(bc, contextModule, "const_missing")
14
+ BuilderContext.currentBuilderContext = bc
15
+ begin
14
16
  #RubyProf.start
15
- bc.instance_eval(&block)
17
+ bc.instance_eval(&block)
16
18
  #prof = RubyProf.stop
17
19
  #File.open("profile_flat.txt","w+") do |f|
18
20
  # RubyProf::FlatPrinter.new(prof).print(f, 0)
19
21
  # end
20
- MethodDelegation.unregisterDelegate(bc, contextModule, "const_missing")
22
+ ensure
23
+ BuilderContext.currentBuilderContext = nil
24
+ end
25
+ Util::MethodDelegation.unregisterDelegate(bc, contextModule, "const_missing")
21
26
  #puts "Resolving..."
22
27
  resolver.resolve(bc.toplevelElements)
23
28
  bc.toplevelElements
24
29
  end
25
30
  end
26
31
 
27
- end
32
+ end
@@ -25,6 +25,22 @@ class BuilderContext
25
25
  ConstPathElement.new(const, self)
26
26
  end
27
27
 
28
+ # in Ruby 1.9.0 and 1.9.1 #instance_eval looks up constants in the calling scope
29
+ # that's why const_missing needs to be prepared in BuilderContext, too
30
+ class << self
31
+ def currentBuilderContext=(bc)
32
+ @@currentBuilderContext = bc
33
+ end
34
+
35
+ def const_missing(name)
36
+ if @@currentBuilderContext
37
+ ConstPathElement.new(name, @@currentBuilderContext)
38
+ else
39
+ super
40
+ end
41
+ end
42
+ end
43
+
28
44
  class CommandResolver
29
45
  def initialize(rootPackage, extensionsModule, builderContext)
30
46
  @extensionFactory = ExtensionContainerFactory.new(rootPackage, extensionsModule, builderContext)
@@ -315,4 +331,4 @@ end
315
331
 
316
332
  end
317
333
 
318
- end
334
+ end
@@ -0,0 +1,18 @@
1
+ module RGen
2
+
3
+ module Serializer
4
+
5
+ # Filters refereences with an eOpposite:
6
+ # 1. containment references are always preferred
7
+ # 2. at a 1-to-n reference the 1-reference is always preferred
8
+ # 3. otherwise the reference with the name in string sort order before the opposite's name is prefereed
9
+ #
10
+ OppositeReferenceFilter = proc do |features|
11
+ features.reject{|f| f.is_a?(RGen::ECore::EReference) && !f.containment && f.eOpposite &&
12
+ (f.eOpposite.containment || (f.many && !f.eOpposite.many) || (!(!f.many && f.eOpposite.many) && (f.name < f.eOpposite.name)))}
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,45 @@
1
+ module RGen
2
+
3
+ module Serializer
4
+
5
+ # simple identifier calculation based on qualified names
6
+ # prerequisits:
7
+ # * containment relations must be bidirectionsl
8
+ # * local name stored in single attribute +@attribute_name+ for all classes
9
+ #
10
+ class QualifiedNameProvider
11
+
12
+ def initialize(options={})
13
+ @qualified_name_cache = {}
14
+ @attribute_name = options[:attribute_name] || "name"
15
+ @separator = options[:separator] || "/"
16
+ @leading_separator = options.has_key?(:leading_separator) ? options[:leading_separator] : true
17
+ end
18
+
19
+ def identifier(element)
20
+ (element.is_a?(RGen::MetamodelBuilder::MMProxy) && element.targetIdentifier) || qualified_name(element)
21
+ end
22
+
23
+ def qualified_name(element)
24
+ return @qualified_name_cache[element] if @qualified_name_cache[element]
25
+ localIdent = ((element.respond_to?(@attribute_name) && element.getGeneric(@attribute_name)) || "").strip
26
+ parentRef = element.class.ecore.eAllReferences.select{|r| r.eOpposite && r.eOpposite.containment}.first
27
+ parent = parentRef && element.getGeneric(parentRef.name)
28
+ if parent
29
+ if localIdent.size > 0
30
+ parentIdent = qualified_name(parent)
31
+ result = parentIdent + @separator + localIdent
32
+ else
33
+ result = qualified_name(parent)
34
+ end
35
+ else
36
+ result = (@leading_separator ? @separator : "") + localIdent
37
+ end
38
+ @qualified_name_cache[element] = result
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
@@ -143,6 +143,7 @@ module RGen
143
143
  def _expand(template, args, params)
144
144
  raise StandardError.new("expand :for argument evaluates to nil") if params.has_key?(:for) && params[:for].nil?
145
145
  context = params[:for]
146
+ old_indent = @indent
146
147
  @indent = params[:indent] || @indent
147
148
  noIndentNextLine = params[:_noIndentNextLine] ||
148
149
  (@output.is_a?(OutputHandler) && @output.noIndentNextLine) ||
@@ -163,6 +164,7 @@ module RGen
163
164
  end
164
165
  _direct_concat(local_output) unless params[:_evalOnly]
165
166
  @context = old_context if old_context
167
+ @indent = old_indent
166
168
  local_output.to_s
167
169
  end
168
170
 
@@ -229,4 +231,4 @@ module RGen
229
231
 
230
232
  end
231
233
 
232
- end
234
+ end
@@ -5,6 +5,8 @@ require 'rgen/metamodel_builder'
5
5
 
6
6
  module RGen
7
7
 
8
+ module Util
9
+
8
10
  class Base
9
11
  extend MetamodelBuilder
10
12
  def initialize(env=nil)
@@ -53,4 +55,7 @@ module AutoClassCreator
53
55
  end
54
56
  end
55
57
 
56
- end
58
+ end
59
+
60
+ end
61
+