rggen-core 0.19.0 → 0.23.1
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/exe/rggen +2 -2
- data/lib/rggen/core.rb +7 -4
- 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/feature_registry.rb +6 -9
- data/lib/rggen/core/builder/input_component_registry.rb +43 -10
- data/lib/rggen/core/builder/layer.rb +132 -0
- 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 +3 -3
- data/lib/rggen/core/input_base/input_data.rb +13 -10
- 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 +5 -4
- 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/attribute_setter.rb +4 -0
- 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 +2 -2
- metadata +10 -7
- 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/category.rb +0 -116
- data/lib/rggen/core/builder/plugins.rb +0 -77
@@ -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
|
@@ -11,22 +11,19 @@ module RgGen
|
|
11
11
|
@enabled_features = {}
|
12
12
|
end
|
13
13
|
|
14
|
-
def define_simple_feature(
|
15
|
-
|
16
|
-
.each { |name| create_new_entry(:simple, name, context, body) }
|
14
|
+
def define_simple_feature(name, context = nil, &body)
|
15
|
+
create_new_entry(:simple, name, context, body)
|
17
16
|
end
|
18
17
|
|
19
|
-
def define_list_feature(
|
20
|
-
|
21
|
-
.each { |name| create_new_entry(:list, name, context, body) }
|
18
|
+
def define_list_feature(list_name, context = nil, &body)
|
19
|
+
create_new_entry(:list, list_name, context, body)
|
22
20
|
end
|
23
21
|
|
24
|
-
def define_list_item_feature(list_name,
|
22
|
+
def define_list_item_feature(list_name, feature_name, context = nil, &body)
|
25
23
|
entry = @feature_entries[list_name]
|
26
24
|
entry&.match_entry_type?(:list) ||
|
27
25
|
(raise BuilderError.new("unknown list feature: #{list_name}"))
|
28
|
-
|
29
|
-
.each { |name| entry.define_feature(name, context, &body) }
|
26
|
+
entry.define_feature(feature_name, context, &body)
|
30
27
|
end
|
31
28
|
|
32
29
|
def enable(feature_or_list_names, feature_names = nil)
|
@@ -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
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RgGen
|
4
|
+
module Core
|
5
|
+
module Builder
|
6
|
+
class Layer
|
7
|
+
class Proxy
|
8
|
+
def initialize
|
9
|
+
block_given? && yield(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_setter :body
|
13
|
+
attr_setter :method_name
|
14
|
+
attr_setter :list_name
|
15
|
+
attr_setter :feature_name
|
16
|
+
|
17
|
+
def register_execution(registry, &body)
|
18
|
+
@executions ||= []
|
19
|
+
@executions << { registry: registry, body: body }
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute(layer)
|
23
|
+
Docile.dsl_eval(layer, &body)
|
24
|
+
@executions&.each { |execution| call_execution(layer, execution) }
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def call_execution(layer, execution)
|
30
|
+
args = [list_name, feature_name, layer.shared_context].compact
|
31
|
+
execution[:registry].__send__(method_name, *args, &execution[:body])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize(name)
|
36
|
+
@name = name
|
37
|
+
@feature_registries = {}
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_feature_registry(name, registry)
|
41
|
+
@feature_registries[name] = registry
|
42
|
+
define_proxy_call(name)
|
43
|
+
end
|
44
|
+
|
45
|
+
def shared_context(&body)
|
46
|
+
return unless @proxy
|
47
|
+
|
48
|
+
if block_given?
|
49
|
+
context = current_shared_context(true)
|
50
|
+
context.singleton_exec(&body)
|
51
|
+
end
|
52
|
+
|
53
|
+
current_shared_context(false)
|
54
|
+
end
|
55
|
+
|
56
|
+
def define_simple_feature(feature_names, &body)
|
57
|
+
Array(feature_names).each do |feature_name|
|
58
|
+
do_proxy_call do |proxy|
|
59
|
+
proxy.body(body)
|
60
|
+
proxy.method_name(__method__)
|
61
|
+
proxy.feature_name(feature_name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def define_list_feature(list_names, &body)
|
67
|
+
Array(list_names).each do |list_name|
|
68
|
+
do_proxy_call do |proxy|
|
69
|
+
proxy.body(body)
|
70
|
+
proxy.method_name(__method__)
|
71
|
+
proxy.list_name(list_name)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def define_list_item_feature(list_name, feature_names, &body)
|
77
|
+
Array(feature_names).each do |feature_name|
|
78
|
+
do_proxy_call do |proxy|
|
79
|
+
proxy.body(body)
|
80
|
+
proxy.method_name(__method__)
|
81
|
+
proxy.list_name(list_name)
|
82
|
+
proxy.feature_name(feature_name)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def enable(feature_or_list_names, feature_names = nil)
|
88
|
+
@feature_registries.each_value do |registry|
|
89
|
+
registry.enable(feature_or_list_names, feature_names)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def disable(feature_or_list_names = nil, feature_names = nil)
|
94
|
+
@feature_registries.each_value do |registry|
|
95
|
+
registry.disable(*[feature_or_list_names, feature_names].compact)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def delete(feature_or_list_names = nil, feature_names = nil)
|
100
|
+
@feature_registries.each_value do |registry|
|
101
|
+
registry.delete(*[feature_or_list_names, feature_names].compact)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def define_proxy_call(name)
|
108
|
+
define_singleton_method(name) do |&body|
|
109
|
+
@proxy.register_execution(@feature_registries[__method__], &body)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def do_proxy_call(&block)
|
114
|
+
@proxy = Proxy.new(&block)
|
115
|
+
@proxy.execute(self)
|
116
|
+
remove_instance_variable(:@proxy)
|
117
|
+
end
|
118
|
+
|
119
|
+
def current_shared_context(allocate)
|
120
|
+
list_name = @proxy.list_name || @proxy.feature_name
|
121
|
+
feature_name = @proxy.feature_name
|
122
|
+
allocate && (shared_contexts[list_name][feature_name] ||= Object.new)
|
123
|
+
shared_contexts[list_name][feature_name]
|
124
|
+
end
|
125
|
+
|
126
|
+
def shared_contexts
|
127
|
+
@shared_contexts ||= Hash.new { |h, k| h[k] = {} }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|