rggen-core 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/exe/rggen +0 -0
  3. data/lib/rggen/core.rb +4 -3
  4. data/lib/rggen/core/base/component.rb +16 -7
  5. data/lib/rggen/core/base/component_factory.rb +12 -9
  6. data/lib/rggen/core/base/component_layer_extension.rb +194 -0
  7. data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
  8. data/lib/rggen/core/builder/builder.rb +25 -25
  9. data/lib/rggen/core/builder/component_entry.rb +3 -2
  10. data/lib/rggen/core/builder/component_registry.rb +22 -17
  11. data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
  12. data/lib/rggen/core/builder/plugins.rb +5 -3
  13. data/lib/rggen/core/configuration/component.rb +5 -0
  14. data/lib/rggen/core/configuration/component_factory.rb +1 -1
  15. data/lib/rggen/core/configuration/input_data.rb +15 -0
  16. data/lib/rggen/core/input_base/component_factory.rb +37 -6
  17. data/lib/rggen/core/input_base/feature.rb +3 -3
  18. data/lib/rggen/core/input_base/input_data.rb +13 -10
  19. data/lib/rggen/core/input_base/loader.rb +2 -3
  20. data/lib/rggen/core/input_base/yaml_loader.rb +5 -4
  21. data/lib/rggen/core/output_base/code_generator.rb +10 -23
  22. data/lib/rggen/core/output_base/component.rb +42 -39
  23. data/lib/rggen/core/output_base/component_factory.rb +4 -0
  24. data/lib/rggen/core/output_base/feature.rb +6 -7
  25. data/lib/rggen/core/register_map.rb +3 -3
  26. data/lib/rggen/core/register_map/component.rb +4 -3
  27. data/lib/rggen/core/register_map/component_factory.rb +18 -1
  28. data/lib/rggen/core/register_map/feature.rb +2 -2
  29. data/lib/rggen/core/register_map/hash_loader.rb +16 -23
  30. data/lib/rggen/core/register_map/input_data.rb +30 -16
  31. data/lib/rggen/core/register_map/loader.rb +1 -1
  32. data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
  33. data/lib/rggen/core/utility/code_utility.rb +8 -2
  34. data/lib/rggen/core/version.rb +1 -1
  35. metadata +7 -6
  36. data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
  37. data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
@@ -6,7 +6,7 @@ module RgGen
6
6
  class Builder
7
7
  def initialize
8
8
  initialize_component_registries
9
- initialize_categories
9
+ initialize_layers
10
10
  @plugins = Plugins.new
11
11
  end
12
12
 
@@ -32,15 +32,15 @@ module RgGen
32
32
  @component_registries[:input][component].define_loader(&body)
33
33
  end
34
34
 
35
- def add_feature_registry(name, target_category, registry)
36
- target_categories =
37
- if target_category
38
- Array(@categories[target_category])
35
+ def add_feature_registry(name, target_layer, registry)
36
+ target_layers =
37
+ if target_layer
38
+ Array(@layers[target_layer])
39
39
  else
40
- @categories.values
40
+ @layers.values
41
41
  end
42
- target_categories.each do |category|
43
- category.add_feature_registry(name, registry)
42
+ target_layers.each do |layer|
43
+ layer.add_feature_registry(name, registry)
44
44
  end
45
45
  end
46
46
 
@@ -49,21 +49,21 @@ module RgGen
49
49
  :define_list_feature,
50
50
  :define_list_item_feature
51
51
  ].each do |method_name|
52
- define_method(method_name) do |category, *args, &body|
53
- @categories[category].__send__(__method__, *args, &body)
52
+ define_method(method_name) do |layer, *args, &body|
53
+ @layers[layer].__send__(__method__, *args, &body)
54
54
  end
55
55
  end
56
56
 
57
- def enable(category, *args)
58
- @categories[category].enable(*args)
57
+ def enable(layer, *args)
58
+ @layers[layer].enable(*args)
59
59
  end
