xdrgen 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|