rggen-core 0.18.0 → 0.23.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.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/exe/rggen +2 -2
- data/lib/rggen/core.rb +7 -5
- data/lib/rggen/core/base/component.rb +16 -7
- data/lib/rggen/core/base/component_factory.rb +12 -9
- data/lib/rggen/core/base/component_layer_extension.rb +194 -0
- data/lib/rggen/core/base/feature_layer_extension.rb +158 -0
- data/lib/rggen/core/builder/builder.rb +38 -52
- data/lib/rggen/core/builder/component_entry.rb +3 -2
- data/lib/rggen/core/builder/component_registry.rb +22 -17
- data/lib/rggen/core/builder/input_component_registry.rb +43 -10
- data/lib/rggen/core/builder/{category.rb → layer.rb} +27 -26
- data/lib/rggen/core/builder/loader_registry.rb +48 -0
- data/lib/rggen/core/builder/plugin_manager.rb +140 -0
- data/lib/rggen/core/configuration.rb +3 -2
- data/lib/rggen/core/configuration/component.rb +5 -0
- data/lib/rggen/core/configuration/component_factory.rb +1 -1
- data/lib/rggen/core/configuration/hash_loader.rb +4 -2
- data/lib/rggen/core/configuration/input_data.rb +15 -0
- data/lib/rggen/core/dsl.rb +3 -1
- data/lib/rggen/core/exceptions.rb +9 -4
- data/lib/rggen/core/generator.rb +3 -3
- data/lib/rggen/core/input_base/component_factory.rb +37 -6
- data/lib/rggen/core/input_base/feature.rb +4 -4
- data/lib/rggen/core/input_base/input_data.rb +13 -10
- data/lib/rggen/core/input_base/input_matcher.rb +15 -16
- data/lib/rggen/core/input_base/input_value_extractor.rb +34 -0
- data/lib/rggen/core/input_base/loader.rb +64 -21
- data/lib/rggen/core/input_base/yaml_loader.rb +22 -17
- data/lib/rggen/core/options.rb +18 -14
- data/lib/rggen/core/output_base/code_generator.rb +10 -23
- data/lib/rggen/core/output_base/component.rb +42 -39
- data/lib/rggen/core/output_base/component_factory.rb +4 -0
- data/lib/rggen/core/output_base/feature.rb +6 -7
- data/lib/rggen/core/printers.rb +11 -7
- data/lib/rggen/core/register_map.rb +6 -5
- data/lib/rggen/core/register_map/component.rb +4 -3
- data/lib/rggen/core/register_map/component_factory.rb +18 -1
- data/lib/rggen/core/register_map/feature.rb +2 -2
- data/lib/rggen/core/register_map/hash_loader.rb +61 -27
- data/lib/rggen/core/register_map/input_data.rb +30 -16
- data/lib/rggen/core/register_map/loader.rb +1 -1
- data/lib/rggen/core/register_map/ruby_loader.rb +1 -1
- data/lib/rggen/core/utility/code_utility.rb +8 -2
- data/lib/rggen/core/utility/error_utility.rb +33 -6
- data/lib/rggen/core/version.rb +1 -1
- metadata +12 -10
- data/lib/rggen/core/base/hierarchical_accessors.rb +0 -91
- data/lib/rggen/core/base/hierarchical_feature_accessors.rb +0 -83
- data/lib/rggen/core/builder/plugins.rb +0 -77
- data/lib/rggen/core/core_extensions/casecmp.rb +0 -12
@@ -4,13 +4,15 @@ module RgGen
|
|
4
4
|
module Core
|
5
5
|
module Builder
|
6
6
|
class Builder
|
7
|
+
extend Forwardable
|
8
|
+
|
7
9
|
def initialize
|
8
10
|
initialize_component_registries
|
9
|
-
|
10
|
-
@
|
11
|
+
initialize_layers
|
12
|
+
@plugin_manager = PluginManager.new(self)
|
11
13
|
end
|
12
14
|
|
13
|
-
attr_reader :
|
15
|
+
attr_reader :plugin_manager
|
14
16
|
|
15
17
|
def input_component_registry(name, &body)
|
16
18
|
component_registry(:input, name, body)
|
@@ -20,27 +22,25 @@ module RgGen
|
|
20
22
|
component_registry(:output, name, body)
|
21
23
|
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def define_loader(component, &body)
|
32
|
-
@component_registries[:input][component].define_loader(&body)
|
25
|
+
[
|
26
|
+
:register_loader, :register_loaders,
|
27
|
+
:define_value_extractor, :ignore_value, :ignore_values
|
28
|
+
].each do |method_name|
|
29
|
+
define_method(method_name) do |component, *args, &block|
|
30
|
+
@component_registries[:input][component]
|
31
|
+
.__send__(__method__, *args, &block)
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def add_feature_registry(name,
|
36
|
-
|
37
|
-
if
|
38
|
-
Array(@
|
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
|
-
@
|
40
|
+
@layers.values
|
41
41
|
end
|
42
|
-
|
43
|
-
|
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 |
|
53
|
-
@
|
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(
|
58
|
-
@
|
57
|
+
def enable(layer, *args)
|
58
|
+
@layers[layer].enable(*args)
|
59
59
|
end
|
60
60
|
|
61
61
|
def disable_all
|
62
|
-
@
|
62
|
+
@layers.each_value(&:disable)
|
63
63
|
end
|
64
64
|
|
65
|
-
def disable(
|
66
|
-
@
|
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(
|
85
|
-
@
|
84
|
+
def delete(layer, *args)
|
85
|
+
@layers.key?(layer) && @layers[layer].delete(*args)
|
86
86
|
end
|
87
87
|
|
88
88
|
def register_input_components
|
@@ -90,23 +90,9 @@ module RgGen
|
|
90
90
|
RegisterMap.setup(self)
|
91
91
|
end
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
def activate_plugins
|
98
|
-
plugins.activate(self)
|
99
|
-
end
|
100
|
-
|
101
|
-
def load_setup_file(file, activation = true)
|
102
|
-
(file.nil? || file.empty?) &&
|
103
|
-
(raise Core::LoadError.new('no setup file is given'))
|
104
|
-
File.readable?(file) ||
|
105
|
-
(raise Core::LoadError.new("cannot load such setup file: #{file}"))
|
106
|
-
RgGen.builder(self)
|
107
|
-
load(file)
|
108
|
-
activation && activate_plugins
|
109
|
-
end
|
93
|
+
def_delegator :plugin_manager, :load_plugin
|
94
|
+
def_delegator :plugin_manager, :load_plugins
|
95
|
+
def_delegator :plugin_manager, :setup
|
110
96
|
|
111
97
|
private
|
112
98
|
|
@@ -119,14 +105,14 @@ module RgGen
|
|
119
105
|
end
|
120
106
|
end
|
121
107
|
|
122
|
-
def
|
123
|
-
@
|
124
|
-
raise BuilderError.new("unknown
|
108
|
+
def initialize_layers
|
109
|
+
@layers = Hash.new do |_, layer_name|
|
110
|
+
raise BuilderError.new("unknown layer: #{layer_name}")
|
125
111
|
end
|
126
112
|
[
|
127
|
-
:global, :
|
128
|
-
].each do |
|
129
|
-
@
|
113
|
+
:global, :root, :register_block, :register_file, :register, :bit_field
|
114
|
+
].each do |layer|
|
115
|
+
@layers[layer] = Layer.new(layer)
|
130
116
|
end
|
131
117
|
end
|
132
118
|
|
@@ -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(
|
14
|
-
if
|
15
|
-
Array(
|
16
|
-
@entries << create_new_entry(
|
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
|
-
|
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(
|
34
|
-
entry = ComponentEntry.new(@component_name)
|
35
|
-
Docile.dsl_eval(entry,
|
36
|
-
add_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(
|
41
|
-
feature_registry
|
42
|
-
|
43
|
-
|
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
|
@@ -6,29 +6,62 @@ module RgGen
|
|
6
6
|
class InputComponentRegistry < ComponentRegistry
|
7
7
|
def initialize(name, builder)
|
8
8
|
super
|
9
|
-
@
|
9
|
+
@loader_registries = {}
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
def register_loader(loader_type, loader)
|
13
|
+
loader_registry(loader_type).register_loader(loader)
|
14
|
+
end
|
15
|
+
|
16
|
+
def register_loaders(loader_type, loaders)
|
17
|
+
loader_registry(loader_type).register_loaders(loaders)
|
18
|
+
end
|
13
19
|
|
14
|
-
def
|
15
|
-
|
20
|
+
def define_value_extractor(loader_type, layers_or_value, value = nil, &body)
|
21
|
+
layers, value =
|
22
|
+
if value
|
23
|
+
[layers_or_value, value]
|
24
|
+
else
|
25
|
+
[nil, layers_or_value]
|
26
|
+
end
|
27
|
+
loader_registry(loader_type).define_value_extractor(layers, value, &body)
|
16
28
|
end
|
17
29
|
|
18
|
-
def
|
19
|
-
|
30
|
+
def ignore_value(loader_type, layers_or_value, value = nil)
|
31
|
+
layers, value =
|
32
|
+
if value
|
33
|
+
[layers_or_value, value]
|
34
|
+
else
|
35
|
+
[nil, layers_or_value]
|
36
|
+
end
|
37
|
+
loader_registry(loader_type).ignore_value(layers, value)
|
20
38
|
end
|
21
39
|
|
22
|
-
def
|
23
|
-
|
24
|
-
|
40
|
+
def ignore_values(loader_type, layers_or_values, values = nil)
|
41
|
+
layers, values =
|
42
|
+
if values
|
43
|
+
[layers_or_values, values]
|
44
|
+
else
|
45
|
+
[nil, layers_or_values]
|
46
|
+
end
|
47
|
+
loader_registry(loader_type).ignore_values(layers, values)
|
25
48
|
end
|
26
49
|
|
27
50
|
def build_factory
|
28
51
|
factory = super
|
29
|
-
factory.loaders(
|
52
|
+
factory.loaders(build_loaders)
|
30
53
|
factory
|
31
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def loader_registry(loader_type)
|
59
|
+
@loader_registries[loader_type] ||= LoaderRegistry.new
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_loaders
|
63
|
+
@loader_registries.values.flat_map(&:create_loaders)
|
64
|
+
end
|
32
65
|
end
|
33
66
|
end
|
34
67
|
end
|
@@ -3,13 +3,14 @@
|
|
3
3
|
module RgGen
|
4
4
|
module Core
|
5
5
|
module Builder
|
6
|
-
class
|
6
|
+
class Layer
|
7
7
|
class Proxy
|
8
|
-
def initialize
|
9
|
-
|
8
|
+
def initialize
|
9
|
+
block_given? && yield(self)
|
10
10
|
end
|
11
11
|
|
12
|
-
attr_setter :
|
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,
|
25
|
+
def register_execution(registry, &body)
|
25
26
|
@executions ||= []
|
26
|
-
@executions << { registry: registry,
|
27
|
+
@executions << { registry: registry, body: body }
|
27
28
|
end
|
28
29
|
|
29
|
-
def execute(
|
30
|
-
Docile.dsl_eval(
|
31
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
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
|
62
|
-
proxy.
|
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
|
69
|
-
proxy.
|
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
|
76
|
-
proxy.
|
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
|
104
|
-
@proxy.register_execution(@feature_registries[
|
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(
|
109
|
-
@proxy = Proxy.new(
|
110
|
-
@proxy.execute(self
|
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
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module Core
|
5
|
+
module Builder
|
6
|
+
class LoaderRegistry
|
7
|
+
def initialize
|
8
|
+
@loaders = []
|
9
|
+
@extractors = []
|
10
|
+
@ignore_values = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def register_loader(loader)
|
14
|
+
register_loaders([loader])
|
15
|
+
end
|
16
|
+
|
17
|
+
def register_loaders(loaders)
|
18
|
+
@loaders.concat(Array(loaders))
|
19
|
+
end
|
20
|
+
|
21
|
+
def define_value_extractor(layers, value, &body)
|
22
|
+
@extractors <<
|
23
|
+
create_extractor(layers, value, &body)
|
24
|
+
end
|
25
|
+
|
26
|
+
def ignore_value(layers, value)
|
27
|
+
ignore_values(layers, [value])
|
28
|
+
end
|
29
|
+
|
30
|
+
def ignore_values(layers, values)
|
31
|
+
[layers].flatten.each do |layer|
|
32
|
+
(@ignore_values[layer] ||= []).concat(Array(values))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_loaders
|
37
|
+
@loaders.map { |loader| loader.new(@extractors, @ignore_values) }
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def create_extractor(layers, value, &body)
|
43
|
+
Class.new(Core::InputBase::InputValueExtractor, &body).new(layers, value)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|