60
60
 
61
61
  def disable_all
62
- @categories.each_value(&:disable)
62
+ @layers.each_value(&:disable)
63
63
  end
64
64
 
65
- def disable(category, *args)
66
- @categories.key?(category) && @categories[category].disable(*args)
65
+ def disable(layer, *args)
66
+ @layers.key?(layer) && @layers[layer].disable(*args)
67
67
  end
68
68
 
69
69
  def build_factory(type, component)
@@ -81,8 +81,8 @@ module RgGen
81
81
  registries.each_value.map(&:build_factory)
82
82
  end
83
83
 
84
- def delete(category, *args)
85
- @categories.key?(category) && @categories[category].delete(*args)
84
+ def delete(layer, *args)
85
+ @layers.key?(layer) && @layers[layer].delete(*args)
86
86
  end
87
87
 
88
88
  def register_input_components
@@ -94,8 +94,8 @@ module RgGen
94
94
  plugins.add(name, module_or_version, &block)
95
95
  end
96
96
 
97
- def activate_plugins
98
- plugins.activate(self)
97
+ def activate_plugins(**options)
98
+ plugins.activate(self, **options)
99
99
  end
100
100
 
101
101
  def load_setup_file(file, activation = true)
@@ -119,14 +119,14 @@ module RgGen
119
119
  end
120
120
  end
121
121
 
122
- def initialize_categories
123
- @categories = Hash.new do |_, category_name|
124
- raise BuilderError.new("unknown category: #{category_name}")
122
+ def initialize_layers
123
+ @layers = Hash.new do |_, layer_name|
124
+ raise BuilderError.new("unknown layer: #{layer_name}")
125
125
  end
126
126
  [
127
- :global, :register_map, :register_block, :register, :bit_field
128
- ].each do |category|
129
- @categories[category] = Category.new(category)
127
+ :global, :root, :register_block, :register_file, :register, :bit_field
128
+ ].each do |layer|
129
+ @layers[layer] = Layer.new(layer)
130
130
  end
131
131
  end
132
132
 
@@ -6,8 +6,9 @@ module RgGen
6
6
  class ComponentEntry
7
7
  Entry = Struct.new(:target, :factory)
8
8
 
9
- def initialize(component_name)
9
+ def initialize(component_name, layer)
10
10
  @component_name = component_name
11
+ @layer = layer
11
12
  end
12
13
 
13
14
  [:component, :feature].each do |entry_name|
@@ -22,7 +23,7 @@ module RgGen
22
23
  end
23
24
 
24
25
  def build_factory
25
- @component.factory.new(@component_name) do |f|
26
+ @component.factory.new(@component_name, @layer) do |f|
26
27
  f.target_component(@component.target)
27
28
  f.feature_factories(feature_registry&.build_factories)
28
29
  end
@@ -10,10 +10,10 @@ module RgGen
10
10
  @entries = []
11
11
  end
12
12
 
13
- def register_component(categories = nil, &block)
14
- if categories
15
- Array(categories).each do |category|
16
- @entries << create_new_entry(category, block)
13
+ def register_component(layers = nil, &block)
14
+ if layers
15
+ Array(layers).each do |layer|
16
+ @entries << create_new_entry(layer, block)
17
17
  end
18
18
  else
19
19
  @entries << create_new_entry(nil, block)
@@ -21,26 +21,31 @@ module RgGen
21
21
  end
22
22
 
23
23
  def build_factory
24
- factories = @entries.map(&:build_factory)
25
- factories.each_cons(2) { |(f0, f1)| f0.child_factory(f1) }
26
- root_factory = factories.first
27
- root_factory.root_factory
28
- root_factory
24
+ build_factories.first.tap(&:root_factory)
29
25
  end
30
26
 
31
27
  private
32
28
 
