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,46 @@
1
+ grammar XdrEnumGrammar
2
+
3
+ rule enum_def
4
+ "enum" space
5
+ identifier space?
6
+ enum_body space?
7
+ ";"
8
+ <Xdrgen::AST::Definitions::Enum>
9
+ end
10
+
11
+
12
+ rule enum_body
13
+ "{"
14
+ space?
15
+ first_member_n:enum_member
16
+ additional_members_n:(space? "," space? enum_member )*
17
+ space?
18
+ "}"
19
+ end
20
+
21
+ rule enum_type_spec
22
+ "enum" space enum_body
23
+ <Xdrgen::AST::Definitions::NestedEnum>
24
+ end
25
+
26
+ rule enum_member
27
+ identifier
28
+ space?
29
+ value_n:enum_value?
30
+ <Xdrgen::AST::Definitions::EnumMember>
31
+ end
32
+
33
+ rule enum_value
34
+ "="
35
+ space?
36
+ val:(enum_value_constant / enum_value_alias)
37
+ end
38
+
39
+ rule enum_value_constant
40
+ constant
41
+ end
42
+
43
+ rule enum_value_alias
44
+ identifier
45
+ end
46
+ end
@@ -0,0 +1,30 @@
1
+ grammar XdrMainGrammar
2
+ include XdrBaseGrammar
3
+ include XdrDeclarationGrammar
4
+ include XdrCommentsGrammar
5
+ include XdrEnumGrammar
6
+ include XdrTypedefGrammar
7
+ include XdrStructGrammar
8
+ include XdrUnionGrammar
9
+ include XdrConstGrammar
10
+ include XdrNamespaceGrammar
11
+
12
+ rule top
13
+ children_n:definition*
14
+ <Xdrgen::AST::Top>
15
+ end
16
+
17
+ rule definition
18
+ (
19
+ typedef_def /
20
+ enum_def /
21
+ struct_def /
22
+ union_def /
23
+ const_def /
24
+ namespace_def /
25
+ ampersand_line /
26
+ space
27
+ )
28
+ end
29
+
30
+ end
@@ -0,0 +1,12 @@
1
+ grammar XdrNamespaceGrammar
2
+
3
+ rule namespace_def
4
+ "namespace" space
5
+ identifier space?
6
+ "{"
7
+ children_n:definition*
8
+ "}"
9
+ <Xdrgen::AST::Definitions::Namespace>
10
+ end
11
+
12
+ end
@@ -0,0 +1,32 @@
1
+ grammar XdrStructGrammar
2
+
3
+ rule struct_def
4
+ "struct" space
5
+ identifier space?
6
+ struct_body space?
7
+ ";"
8
+ <Xdrgen::AST::Definitions::Struct>
9
+ end
10
+
11
+ rule struct_body
12
+ "{"
13
+ space?
14
+ children_n:(struct_member)+
15
+ "}"
16
+ <Xdrgen::AST::Definitions::StructBody>
17
+ end
18
+
19
+ rule struct_member
20
+ declaration
21
+ space?
22
+ ";"
23
+ space?
24
+ <Xdrgen::AST::Definitions::StructMember>
25
+ end
26
+
27
+ rule struct_type_spec
28
+ "struct" space struct_body
29
+ <Xdrgen::AST::Definitions::NestedStruct>
30
+ end
31
+
32
+ end
@@ -0,0 +1,12 @@
1
+ grammar XdrTypedefGrammar
2
+
3
+ rule typedef_def
4
+ "typedef"
5
+ space
6
+ declaration
7
+ space?
8
+ ";"
9
+ <Xdrgen::AST::Definitions::Typedef>
10
+ end
11
+
12
+ end
@@ -0,0 +1,63 @@
1
+ grammar XdrUnionGrammar
2
+
3
+ rule union_def
4
+ "union" space
5
+ identifier space
6
+ union_body space?
7
+ ";"
8
+ <Xdrgen::AST::Definitions::Union>
9
+ end
10
+
11
+
12
+ rule union_body
13
+ "switch"
14
+ space?
15
+ "(" discriminant:declaration ")"
16
+ space?
17
+ "{"
18
+ space?
19
+ arms_n:(arm_spec)+
20
+ default_case_n:(default_case_spec)?
21
+ space?
22
+ "}"
23
+ <Xdrgen::AST::Definitions::UnionBody>
24
+ end
25
+
26
+ rule union_type_spec
27
+ "union" space union_body
28
+ <Xdrgen::AST::Definitions::NestedUnion>
29
+ end
30
+
31
+ rule arm_spec
32
+ cases_n:case_spec+
33
+ space?
34
+ declaration
35
+ space?
36
+ ";"
37
+ space?
38
+ <Xdrgen::AST::Definitions::UnionArm>
39
+ end
40
+
41
+
42
+ rule case_spec
43
+ "case"
44
+ space?
45
+ value
46
+ space?
47
+ ":"
48
+ space?
49
+ <Xdrgen::AST::Definitions::UnionArmCase>
50
+ end
51
+
52
+
53
+ rule default_case_spec
54
+ "default" space? ":"
55
+ space?
56
+ declaration
57
+ space?
58
+ ";"
59
+ <Xdrgen::AST::Definitions::UnionDefaultArm>
60
+ end
61
+
62
+
63
+ end
@@ -0,0 +1,37 @@
1
+ require 'fileutils'
2
+
3
+ module Xdrgen
4
+ class Output
5
+
6
+ attr_reader :source_paths
7
+ attr_reader :output_dir
8
+
9
+ def initialize(source_paths, output_dir)
10
+ @source_paths = source_paths
11
+ @output_dir = output_dir
12
+ @files = {}
13
+ end
14
+
15
+ def open(child_path)
16
+ if @files.has_key?(child_path)
17
+ raise Xdrgen::DuplicateFileError, "Cannot open #{child_path} twice"
18
+ end
19
+
20
+ path = File.join @output_dir, child_path
21
+ result = @files[child_path] = OutputFile.new(path)
22
+
23
+ yield result if block_given?
24
+
25
+ result
26
+ end
27
+
28
+ def write(child_path, content)
29
+ open(child_path){|c| c.puts content}
30
+ end
31
+
32
+ def close
33
+ @files.values.each(&:close)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,87 @@
1
+ require 'fileutils'
2
+ module Xdrgen
3
+ class OutputFile
4
+ SPACES_PER_INDENT = 2
5
+
6
+ def initialize(path)
7
+ @path = path
8
+ @current_indent = 0
9
+
10
+ FileUtils.mkdir_p File.dirname(@path)
11
+ @io = File.open(@path, 'w')
12
+ end
13
+
14
+ def close
15
+ @io.close
16
+ end
17
+
18
+ def puts(s="")
19
+ write_break_if_needed
20
+ @io.puts indented(s)
21
+ end
22
+
23
+ def indent(step=1)
24
+ @current_indent += step
25
+ yield
26
+ ensure
27
+ @current_indent -= step
28
+ end
29
+
30
+ def break
31
+ @break_needed = true
32
+ end
33
+
34
+ def unbreak
35
+ @break_needed = false
36
+ end
37
+
38
+ def balance_after(balance_regex, include_space=false)
39
+ @old_io = @io
40
+ @io = StringIO.new
41
+ yield
42
+ raw = @io.string
43
+ @old_io.puts balance_string(raw, balance_regex, include_space)
44
+ ensure
45
+ @io = @old_io
46
+ @old_io = nil
47
+ end
48
+
49
+ private
50
+ def indented(s)
51
+ s.indent(@current_indent * SPACES_PER_INDENT)
52
+ end
53
+
54
+ def write_break_if_needed
55
+ return unless @break_needed
56
+ @io.puts ""
57
+ ensure
58
+ @break_needed = false
59
+ end
60
+
61
+ def balance_string(raw, balance_regex, include_space)
62
+ lines = raw.split("\n")
63
+ splits = lines.map{|l| split_line_at(l, balance_regex)}
64
+
65
+ max_split_length = splits.map{|s| s.first.length }.compact.max || -1
66
+ max_split_length += 1 if include_space
67
+
68
+ splits.map do |first, rest|
69
+ next first if rest.blank?
70
+
71
+ (first || "").ljust(max_split_length) + rest
72
+ end.join("\n")
73
+ end
74
+
75
+ def split_line_at(line, regex)
76
+ match = regex.match(line)
77
+
78
+ if match.blank?
79
+ [line.rstrip, nil]
80
+ else
81
+ split_point = match.end(0)
82
+ [line[0...split_point], line[split_point..-1]]
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,40 @@
1
+ require 'treetop'
2
+
3
+ module Xdrgen
4
+ class Parser
5
+ delegate :failure_line, to: :@grammar
6
+
7
+ def initialize
8
+ @grammar = XdrMainGrammarParser.new
9
+ end
10
+
11
+ def parse(data)
12
+ @grammar.parse(data).tap do |tree|
13
+ if(tree.nil?)
14
+ raise Xdrgen::ParseError, "Couldn't parse, failed at: #{@grammar.failure_line}:#{@grammar.failure_column}\n#{@grammar.failure_reason}"
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ end
21
+ end
22
+
23
+ grammars = %w(
24
+ base
25
+ declaration
26
+ enum
27
+ const
28
+ struct
29
+ union
30
+ typedef
31
+ namespace
32
+ comments
33
+ main
34
+ )
35
+
36
+
37
+ # load the grammar files
38
+ grammars.each do |g|
39
+ Treetop.load("#{__dir__}/grammar/#{g}.treetop")
40
+ end
@@ -0,0 +1,3 @@
1
+ module Xdrgen
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,14 @@
1
+
2
+ enum AccountFlags
3
+ { // masks for each flag
4
+ AUTH_REQUIRED_FLAG = 0x1
5
+ };
6
+
7
+ /* AccountEntry
8
+
9
+ Main entry representing a user in Stellar. All transactions are performed
10
+ using an account.
11
+
12
+ Other ledger entries created require an account.
13
+
14
+ */
@@ -0,0 +1,4 @@
1
+ const FOO = 1;
2
+
3
+ typedef int TestArray[FOO];
4
+ typedef int TestArray2<FOO>;
@@ -0,0 +1,36 @@
1
+ enum MessageType
2
+ {
3
+ ERROR_MSG,
4
+ HELLO,
5
+ DONT_HAVE,
6
+
7
+ GET_PEERS, // gets a list of peers this guy knows about
8
+ PEERS,
9
+
10
+ GET_TX_SET, // gets a particular txset by hash
11
+ TX_SET,
12
+
13
+ GET_VALIDATIONS, // gets validations for a given ledger hash
14
+ VALIDATIONS,
15
+
16
+ TRANSACTION, //pass on a tx you have heard about
17
+ JSON_TRANSACTION,
18
+
19
+ // FBA
20
+ GET_FBA_QUORUMSET,
21
+ FBA_QUORUMSET,
22
+ FBA_MESSAGE
23
+ };
24
+
25
+ enum Color {
26
+ RED=0,
27
+ GREEN=1,
28
+ BLUE=2
29
+ };
30
+
31
+
32
+ enum Color2 {
33
+ RED2=RED,
34
+ GREEN2=1,
35
+ BLUE2=2
36
+ };
@@ -0,0 +1,24 @@
1
+ enum UnionKey {
2
+ ONE = 1,
3
+ TWO = 2,
4
+ OFFER = 3
5
+ };
6
+
7
+ typedef int Foo;
8
+
9
+ union MyUnion switch (UnionKey type)
10
+ {
11
+ case ONE:
12
+ struct {
13
+ int someInt;
14
+ } one;
15
+
16
+ case TWO:
17
+ struct {
18
+ int someInt;
19
+ Foo foo;
20
+ } two;
21
+
22
+ case OFFER:
23
+ void;
24
+ };