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.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +12 -0
  6. data/LICENSE.txt +202 -0
  7. data/README.md +79 -0
  8. data/Rakefile +6 -0
  9. data/bin/xdrgen +5 -0
  10. data/lib/xdrgen.rb +24 -0
  11. data/lib/xdrgen/ast.rb +81 -0
  12. data/lib/xdrgen/ast/concerns/contained.rb +32 -0
  13. data/lib/xdrgen/ast/concerns/has_children.rb +9 -0
  14. data/lib/xdrgen/ast/concerns/has_definitions.rb +90 -0
  15. data/lib/xdrgen/ast/concerns/named.rb +16 -0
  16. data/lib/xdrgen/ast/concerns/namespace.rb +7 -0
  17. data/lib/xdrgen/ast/concerns/nested_definition.rb +16 -0
  18. data/lib/xdrgen/ast/constant.rb +7 -0
  19. data/lib/xdrgen/ast/decimal_constant.rb +7 -0
  20. data/lib/xdrgen/ast/declarations/array.rb +15 -0
  21. data/lib/xdrgen/ast/declarations/base.rb +28 -0
  22. data/lib/xdrgen/ast/declarations/opaque.rb +11 -0
  23. data/lib/xdrgen/ast/declarations/optional.rb +5 -0
  24. data/lib/xdrgen/ast/declarations/simple.rb +7 -0
  25. data/lib/xdrgen/ast/declarations/string.rb +7 -0
  26. data/lib/xdrgen/ast/declarations/void.rb +7 -0
  27. data/lib/xdrgen/ast/definitions/base.rb +9 -0
  28. data/lib/xdrgen/ast/definitions/const.rb +12 -0
  29. data/lib/xdrgen/ast/definitions/enum.rb +17 -0
  30. data/lib/xdrgen/ast/definitions/enum_member.rb +44 -0
  31. data/lib/xdrgen/ast/definitions/namespace.rb +9 -0
  32. data/lib/xdrgen/ast/definitions/nested_enum.rb +7 -0
  33. data/lib/xdrgen/ast/definitions/nested_struct.rb +7 -0
  34. data/lib/xdrgen/ast/definitions/nested_union.rb +7 -0
  35. data/lib/xdrgen/ast/definitions/struct.rb +18 -0
  36. data/lib/xdrgen/ast/definitions/struct_body.rb +11 -0
  37. data/lib/xdrgen/ast/definitions/struct_member.rb +12 -0
  38. data/lib/xdrgen/ast/definitions/typedef.rb +19 -0
  39. data/lib/xdrgen/ast/definitions/union.rb +55 -0
  40. data/lib/xdrgen/ast/definitions/union_arm.rb +33 -0
  41. data/lib/xdrgen/ast/definitions/union_arm_case.rb +11 -0
  42. data/lib/xdrgen/ast/definitions/union_body.rb +22 -0
  43. data/lib/xdrgen/ast/definitions/union_default_arm.rb +19 -0
  44. data/lib/xdrgen/ast/fixed_size.rb +23 -0
  45. data/lib/xdrgen/ast/hexadecimal_constant.rb +7 -0
  46. data/lib/xdrgen/ast/identifier.rb +5 -0
  47. data/lib/xdrgen/ast/octal_constant.rb +7 -0
  48. data/lib/xdrgen/ast/top.rb +5 -0
  49. data/lib/xdrgen/ast/typespecs/base.rb +27 -0
  50. data/lib/xdrgen/ast/typespecs/bool.rb +5 -0
  51. data/lib/xdrgen/ast/typespecs/double.rb +5 -0
  52. data/lib/xdrgen/ast/typespecs/float.rb +5 -0
  53. data/lib/xdrgen/ast/typespecs/hyper.rb +6 -0
  54. data/lib/xdrgen/ast/typespecs/int.rb +6 -0
  55. data/lib/xdrgen/ast/typespecs/opaque.rb +10 -0
  56. data/lib/xdrgen/ast/typespecs/quadruple.rb +5 -0
  57. data/lib/xdrgen/ast/typespecs/simple.rb +14 -0
  58. data/lib/xdrgen/ast/typespecs/string.rb +9 -0
  59. data/lib/xdrgen/ast/typespecs/unsigned_hyper.rb +5 -0
  60. data/lib/xdrgen/ast/typespecs/unsigned_int.rb +5 -0
  61. data/lib/xdrgen/ast/var_size.rb +26 -0
  62. data/lib/xdrgen/ast/whitespace.rb +5 -0
  63. data/lib/xdrgen/cli.rb +31 -0
  64. data/lib/xdrgen/compilation.rb +31 -0
  65. data/lib/xdrgen/generators.rb +16 -0
  66. data/lib/xdrgen/generators/base.rb +11 -0
  67. data/lib/xdrgen/generators/elixir.rb +260 -0
  68. data/lib/xdrgen/generators/go.rb +578 -0
  69. data/lib/xdrgen/generators/java.rb +810 -0
  70. data/lib/xdrgen/generators/java/XdrDataInputStream.erb +122 -0
  71. data/lib/xdrgen/generators/java/XdrDataOutputStream.erb +96 -0
  72. data/lib/xdrgen/generators/java/XdrElement.erb +10 -0
  73. data/lib/xdrgen/generators/java/XdrString.erb +58 -0
  74. data/lib/xdrgen/generators/javascript.rb +248 -0
  75. data/lib/xdrgen/generators/ruby.rb +283 -0
  76. data/lib/xdrgen/grammar/base.treetop +71 -0
  77. data/lib/xdrgen/grammar/comments.treetop +15 -0
  78. data/lib/xdrgen/grammar/const.treetop +8 -0
  79. data/lib/xdrgen/grammar/declaration.treetop +99 -0
  80. data/lib/xdrgen/grammar/enum.treetop +46 -0
  81. data/lib/xdrgen/grammar/main.treetop +30 -0
  82. data/lib/xdrgen/grammar/namespace.treetop +12 -0
  83. data/lib/xdrgen/grammar/struct.treetop +32 -0
  84. data/lib/xdrgen/grammar/typedef.treetop +12 -0
  85. data/lib/xdrgen/grammar/union.treetop +63 -0
  86. data/lib/xdrgen/output.rb +37 -0
  87. data/lib/xdrgen/output_file.rb +87 -0
  88. data/lib/xdrgen/parser.rb +40 -0
  89. data/lib/xdrgen/version.rb +3 -0
  90. data/spec/fixtures/generator/block_comments.x +14 -0
  91. data/spec/fixtures/generator/const.x +4 -0
  92. data/spec/fixtures/generator/enum.x +36 -0
  93. data/spec/fixtures/generator/nesting.x +24 -0
  94. data/spec/fixtures/generator/optional.x +8 -0
  95. data/spec/fixtures/generator/struct.x +10 -0
  96. data/spec/fixtures/generator/test.x +77 -0
  97. data/spec/fixtures/generator/union.x +28 -0
  98. data/spec/fixtures/parser/block_comments.x +14 -0
  99. data/spec/fixtures/parser/const.x +1 -0
  100. data/spec/fixtures/parser/enum.x +35 -0
  101. data/spec/fixtures/parser/nesting.x +26 -0
  102. data/spec/fixtures/parser/optional.x +8 -0
  103. data/spec/fixtures/parser/struct.x +8 -0
  104. data/spec/fixtures/parser/test.x +77 -0
  105. data/spec/fixtures/parser/union.x +10 -0
  106. data/spec/lib/xdrgen/generator_spec.rb +30 -0
  107. data/spec/lib/xdrgen/output_file_spec.rb +33 -0
  108. data/spec/lib/xdrgen/parser_spec.rb +27 -0
  109. data/spec/spec_helper.rb +13 -0
  110. data/spec/support/fixtures.rb +27 -0
  111. data/xdrgen.gemspec +32 -0
  112. 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,9 @@