33
- def create_new_entry(category, block)
34
- entry = ComponentEntry.new(@component_name)
35
- Docile.dsl_eval(entry, category, &block)
36
- add_feature_registry(category, entry.feature_registry)
29
+ def create_new_entry(layer, block)
30
+ entry = ComponentEntry.new(@component_name, layer)
31
+ Docile.dsl_eval(entry, layer, &block)
32
+ add_feature_registry(layer, entry.feature_registry)
37
33
  entry
38
34
  end
39
35
 
40
- def add_feature_registry(category, feature_registry)
41
- feature_registry || return
42
- @builder
43
- .add_feature_registry(@component_name, category, feature_registry)
36
+ def add_feature_registry(layer, feature_registry)
37
+ feature_registry &&
38
+ @builder
39
+ .add_feature_registry(@component_name, layer, feature_registry)
40
+ end
41
+
42
+ def build_factories
43
+ factories =
44
+ @entries
45
+ .map(&:build_factory)
46
+ .map { |f| [f.layer, f] }.to_h
47
+ factories.each_value { |f| f.component_factories factories }
48
+ factories.values
44
49
  end
45
50
  end
46
51
  end
@@ -3,13 +3,14 @@
3
3
  module RgGen
4
4
  module Core
5
5
  module Builder
6
- class Category
6
+ class Layer
7
7
  class Proxy
8
- def initialize(body)
9
- body.call(self)
8
+ def initialize
9
+ block_given? && yield(self)
10
10
  end
11
11
 
12
- attr_setter :method
12
+ attr_setter :body
13
+ attr_setter :method_name
13
14
  attr_setter :list_names
14
15
  attr_setter :feature_names
15
16
 
@@ -21,25 +22,22 @@ module RgGen
21
22
  @shared_context
22
23
  end
23
24
 
24
- def register_execution(registry, args, body)
25
+ def register_execution(registry, &body)
25
26
  @executions ||= []
26
- @executions << { registry: registry, args: args, body: body }
27
+ @executions << { registry: registry, body: body }
27
28
  end
28
29
 
29
- def execute(category, body)
30
- Docile.dsl_eval(category, &body)
31
- Array(@executions).each { |execution| call_execution(execution) }
30
+ def execute(layer)
31
+ Docile.dsl_eval(layer, &body)
32
+ @executions&.each(&method(:call_execution))
32
33
  end
33
34
 
34
35
  private
35
36
 
36
37
  def call_execution(execution)
37
- send_args = [
38
- list_names, feature_names, shared_context, *execution[:args]
39
- ].compact
40
- execution[:registry].__send__(
41
- method, *send_args, &execution[:body]
42
- )
38
+ args = [list_names, feature_names, shared_context].compact
39
+ execution[:registry]
40
+ .__send__(method_name, *args, &execution[:body])
43
41
  end
44
42
  end
45
43
 
@@ -58,22 +56,25 @@ module RgGen
58
56
  end
59
57
 
60
58
  def define_simple_feature(feature_names, &body)
61
- do_proxy_call(body) do |proxy|
62
- proxy.method(__method__)
59
+ do_proxy_call do |proxy|
60
+ proxy.body(body)
61
+ proxy.method_name(__method__)
63
62
  proxy.feature_names(feature_names)
64
63
  end
65
64
  end
66
65
 
67
66
  def define_list_feature(list_names, &body)
68
- do_proxy_call(body) do |proxy|
69
- proxy.method(__method__)
67
+ do_proxy_call do |proxy|
68
+ proxy.body(body)
69
+ proxy.method_name(__method__)
70
70
  proxy.list_names(list_names)
71
71
  end
72
72
  end
73
73
 
74
74
  def define_list_item_feature(list_name, feature_names, &body)
75
- do_proxy_call(body) do |proxy|
76
- proxy.method(__method__)
75
+ do_proxy_call do |proxy|
76
+ proxy.body(body)
77
+ proxy.method_name(__method__)
77
78
  proxy.list_names(list_name)
