ridl 2.8.2 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +5 -3
- data/lib/ridl/backend.rb +11 -12
- data/lib/ridl/delegate.rb +88 -58
- data/lib/ridl/expression.rb +65 -27
- data/lib/ridl/genfile.rb +22 -16
- data/lib/ridl/node.rb +325 -185
- data/lib/ridl/options.rb +9 -11
- data/lib/ridl/optparse_ext.rb +32 -34
- data/lib/ridl/parser.rb +0 -3
- data/lib/ridl/runner.rb +33 -26
- data/lib/ridl/scanner.rb +170 -139
- data/lib/ridl/type.rb +113 -13
- data/lib/ridl/version.rb +2 -4
- metadata +2 -2
data/lib/ridl/options.rb
CHANGED
@@ -14,13 +14,11 @@ require 'ostruct'
|
|
14
14
|
require 'json'
|
15
15
|
|
16
16
|
module IDL
|
17
|
-
|
18
17
|
RIDLRC = '.ridlrc'
|
19
18
|
RIDLRC_GLOBAL = File.expand_path(File.join(ENV['HOME'] || ENV['HOMEPATH'] || '~', RIDLRC))
|
20
19
|
|
21
20
|
class Options < OpenStruct
|
22
|
-
|
23
|
-
def initialize(hash=nil, marked=nil)
|
21
|
+
def initialize(hash = nil, marked = nil)
|
24
22
|
super(hash)
|
25
23
|
@marked = marked
|
26
24
|
end
|
@@ -35,7 +33,7 @@ module IDL
|
|
35
33
|
end
|
36
34
|
|
37
35
|
def copy!(from, *keys)
|
38
|
-
keys.flatten.each {|k| self[k] = from[k] }
|
36
|
+
keys.flatten.each { |k| self[k] = from[k] }
|
39
37
|
self
|
40
38
|
end
|
41
39
|
|
@@ -67,7 +65,6 @@ module IDL
|
|
67
65
|
self.class.new(_dup_elem(@marked || @table), @marked)
|
68
66
|
end
|
69
67
|
|
70
|
-
|
71
68
|
def load(rcpath)
|
72
69
|
IDL.log(3, "Loading #{RIDLRC} from #{rcpath}")
|
73
70
|
_cfg = JSON.parse(IO.read(rcpath))
|
@@ -94,7 +91,7 @@ module IDL
|
|
94
91
|
protected
|
95
92
|
|
96
93
|
def _merge(to, from, *keys)
|
97
|
-
keys = keys.flatten.collect {|k| k.to_sym}
|
94
|
+
keys = keys.flatten.collect { |k| k.to_sym }
|
98
95
|
keys = from.keys if keys.empty?
|
99
96
|
keys.each do |k|
|
100
97
|
if from.has_key?(k)
|
@@ -122,9 +119,10 @@ module IDL
|
|
122
119
|
def _dup_elem(v)
|
123
120
|
case v
|
124
121
|
when Array
|
125
|
-
v.collect {|e| _dup_elem(e) }
|
122
|
+
v.collect { |e| _dup_elem(e) }
|
126
123
|
when Hash
|
127
|
-
v.inject({}) {|h, (k, e)| h[k] = _dup_elem(e)
|
124
|
+
v.inject({}) { |h, (k, e)| h[k] = _dup_elem(e)
|
125
|
+
h }
|
128
126
|
when OpenStruct
|
129
127
|
v.class.new(_dup_elem(v.__send__(:table)))
|
130
128
|
else
|
@@ -136,12 +134,12 @@ module IDL
|
|
136
134
|
|
137
135
|
def self.load_config(opt)
|
138
136
|
# first collect config from known (standard and configured) locations
|
139
|
-
_rc_paths = [
|
137
|
+
_rc_paths = [RIDLRC_GLOBAL]
|
140
138
|
_loaded_rc_paths = []
|
141
139
|
(ENV['RIDLRC'] || '').split(/:|;/).each do |p|
|
142
140
|
_rc_paths << p unless _rc_paths.include?(p)
|
143
141
|
end
|
144
|
-
_rc_paths.collect {|path| File.expand_path(path) }.each do |rcp|
|
142
|
+
_rc_paths.collect { |path| File.expand_path(path) }.each do |rcp|
|
145
143
|
IDL.log(3, "Testing rc path #{rcp}")
|
146
144
|
if File.readable?(rcp) && !_loaded_rc_paths.include?(rcp)
|
147
145
|
opt.load(rcp)
|
@@ -163,6 +161,7 @@ module IDL
|
|
163
161
|
IDL.log(3, "Ignoring #{File.readable?(_rcp) ? 'already loaded' : 'inaccessible'} rc path #{_rcp}")
|
164
162
|
end
|
165
163
|
break if /\A(.:(\\|\/)|\.|\/)\Z/ =~ _cwd
|
164
|
+
|
166
165
|
_cwd = File.dirname(_cwd)
|
167
166
|
end while true
|
168
167
|
# now load them in reverse order
|
@@ -172,5 +171,4 @@ module IDL
|
|
172
171
|
end
|
173
172
|
end
|
174
173
|
end
|
175
|
-
|
176
174
|
end
|
data/lib/ridl/optparse_ext.rb
CHANGED
@@ -47,13 +47,9 @@ end
|
|
47
47
|
|
48
48
|
module IDL
|
49
49
|
class OptionList
|
50
|
-
|
51
50
|
class Option
|
52
|
-
|
53
51
|
class Group
|
54
|
-
|
55
52
|
class ParamSet
|
56
|
-
|
57
53
|
class Configurator
|
58
54
|
def initialize(set)
|
59
55
|
@set = set
|
@@ -70,11 +66,12 @@ module IDL
|
|
70
66
|
end
|
71
67
|
|
72
68
|
def without(*params)
|
73
|
-
params.each {|p| @set.params.delete(p.to_sym) }
|
69
|
+
params.each { |p| @set.params.delete(p.to_sym) }
|
74
70
|
end
|
75
71
|
end
|
76
72
|
|
77
73
|
attr_reader :params
|
74
|
+
|
78
75
|
def initialize(options)
|
79
76
|
@description = Array === options[:description] ? options[:description] : (options[:description] || '').split('\n')
|
80
77
|
@all_params = options[:all_params] == true
|
@@ -108,7 +105,7 @@ module IDL
|
|
108
105
|
end
|
109
106
|
|
110
107
|
def description
|
111
|
-
@params.values.inject(@description) {|list, vopt| list.concat(vopt[:description] || []) }
|
108
|
+
@params.values.inject(@description) { |list, vopt| list.concat(vopt[:description] || []) }
|
112
109
|
end
|
113
110
|
|
114
111
|
def define_params(spec = {})
|
@@ -116,7 +113,7 @@ module IDL
|
|
116
113
|
when String, Hash
|
117
114
|
define_param(spec)
|
118
115
|
when Array
|
119
|
-
spec.each {|p| define_param(p) }
|
116
|
+
spec.each { |p| define_param(p) }
|
120
117
|
end
|
121
118
|
end
|
122
119
|
|
@@ -124,6 +121,7 @@ module IDL
|
|
124
121
|
|
125
122
|
def to_key(param)
|
126
123
|
return param if Symbol === param
|
124
|
+
|
127
125
|
# convert empty strings to single space strings before symbolizing
|
128
126
|
String === param ? (param.empty? ? ' ' : param).to_sym : nil
|
129
127
|
end
|
@@ -132,18 +130,18 @@ module IDL
|
|
132
130
|
case spec
|
133
131
|
when String
|
134
132
|
key = to_key(spec)
|
135
|
-
@params[key] = { :
|
133
|
+
@params[key] = { option_name: key }
|
136
134
|
when Hash
|
137
135
|
spec.each do |k, v|
|
138
136
|
@params[to_key(k)] = (if Hash === v
|
139
137
|
{
|
140
|
-
:
|
141
|
-
:
|
142
|
-
:
|
143
|
-
:
|
138
|
+
option_name: to_key(v[:option_name] || k),
|
139
|
+
option_type: v[:type],
|
140
|
+
option_value: v.has_key?(:value) ? v[:value] : true,
|
141
|
+
description: Array === v[:description] ? v[:description] : (v[:description] || '').split('\n')
|
144
142
|
}
|
145
143
|
else
|
146
|
-
{ :
|
144
|
+
{ option_name: to_key(v) }
|
147
145
|
end)
|
148
146
|
end
|
149
147
|
end
|
@@ -164,6 +162,7 @@ module IDL
|
|
164
162
|
def define_param_set(id, options = {}, &block)
|
165
163
|
id = id.to_sym
|
166
164
|
raise "option parameter set [#{id}] already exists" if @group.sets.has_key?(id)
|
165
|
+
|
167
166
|
@group.sets[id] = ParamSet.new(options)
|
168
167
|
block.call(ParamSet::Configurator.new(@group.sets[id])) if block_given?
|
169
168
|
end
|
@@ -179,7 +178,7 @@ module IDL
|
|
179
178
|
alias :modify_params :modify_param_set
|
180
179
|
alias :with_params :modify_param_set
|
181
180
|
|
182
|
-
def define_param(id, options={}, &block)
|
181
|
+
def define_param(id, options = {}, &block)
|
183
182
|
define_param_set("#{id}_set", options) do |pscfg|
|
184
183
|
pscfg.with(id)
|
185
184
|
pscfg.on_exec(&block)
|
@@ -193,21 +192,21 @@ module IDL
|
|
193
192
|
end
|
194
193
|
alias :without_set :without_param
|
195
194
|
alias :without_params :without_param
|
196
|
-
|
197
195
|
end # Configurator
|
198
196
|
|
199
197
|
attr_reader :sets
|
198
|
+
|
200
199
|
def initialize(id, options)
|
201
200
|
@test = options[:test] || true
|
202
201
|
@description = Array === options[:description] ? options[:description] : (options[:description] || '').split('\n')
|
203
202
|
@sets = {}
|
204
203
|
if options[:params] && Hash === options[:params]
|
205
|
-
@sets[id] = ParamSet.new(:
|
204
|
+
@sets[id] = ParamSet.new(params: options[:params])
|
206
205
|
end
|
207
206
|
end
|
208
207
|
|
209
208
|
def description
|
210
|
-
@sets.values.inject(@description.dup) {|desc, a| desc.concat(a.description) }
|
209
|
+
@sets.values.inject(@description.dup) { |desc, a| desc.concat(a.description) }
|
211
210
|
end
|
212
211
|
|
213
212
|
def run(arg, options)
|
@@ -215,6 +214,7 @@ module IDL
|
|
215
214
|
if self.respond_to?(:_prepare, true)
|
216
215
|
result = _prepare(arg, options)
|
217
216
|
return false unless result && !result.empty?
|
217
|
+
|
218
218
|
arg = result.shift
|
219
219
|
ext_args = result
|
220
220
|
else
|
@@ -232,7 +232,7 @@ module IDL
|
|
232
232
|
private
|
233
233
|
|
234
234
|
def handle_sets(param, options, *ext_args)
|
235
|
-
@sets.values.inject(false) {|f, s| s.run(param, options, *ext_args) || f }
|
235
|
+
@sets.values.inject(false) { |f, s| s.run(param, options, *ext_args) || f }
|
236
236
|
end
|
237
237
|
end # Group
|
238
238
|
|
@@ -244,6 +244,7 @@ module IDL
|
|
244
244
|
def define_group(id, options = {}, &block)
|
245
245
|
id = id.to_sym
|
246
246
|
raise "option group [#{id}] already exists" if @option.groups.has_key?(id)
|
247
|
+
|
247
248
|
@option.groups[id] = Group.new(id, options)
|
248
249
|
block.call(Group::Configurator.new(@option.groups[id])) if block_given?
|
249
250
|
end
|
@@ -254,7 +255,7 @@ module IDL
|
|
254
255
|
parms = options[:params] ? options.delete(:params) : options.delete(:param)
|
255
256
|
@option.groups[id] ||= Group.new(id, options)
|
256
257
|
grpcfg = Group::Configurator.new(@option.groups[id])
|
257
|
-
grpcfg.modify_param_set(id, :
|
258
|
+
grpcfg.modify_param_set(id, params: parms) if parms
|
258
259
|
block.call(grpcfg) if block_given?
|
259
260
|
end
|
260
261
|
alias :with_group :modify_group
|
@@ -264,23 +265,23 @@ module IDL
|
|
264
265
|
end
|
265
266
|
|
266
267
|
def define_param_set(id, options = {}, &block)
|
267
|
-
modify_group :default, {:
|
268
|
+
modify_group :default, {test: true} do |grpcfg|
|
268
269
|
grpcfg.define_param_set(id, options, &block)
|
269
270
|
end
|
270
271
|
end
|
271
272
|
alias :for_set :define_param_set
|
272
273
|
alias :for_params :define_param_set
|
273
274
|
|
274
|
-
def on_exec(options={}, &block)
|
275
|
-
modify_group :default, {:
|
276
|
-
grpcfg.modify_param_set(:default, options.merge({:
|
275
|
+
def on_exec(options = {}, &block)
|
276
|
+
modify_group :default, {test: true} do |grpcfg|
|
277
|
+
grpcfg.modify_param_set(:default, options.merge({all_params: true})) do |pscfg|
|
277
278
|
pscfg.on_exec(&block)
|
278
279
|
end
|
279
280
|
end
|
280
281
|
end
|
281
282
|
|
282
|
-
def define_param(id, options={}, &block)
|
283
|
-
modify_group :default, {:
|
283
|
+
def define_param(id, options = {}, &block)
|
284
|
+
modify_group :default, {test: true} do |grpcfg|
|
284
285
|
grpcfg.define_param_set("#{id}_set", options) do |pscfg|
|
285
286
|
pscfg.with(id)
|
286
287
|
pscfg.on_exec(&block)
|
@@ -300,10 +301,8 @@ module IDL
|
|
300
301
|
alias :without_params :without_param
|
301
302
|
end
|
302
303
|
|
303
|
-
attr_reader :switch
|
304
|
-
|
305
|
-
attr_reader :separator
|
306
|
-
attr_reader :groups
|
304
|
+
attr_reader :switch, :type, :separator, :groups
|
305
|
+
|
307
306
|
def initialize(switch, options)
|
308
307
|
@switch = switch
|
309
308
|
@type = options[:type] || TrueClass
|
@@ -313,23 +312,24 @@ module IDL
|
|
313
312
|
end
|
314
313
|
|
315
314
|
def description(indent = "")
|
316
|
-
@groups.values.inject(@description.dup) {|desc, h| desc.concat(h.description.collect {|desc| "\r#{indent} #{desc}"}) }
|
315
|
+
@groups.values.inject(@description.dup) { |desc, h| desc.concat(h.description.collect { |desc| "\r#{indent} #{desc}" }) }
|
317
316
|
end
|
318
317
|
|
319
318
|
def run(arg, options)
|
320
|
-
unless @groups.values.inject(false) {|f, h| h.run(arg, options) || f }
|
319
|
+
unless @groups.values.inject(false) { |f, h| h.run(arg, options) || f }
|
321
320
|
raise ArgumentError, "unknown option [#{arg}] for switch '#{@switch}'"
|
322
321
|
end
|
323
322
|
end
|
324
323
|
end # Option
|
325
324
|
|
326
|
-
def initialize
|
325
|
+
def initialize
|
327
326
|
@options = {}
|
328
327
|
end
|
329
328
|
|
330
329
|
def define_switch(switch, options = {}, &block)
|
331
330
|
switch = switch.to_s
|
332
331
|
raise "switch types mismatch" if @options.has_key?(switch) && options[:type] && options[:type] != @options[switch].type
|
332
|
+
|
333
333
|
@options[switch] ||= Option.new(switch, options)
|
334
334
|
block.call(Option::Configurator.new(@options[switch])) if block_given?
|
335
335
|
end
|
@@ -351,7 +351,5 @@ module IDL
|
|
351
351
|
optp.separator '' if op.separator
|
352
352
|
end
|
353
353
|
end
|
354
|
-
|
355
354
|
end # OptionList
|
356
|
-
|
357
355
|
end # IDL
|
data/lib/ridl/parser.rb
CHANGED
@@ -648,7 +648,6 @@ end
|
|
648
648
|
require 'ridl/delegate'
|
649
649
|
|
650
650
|
module IDL
|
651
|
-
|
652
651
|
class Parser < Racc::Parser
|
653
652
|
|
654
653
|
module_eval(<<'...end parser.ry/module_eval...', 'parser.ry', 830)
|
@@ -4247,6 +4246,4 @@ def _reduce_none(val, _values)
|
|
4247
4246
|
end
|
4248
4247
|
|
4249
4248
|
end # class Parser
|
4250
|
-
|
4251
|
-
|
4252
4249
|
end #of module IDL
|
data/lib/ridl/runner.rb
CHANGED
@@ -18,23 +18,21 @@ require 'ridl/options'
|
|
18
18
|
# -----------------------------------------------------------------------
|
19
19
|
|
20
20
|
module IDL
|
21
|
-
|
22
21
|
OPTIONS = Options.new({
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
22
|
+
outputdir: nil,
|
23
|
+
includepaths: [],
|
24
|
+
xincludepaths: [],
|
25
|
+
verbose: (ENV['RIDL_VERBOSE'] || 0).to_i,
|
26
|
+
debug: false,
|
27
|
+
namespace: nil,
|
28
|
+
search_incpath: false,
|
29
|
+
backend: nil,
|
30
|
+
macros: {
|
32
31
|
}
|
33
32
|
})
|
34
33
|
CORE_OPTIONS = OPTIONS.keys
|
35
34
|
|
36
35
|
class Engine
|
37
|
-
|
38
36
|
class ProductionStack
|
39
37
|
def initialize
|
40
38
|
@stack = []
|
@@ -56,6 +54,7 @@ module IDL
|
|
56
54
|
|
57
55
|
def pop
|
58
56
|
return nil if empty?
|
57
|
+
|
59
58
|
id, prod = @stack.shift
|
60
59
|
@index.delete(id)
|
61
60
|
prod
|
@@ -63,12 +62,14 @@ module IDL
|
|
63
62
|
|
64
63
|
def peek
|
65
64
|
return nil if empty?
|
65
|
+
|
66
66
|
id, _ = @stack.first
|
67
67
|
id
|
68
68
|
end
|
69
69
|
|
70
70
|
def remove(id)
|
71
71
|
return nil unless has?(id)
|
72
|
+
|
72
73
|
i = @index.delete(id.to_sym)
|
73
74
|
_, producer = @productionstack.delete(i)
|
74
75
|
producer
|
@@ -129,6 +130,7 @@ module IDL
|
|
129
130
|
|
130
131
|
def push_production(id, producer)
|
131
132
|
raise "Producer #{id} already queued" if @productionstack.has?(id)
|
133
|
+
|
132
134
|
@productionstack.push(id, producer)
|
133
135
|
end
|
134
136
|
|
@@ -183,9 +185,9 @@ module IDL
|
|
183
185
|
# parse arguments
|
184
186
|
begin
|
185
187
|
@optparser.parse!(argv)
|
186
|
-
rescue ArgumentError =>
|
187
|
-
IDL.error(
|
188
|
-
IDL.error(
|
188
|
+
rescue ArgumentError => e
|
189
|
+
IDL.error(e.inspect)
|
190
|
+
IDL.error(e.backtrace.join("\n")) if IDL.verbose_level.positive?
|
189
191
|
return false
|
190
192
|
end
|
191
193
|
|
@@ -231,7 +233,7 @@ module IDL
|
|
231
233
|
# process parse result -> code generation
|
232
234
|
IDL.log(2, 'RIDL - processing input')
|
233
235
|
|
234
|
-
GenFile.transaction
|
236
|
+
GenFile.transaction do
|
235
237
|
begin
|
236
238
|
|
237
239
|
backend.process_input(_parser, _opts)
|
@@ -250,9 +252,9 @@ module IDL
|
|
250
252
|
rescue Backend::ProcessStop
|
251
253
|
IDL.log(2, "RIDL - processing #{IO === _idlfile ? 'from STDIN' : (StringIO === _idlfile ? 'from string' : _idlfile)} stopped with \"#{$!.message}\"")
|
252
254
|
|
253
|
-
rescue =>
|
254
|
-
IDL.error(
|
255
|
-
IDL.error(
|
255
|
+
rescue => e
|
256
|
+
IDL.error(e)
|
257
|
+
IDL.error(e.backtrace.join("\n")) unless e.is_a? IDL::ParseError
|
256
258
|
return false
|
257
259
|
end
|
258
260
|
end
|
@@ -272,9 +274,9 @@ module IDL
|
|
272
274
|
|
273
275
|
begin
|
274
276
|
_parser.parse(io)
|
275
|
-
rescue =>
|
276
|
-
IDL.error(
|
277
|
-
IDL.error(
|
277
|
+
rescue => e
|
278
|
+
IDL.error(e.inspect)
|
279
|
+
IDL.error(e.backtrace.join("\n")) unless e.is_a? IDL::ParseError
|
278
280
|
return nil
|
279
281
|
ensure
|
280
282
|
io.close unless String === io || io == $stdin
|
@@ -328,7 +330,7 @@ module IDL
|
|
328
330
|
|
329
331
|
def init_optparser
|
330
332
|
script_name = File.basename($0, '.*')
|
331
|
-
|
333
|
+
unless script_name =~ /ridlc/
|
332
334
|
script_name = 'ruby ' + $0
|
333
335
|
end
|
334
336
|
|
@@ -398,11 +400,12 @@ module IDL
|
|
398
400
|
opts.separator ""
|
399
401
|
|
400
402
|
opts.on('-h', '--help',
|
401
|
-
'Show this help message.') { puts opts
|
403
|
+
'Show this help message.') { puts opts
|
404
|
+
puts
|
405
|
+
exit }
|
402
406
|
|
403
407
|
opts
|
404
408
|
end
|
405
|
-
|
406
409
|
end
|
407
410
|
|
408
411
|
def IDL.engine?
|
@@ -419,11 +422,13 @@ module IDL
|
|
419
422
|
|
420
423
|
def IDL.pop_input
|
421
424
|
return nil unless engine?
|
425
|
+
|
422
426
|
Thread.current[:ridl_engine].pop_input
|
423
427
|
end
|
424
428
|
|
425
429
|
def IDL.peek_input
|
426
430
|
return nil unless engine?
|
431
|
+
|
427
432
|
Thread.current[:ridl_engine].peek_input
|
428
433
|
end
|
429
434
|
|
@@ -437,11 +442,13 @@ module IDL
|
|
437
442
|
|
438
443
|
def IDL.pop_production
|
439
444
|
return nil unless engine?
|
445
|
+
|
440
446
|
Thread.current[:ridl_engine].pop_production
|
441
447
|
end
|
442
448
|
|
443
449
|
def IDL.remove_production(id)
|
444
450
|
return nil unless engine?
|
451
|
+
|
445
452
|
Thread.current[:ridl_engine].remove_production(id)
|
446
453
|
end
|
447
454
|
|
@@ -455,6 +462,7 @@ module IDL
|
|
455
462
|
|
456
463
|
def IDL.production(id)
|
457
464
|
return nil unless engine?
|
465
|
+
|
458
466
|
Thread.current[:ridl_engine].production(id)
|
459
467
|
end
|
460
468
|
|
@@ -503,7 +511,7 @@ module IDL
|
|
503
511
|
# add optional search paths for RIDL backends
|
504
512
|
options[:be_path] ||= []
|
505
513
|
options[:be_path].unshift(*ENV['RIDL_BE_PATH'].split(/#{File::PATH_SEPARATOR}/)) if ENV['RIDL_BE_PATH']
|
506
|
-
options[:be_path].collect! {|p| p.gsub('\\', '/') } # cleanup to prevent mixed path separators
|
514
|
+
options[:be_path].collect! { |p| p.gsub('\\', '/') } # cleanup to prevent mixed path separators
|
507
515
|
$:.concat(options[:be_path]) unless options[:be_path].empty?
|
508
516
|
|
509
517
|
# check for special bootstrapping switches
|
@@ -527,5 +535,4 @@ module IDL
|
|
527
535
|
exit(1) unless Thread.current[:ridl_engine].run(argv)
|
528
536
|
end
|
529
537
|
end # IDL.run
|
530
|
-
|
531
538
|
end
|