1
+ module Xdrgen::AST
2
+ module Concerns
3
+ module HasChildren
4
+ def children
5
+ children_n.elements
6
+ end
7
+ end
8
+ end
9
+ 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,7 @@
1
+ module Xdrgen::AST
2
+ module Concerns
3
+ module Namespace
4
+
5
+ end
6
+ end
7
+ 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,7 @@
1
+ module Xdrgen::AST
2
+ class Constant < Treetop::Runtime::SyntaxNode
3
+ def value
4
+ raise NotImplementedError, "implement in subclass"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST
2
+ class DecimalConstant < Constant
3
+ def value
4
+ text_value.to_i
5
+ end
6
+ end
7
+ 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,11 @@
1
+ module Xdrgen::AST::Declarations
2
+ class Opaque < 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
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Xdrgen::AST::Declarations
2
+ class Optional < Base
3
+ delegate :name, to: :identifier
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST::Declarations
2
+ class Simple < Base
3
+ delegate :name, to: :identifier
4
+
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST::Declarations
2
+ class String < Base
3
+ delegate :name, to: :identifier
4
+ delegate :size, to: :size_spec
5
+ delegate :resolved_size, to: :size_spec
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST::Declarations
2
+ class Void < Base
3
+ def name
4
+ "void"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Xdrgen::AST::Definitions
2
+ class Base < Treetop::Runtime::SyntaxNode
3
+
4
+ def sub_type
5
+ :simple
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class Const < Base
4
+ include Concerns::Named
5
+ include Concerns::Contained
6
+
7
+ def value
8
+ value_n.text_value
9
+ end
10
+ end
11
+ end
12
+ 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,9 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class Namespace < Base
4
+ include Concerns::Named
5
+ include Concerns::Namespace
6
+ include Concerns::HasDefinitions
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class NestedEnum < Enum
4
+ include Concerns::NestedDefinition
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class NestedStruct < Struct
4
+ include Concerns::NestedDefinition
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class NestedUnion < Union
4
+ include Concerns::NestedDefinition
5
+ end
6
+ end
7
+ 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
@@ -0,0 +1,11 @@
1
+ module Xdrgen::AST
2
+ module Definitions
3
+ class StructBody < Base
4
+ include Concerns::HasChildren
5
+
6
+ def members
7
+ children.select{|c| c.is_a?(StructMember)}
8
+ end
9
+ end
10
+ end
11
+ end