78
79
  proxy.feature_names(feature_names)
79
80
  end
@@ -100,14 +101,14 @@ module RgGen
100
101
  private
101
102
 
102
103
  def define_proxy_call(name)
103
- define_singleton_method(name) do |*args, &body|
104
- @proxy.register_execution(@feature_registries[name], args, body)
104
+ define_singleton_method(name) do |&body|
105
+ @proxy.register_execution(@feature_registries[__method__], &body)
105
106
  end
106
107
  end
107
108
 
108
- def do_proxy_call(body, &proxy_block)
109
- @proxy = Proxy.new(proxy_block)
110
- @proxy.execute(self, body)
109
+ def do_proxy_call(&block)
110
+ @proxy = Proxy.new(&block)
111
+ @proxy.execute(self)
111
112
  remove_instance_variable(:@proxy)
112
113
  end
113
114
  end
@@ -63,9 +63,11 @@ module RgGen
63
63
  @plugins << Plugin.new(name, module_or_version, &block)
64
64
  end
65
65
 
66
- def activate(builder)
67
- @plugins.each { |plugin| plugin.default_setup(builder) }
68
- @plugins.each { |plugin| plugin.optional_setup(builder) }
66
+ def activate(builder, **options)
67
+ options[:no_default_setup] ||
68
+ @plugins.each { |plugin| plugin.default_setup(builder) }
69
+ options[:no_optional_setup] ||
70
+ @plugins.each { |plugin| plugin.optional_setup(builder) }
69
71
  end
70
72
 
71
73
  def version_info
@@ -4,6 +4,11 @@ module RgGen
4
4
  module Core
5
5
  module Configuration
6
6
  class Component < InputBase::Component
7
+ private
8
+
9
+ def post_initialize
10
+ need_no_children
11
+ end
7
12
  end
8
13
  end
9
14
  end
@@ -7,7 +7,7 @@ module RgGen
7
7
  private
8
8
 
9
9
  def create_input_data(&block)
10
- InputBase::InputData.new(valid_value_lists, &block)
10
+ InputData.new(valid_value_lists, &block)
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RgGen
4
+ module Core
5
+ module Configuration
6
+ class InputData < InputBase::InputData
7
+ def initialize(valid_value_lists, &block)
8
+ super(nil, valid_value_lists, &block)
9
+ end
10
+
11
+ undef_method :child
12
+ end
13
+ end
14
+ end
15
+ end
@@ -4,6 +4,20 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class ComponentFactory < Base::ComponentFactory
7
+ class << self
8
+ def enable_no_children_error
9
+ @enable_no_children_error = true
10
+ end
11
+
12
+ def disable_no_children_error
13
+ @enable_no_children_error = false
14
+ end
15
+
16
+ def enable_no_children_error?
17
+ @enable_no_children_error.nil? || @enable_no_children_error
18
+ end
19
+ end
20
+
7
21
  attr_setter :loaders
8
22
 
9
23
  private
@@ -27,8 +41,13 @@ module RgGen
27
41
  end
28
42
 
29
43
  def find_loader(file)
30
- loader = loaders.find { |l| l.support?(file) }
31
- loader || (raise Core::LoadError.new('unsupported file type', file))
44
+ loaders.find { |l| l.support?(file) } ||
45
+ (raise Core::LoadError.new('unsupported file type', file))
46
+ end
47
+
48
+ def valid_value_lists
49
+ component_factories
50
+ .transform_values(&->(f) { f.valid_value_list })
32
51
  end
33
52
 
34
53
  def create_input_data(&block)
@@ -58,9 +77,23 @@ module RgGen
58
77
  end
59
78
 
60
79
  def post_build(component)
80
+ exist_no_children?(component) &&
81
+ raise_no_children_error(component)
61
82
  component.verify(:component)
62
83
  end
63
84
 
