xdrgen 0.0.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 +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +12 -0
- data/LICENSE.txt +202 -0
- data/README.md +79 -0
- data/Rakefile +6 -0
- data/bin/xdrgen +5 -0
- data/lib/xdrgen.rb +24 -0
- data/lib/xdrgen/ast.rb +81 -0
- data/lib/xdrgen/ast/concerns/contained.rb +32 -0
- data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
- data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
- data/lib/xdrgen/ast/concerns/named.rb +16 -0
- data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
- data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
- data/lib/xdrgen/ast/constant.rb +7 -0
- data/lib/xdrgen/ast/decimal_constant.rb +7 -0
- data/lib/xdrgen/ast/declarations/array.rb +15 -0
- data/lib/xdrgen/ast/declarations/base.rb +28 -0
- data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
- data/lib/xdrgen/ast/declarations/optional.rb +5 -0
- data/lib/xdrgen/ast/declarations/simple.rb +7 -0
- data/lib/xdrgen/ast/declarations/string.rb +7 -0
- data/lib/xdrgen/ast/declarations/void.rb +7 -0
- data/lib/xdrgen/ast/definitions/base.rb +9 -0
- data/lib/xdrgen/ast/definitions/const.rb +12 -0
- data/lib/xdrgen/ast/definitions/enum.rb +17 -0
- data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
- data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
- data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
- data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
- data/lib/xdrgen/ast/definitions/struct.rb +18 -0
- data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
- data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
- data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
- data/lib/xdrgen/ast/definitions/union.rb +55 -0
- data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
- data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
- data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
- data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
- data/lib/xdrgen/ast/fixed_size.rb +23 -0
- data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
- data/lib/xdrgen/ast/identifier.rb +5 -0
- data/lib/xdrgen/ast/octal_constant.rb +7 -0
- data/lib/xdrgen/ast/top.rb +5 -0
- data/lib/xdrgen/ast/typespecs/base.rb +27 -0
- data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
- data/lib/xdrgen/ast/typespecs/double.rb +5 -0
- data/lib/xdrgen/ast/typespecs/float.rb +5 -0
- data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
- data/lib/xdrgen/ast/typespecs/int.rb +6 -0
- data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
- data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
- data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
- data/lib/xdrgen/ast/typespecs/string.rb +9 -0
- data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
- data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
- data/lib/xdrgen/ast/var_size.rb +26 -0
- data/lib/xdrgen/ast/whitespace.rb +5 -0
- data/lib/xdrgen/cli.rb +31 -0
- data/lib/xdrgen/compilation.rb +31 -0
- data/lib/xdrgen/generators.rb +16 -0
- data/lib/xdrgen/generators/base.rb +11 -0
- data/lib/xdrgen/generators/elixir.rb +260 -0
- data/lib/xdrgen/generators/go.rb +578 -0
- data/lib/xdrgen/generators/java.rb +810 -0
- data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
- data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
- data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
- data/lib/xdrgen/generators/java/XdrString.erb +58 -0
- data/lib/xdrgen/generators/javascript.rb +248 -0
- data/lib/xdrgen/generators/ruby.rb +283 -0
- data/lib/xdrgen/grammar/base.treetop +71 -0
- data/lib/xdrgen/grammar/comments.treetop +15 -0
- data/lib/xdrgen/grammar/const.treetop +8 -0
- data/lib/xdrgen/grammar/declaration.treetop +99 -0
- data/lib/xdrgen/grammar/enum.treetop +46 -0
- data/lib/xdrgen/grammar/main.treetop +30 -0
- data/lib/xdrgen/grammar/namespace.treetop +12 -0
- data/lib/xdrgen/grammar/struct.treetop +32 -0
- data/lib/xdrgen/grammar/typedef.treetop +12 -0
- data/lib/xdrgen/grammar/union.treetop +63 -0
- data/lib/xdrgen/output.rb +37 -0
- data/lib/xdrgen/output_file.rb +87 -0
- data/lib/xdrgen/parser.rb +40 -0
- data/lib/xdrgen/version.rb +3 -0
- data/spec/fixtures/generator/block_comments.x +14 -0
- data/spec/fixtures/generator/const.x +4 -0
- data/spec/fixtures/generator/enum.x +36 -0
- data/spec/fixtures/generator/nesting.x +24 -0
- data/spec/fixtures/generator/optional.x +8 -0
- data/spec/fixtures/generator/struct.x +10 -0
- data/spec/fixtures/generator/test.x +77 -0
- data/spec/fixtures/generator/union.x +28 -0
- data/spec/fixtures/parser/block_comments.x +14 -0
- data/spec/fixtures/parser/const.x +1 -0
- data/spec/fixtures/parser/enum.x +35 -0
- data/spec/fixtures/parser/nesting.x +26 -0
- data/spec/fixtures/parser/optional.x +8 -0
- data/spec/fixtures/parser/struct.x +8 -0
- data/spec/fixtures/parser/test.x +77 -0
- data/spec/fixtures/parser/union.x +10 -0
- data/spec/lib/xdrgen/generator_spec.rb +30 -0
- data/spec/lib/xdrgen/output_file_spec.rb +33 -0
- data/spec/lib/xdrgen/parser_spec.rb +27 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/fixtures.rb +27 -0
- data/xdrgen.gemspec +32 -0
- metadata +301 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Concerns
|
|
3
|
+
module Contained
|
|
4
|
+
extend Memoist
|
|
5
|
+
|
|
6
|
+
protected
|
|
7
|
+
memoize def ancestors
|
|
8
|
+
current = self.parent
|
|
9
|
+
result = []
|
|
10
|
+
|
|
11
|
+
while current.present?
|
|
12
|
+
result.unshift(current)
|
|
13
|
+
current = current.parent
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def root
|
|
20
|
+
ancestors.first
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def namespace
|
|
24
|
+
find_ancestors(HasDefinitions).last
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def find_ancestors(type)
|
|
28
|
+
ancestors.select{|a| a.is_a?(type)}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Concerns
|
|
3
|
+
module HasDefinitions
|
|
4
|
+
include HasChildren
|
|
5
|
+
|
|
6
|
+
def typedefs
|
|
7
|
+
find_children(Definitions::Typedef)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def consts
|
|
11
|
+
find_children(Definitions::Const)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def structs
|
|
15
|
+
find_children(Definitions::Struct)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def enums
|
|
19
|
+
find_children(Definitions::Enum)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def unions
|
|
23
|
+
find_children(Definitions::Union)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def namespaces
|
|
27
|
+
find_children(Definitions::Namespace)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def definitions
|
|
31
|
+
find_children(Definitions::Base)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def find_definition(name)
|
|
35
|
+
found = definitions.find{|d| d.name == name}
|
|
36
|
+
return found if found
|
|
37
|
+
|
|
38
|
+
namespaces.each do |ns|
|
|
39
|
+
found = ns.find_definition(name)
|
|
40
|
+
return found if found
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def find_enum_value(name)
|
|
47
|
+
enums.each do |e|
|
|
48
|
+
found = e.members.find{|d| d.name == name}
|
|
49
|
+
return found if found
|
|
50
|
+
end
|
|
51
|
+
raise "Could not find enum value #{name}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
##
|
|
55
|
+
# Collapse the flat list of definitions in this
|
|
56
|
+
# container into a nested array, grouping the
|
|
57
|
+
# definitions by contiguous types:
|
|
58
|
+
#
|
|
59
|
+
# Example:
|
|
60
|
+
#
|
|
61
|
+
# [Typedef, Typedef, Typedef, Const, Struct, Struct, Typedef]
|
|
62
|
+
#
|
|
63
|
+
# becomes:
|
|
64
|
+
#
|
|
65
|
+
# [[Typedef, Typedef, Typedef], [Const], [Struct, Struct], [Typedef]]
|
|
66
|
+
#
|
|
67
|
+
#
|
|
68
|
+
def definition_blocks
|
|
69
|
+
children.each_with_object([]) do |child, result|
|
|
70
|
+
next unless child.is_a?(Definitions::Base)
|
|
71
|
+
|
|
72
|
+
current_group = result.last
|
|
73
|
+
|
|
74
|
+
if current_group.blank?
|
|
75
|
+
result.push [child]
|
|
76
|
+
elsif current_group.last.is_a?(child.class)
|
|
77
|
+
current_group.push child
|
|
78
|
+
else
|
|
79
|
+
result.push [child]
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
def find_children(type)
|
|
86
|
+
children.select{|c| c.is_a? type}
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Concerns
|
|
3
|
+
module Named
|
|
4
|
+
delegate :name, to: :identifier
|
|
5
|
+
|
|
6
|
+
def namespaces
|
|
7
|
+
return [] unless self.is_a?(Contained)
|
|
8
|
+
self.find_ancestors(Concerns::Namespace)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def fully_qualified_name
|
|
12
|
+
namespaces.map(&:name) + [name]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Concerns
|
|
3
|
+
module NestedDefinition
|
|
4
|
+
|
|
5
|
+
def name
|
|
6
|
+
find_ancestors(Declarations::Base).last.name
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def parent_defn
|
|
10
|
+
find_ancestors(Definitions::Struct).last ||
|
|
11
|
+
find_ancestors(Definitions::Union).last
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Xdrgen::AST::Declarations
|
|
2
|
+
class Array < Base
|
|
3
|
+
delegate :name, to: :identifier
|
|
4
|
+
delegate :size, to: :size_spec
|
|
5
|
+
delegate :resolved_size, to: :size_spec
|
|
6
|
+
|
|
7
|
+
def fixed?
|
|
8
|
+
size_spec.is_a?(Xdrgen::AST::FixedSize)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def child_type
|
|
12
|
+
type.text_value
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Declarations
|
|
3
|
+
class Base < Treetop::Runtime::SyntaxNode
|
|
4
|
+
TYPE_NODES = [
|
|
5
|
+
Typespecs::Base,
|
|
6
|
+
Concerns::NestedDefinition,
|
|
7
|
+
Concerns::Contained,
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
def type
|
|
11
|
+
search(type_s) do |node|
|
|
12
|
+
TYPE_NODES.any?{|t| node.is_a?(t)}
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
def search(cur_el, &predicate)
|
|
18
|
+
return cur_el if predicate.call(cur_el)
|
|
19
|
+
return if cur_el.elements.blank?
|
|
20
|
+
|
|
21
|
+
cur_el.elements.each do |next_el|
|
|
22
|
+
child_result = search(next_el, &predicate)
|
|
23
|
+
return child_result if child_result.present?
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Definitions
|
|
3
|
+
class Enum < Base
|
|
4
|
+
extend Memoist
|
|
5
|
+
include Concerns::Named
|
|
6
|
+
include Concerns::Contained
|
|
7
|
+
|
|
8
|
+
memoize def members
|
|
9
|
+
results = [enum_body.first_member_n]
|
|
10
|
+
enum_body.additional_members_n.elements.each do |n|
|
|
11
|
+
results.push n.enum_member
|
|
12
|
+
end
|
|
13
|
+
results
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Definitions
|
|
3
|
+
class EnumMember < Base
|
|
4
|
+
extend Memoist
|
|
5
|
+
|
|
6
|
+
include Concerns::Named
|
|
7
|
+
include Concerns::Contained
|
|
8
|
+
|
|
9
|
+
def value
|
|
10
|
+
unsigned_value = defined_value || auto_value
|
|
11
|
+
|
|
12
|
+
# enums are signed in xdr, so...
|
|
13
|
+
# convert to twos complement value
|
|
14
|
+
[unsigned_value].pack("l>").unpack("l>").first
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
memoize def enum
|
|
18
|
+
find_ancestors(Enum).last
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def auto_value
|
|
23
|
+
index = enum.members.index(self)
|
|
24
|
+
if index == 0
|
|
25
|
+
0
|
|
26
|
+
else
|
|
27
|
+
# use the previous members value + 1
|
|
28
|
+
enum.members[index - 1].value + 1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def defined_value
|
|
33
|
+
return if value_n.terminal?
|
|
34
|
+
|
|
35
|
+
case value_n.val
|
|
36
|
+
when Constant
|
|
37
|
+
value_n.val.value
|
|
38
|
+
when Identifier
|
|
39
|
+
namespace.find_enum_value(value_n.val.name).defined_value
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Xdrgen::AST
|
|
2
|
+
module Definitions
|
|
3
|
+
class Struct < Base
|
|
4
|
+
include Concerns::Named
|
|
5
|
+
include Concerns::Namespace
|
|
6
|
+
include Concerns::Contained
|
|
7
|
+
|
|
8
|
+
delegate :members, to: :struct_body
|
|
9
|
+
|
|
10
|
+
def nested_definitions
|
|
11
|
+
members.
|
|
12
|
+
map(&:declaration).
|
|
13
|
+
map(&:type).
|
|
14
|
+
select{|d| d.is_a?(Concerns::NestedDefinition)}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|