85
+ def exist_no_children?(component)
86
+ enable_no_children_error? &&
87
+ component.need_children? && component.children.empty?
88
+ end
89
+
90
+ def enable_no_children_error?
91
+ self.class.enable_no_children_error?
92
+ end
93
+
94
+ def raise_no_children_error(_component)
95
+ end
96
+
64
97
  def finalize(component)
65
98
  component.verify(:all)
66
99
  end
@@ -77,10 +110,8 @@ module RgGen
77
110
 
78
111
  protected
79
112
 
80
- def valid_value_lists
81
- list = [Array(active_feature_factories&.keys)]
82
- list.concat(Array(child_factory&.valid_value_lists))
83
- list
113
+ def valid_value_list
114
+ Array(active_feature_factories&.keys)
84
115
  end
85
116
  end
86
117
  end
@@ -80,9 +80,9 @@ module RgGen
80
80
  end
81
81
 
82
82
  def export_verifiers(subclass)
83
- copied_verifiers =
84
- @verifiers.map { |scope, blocks| [scope, blocks.dup] }.to_h
85
- subclass.instance_variable_set(:@verifiers, copied_verifiers)
83
+ subclass.instance_variable_set(
84
+ :@verifiers, @verifiers.transform_values(&:dup)
85
+ )
86
86
  end
87
87
  end
88
88
 
@@ -4,7 +4,8 @@ module RgGen
4
4
  module Core
5
5
  module InputBase
6
6
  class InputData
7
- def initialize(valid_value_lists)
7
+ def initialize(layer, valid_value_lists)
8
+ @layer = layer
8
9
  @valid_value_lists = valid_value_lists
9
10
  @values = Hash.new(NAValue)
10
11
  @children = []
@@ -12,6 +13,8 @@ module RgGen
12
13
  block_given? && yield(self)
13
14
  end
14
15
 
16
+ attr_reader :layer
17
+
15
18
  def value(value_name, value, position = nil)
16
19
  symbolized_name = value_name.to_sym
17
20
  return unless valid_value?(symbolized_name)
@@ -24,8 +27,8 @@ module RgGen
24
27
  end
25
28
  end
26
29
 
27
- def []=(value_name, position = nil, value)
28
- value(value_name, value, position)
30
+ def []=(value_name, position_or_value, value = nil)
31
+ value(value_name, value || position_or_value, position_or_value)
29
32
  end
30
33
 
31
34
  def [](value_name)
@@ -39,8 +42,8 @@ module RgGen
39
42
 
40
43
  attr_reader :children
41
44
 
42
- def child(value_list = nil, &block)
43
- create_child_data do |child_data|
45
+ def child(layer, value_list = nil, &block)
46
+ create_child_data(layer) do |child_data|
44
47
  child_data.build_by_block(block)
45
48
  child_data.values(value_list)
46
49
  @children << child_data
@@ -56,11 +59,11 @@ module RgGen
56
59
  private
57
60
 
58
61
  def valid_value?(value_name)
59
- @valid_value_lists.first.include?(value_name)
62
+ @valid_value_lists[layer].include?(value_name)
60
63
  end
61
64
 
62
65
  def define_setter_methods
63
- @valid_value_lists.first.each(&method(:define_setter_method))
66
+ @valid_value_lists[layer].each(&method(:define_setter_method))
64
67
  end
65
68
 
66
69
  def define_setter_method(value_name)
@@ -79,12 +82,12 @@ module RgGen
79
82
  locations[0].path.include?('docile') ? locations[1] : locations[0]
80
83
  end
81
84
 
82
- def create_child_data(&block)
83
- child_data_class.new(@valid_value_lists[1..-1], &block)
85
+ def create_child_data(layer, &block)
86
+ child_data_class.new(layer, @valid_value_lists, &block)
84
87
  end
85
88
 
86
89
  def child_data_class
87
- InputData
90
+ self.class
88
91
  end
89
92
 
90
93
  protected