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,19 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
module Definitions
|
3
|
+
class Typedef < Base
|
4
|
+
include Concerns::Contained
|
5
|
+
delegate :name, to: :declaration
|
6
|
+
delegate :type, to: :declaration
|
7
|
+
delegate :sub_type, to: :type
|
8
|
+
|
9
|
+
def resolved_type
|
10
|
+
cur = self
|
11
|
+
|
12
|
+
cur = root.find_definition(cur.type.text_value) while cur.is_a?(Typedef)
|
13
|
+
|
14
|
+
cur
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
module Definitions
|
3
|
+
class Union < Base
|
4
|
+
extend Memoist
|
5
|
+
include Concerns::Named
|
6
|
+
include Concerns::Namespace
|
7
|
+
include Concerns::Contained
|
8
|
+
|
9
|
+
delegate :discriminant, to: :union_body
|
10
|
+
delegate :name, to: :discriminant, prefix:true
|
11
|
+
delegate :arms, to: :union_body
|
12
|
+
delegate :normal_arms, to: :union_body
|
13
|
+
delegate :default_arm, to: :union_body
|
14
|
+
|
15
|
+
memoize def discriminant_type
|
16
|
+
return nil unless discriminant.type.is_a?(Identifier)
|
17
|
+
|
18
|
+
root.find_definition discriminant.type.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def resolved_case(kase)
|
22
|
+
if discriminant_type.nil? then
|
23
|
+
# discriminant_type has not been found we need to search for the value in namespace's enum constants.
|
24
|
+
# It's a case where union discriminant is a standard type (like `int`):
|
25
|
+
#
|
26
|
+
# enum StellarValueType
|
27
|
+
# {
|
28
|
+
# STELLAR_VALUE_BASIC = 0,
|
29
|
+
# STELLAR_VALUE_SIGNED = 1
|
30
|
+
# };
|
31
|
+
#
|
32
|
+
# union switch (int v)
|
33
|
+
# {
|
34
|
+
# case STELLAR_VALUE_BASIC:
|
35
|
+
# void;
|
36
|
+
# ...
|
37
|
+
found = namespace.find_enum_value(kase.value_s)
|
38
|
+
raise "Case error: #{kase} (#{kase.value_s}) constant not found" if found.nil?
|
39
|
+
else
|
40
|
+
found = discriminant_type.members.find{|m| m.name == kase.value_s}
|
41
|
+
raise "Case error: #{kase} is not a member of #{discriminant_type.name}" if found.nil?
|
42
|
+
end
|
43
|
+
found
|
44
|
+
end
|
45
|
+
|
46
|
+
def nested_definitions
|
47
|
+
arms.
|
48
|
+
map(&:declaration).
|
49
|
+
reject{|d| d.is_a?(Declarations::Void)}.
|
50
|
+
map(&:type).
|
51
|
+
select{|d| d.is_a?(Concerns::NestedDefinition)}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
module Definitions
|
3
|
+
class UnionArm < Base
|
4
|
+
extend Memoist
|
5
|
+
include Concerns::Contained
|
6
|
+
|
7
|
+
delegate :name, to: :declaration
|
8
|
+
delegate :type, to: :declaration
|
9
|
+
|
10
|
+
memoize def union
|
11
|
+
find_ancestors(Union).last
|
12
|
+
end
|
13
|
+
|
14
|
+
def cases
|
15
|
+
cases_n.elements
|
16
|
+
end
|
17
|
+
|
18
|
+
def resolved_case(kase)
|
19
|
+
union.resolved_case kase
|
20
|
+
end
|
21
|
+
|
22
|
+
def resolved_cases
|
23
|
+
enum = union.discriminant_type
|
24
|
+
|
25
|
+
cases.map{|kase| resolved_case kase}
|
26
|
+
end
|
27
|
+
|
28
|
+
def void?
|
29
|
+
declaration.is_a?(Declarations::Void)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
module Definitions
|
3
|
+
class UnionBody < Base
|
4
|
+
extend Memoist
|
5
|
+
|
6
|
+
memoize def arms
|
7
|
+
[
|
8
|
+
normal_arms,
|
9
|
+
default_arm,
|
10
|
+
].flatten.compact
|
11
|
+
end
|
12
|
+
|
13
|
+
def normal_arms
|
14
|
+
arms_n.elements.select{|c| c.is_a?(UnionArm)}
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_arm
|
18
|
+
default_case_n unless default_case_n.terminal?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
module Definitions
|
3
|
+
class UnionDefaultArm < Base
|
4
|
+
extend Memoist
|
5
|
+
include Concerns::Contained
|
6
|
+
|
7
|
+
delegate :name, to: :declaration
|
8
|
+
delegate :type, to: :declaration
|
9
|
+
|
10
|
+
memoize def union
|
11
|
+
find_ancestors(Union).last
|
12
|
+
end
|
13
|
+
|
14
|
+
def void?
|
15
|
+
declaration.is_a?(Declarations::Void)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
class FixedSize < Treetop::Runtime::SyntaxNode
|
3
|
+
def size
|
4
|
+
size_t.text_value
|
5
|
+
end
|
6
|
+
|
7
|
+
def resolved_size
|
8
|
+
return size unless named?
|
9
|
+
|
10
|
+
resolved = root.find_definition(size)
|
11
|
+
|
12
|
+
if resolved.blank?
|
13
|
+
raise "Could not resolve constant: #{size}"
|
14
|
+
end
|
15
|
+
|
16
|
+
resolved.value
|
17
|
+
end
|
18
|
+
|
19
|
+
def named?
|
20
|
+
size_t.is_a?(Xdrgen::AST::Identifier)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Xdrgen::AST::Typespecs
|
2
|
+
module Base
|
3
|
+
include Xdrgen::AST::Concerns::Contained
|
4
|
+
|
5
|
+
def decl
|
6
|
+
find_ancestors(Xdrgen::AST::Declarations::Base).last
|
7
|
+
end
|
8
|
+
|
9
|
+
def sub_type
|
10
|
+
case decl
|
11
|
+
when Xdrgen::AST::Declarations::Optional
|
12
|
+
:optional
|
13
|
+
when Xdrgen::AST::Declarations::Array
|
14
|
+
decl.fixed? ? :array : :var_array
|
15
|
+
else
|
16
|
+
:simple
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def array_size
|
21
|
+
raise "Called array_size on a non-array!" unless decl.is_a?(Xdrgen::AST::Declarations::Array)
|
22
|
+
|
23
|
+
[decl.size_spec.named?, decl.size]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Xdrgen::AST::Typespecs
|
2
|
+
module Simple
|
3
|
+
include Base
|
4
|
+
|
5
|
+
def resolved_type
|
6
|
+
name = self.text_value.split("::").last
|
7
|
+
result = root.find_definition name
|
8
|
+
|
9
|
+
raise Xdrgen::TypeResolutionError, "Cannot resolve type `#{name}`" if result.blank?
|
10
|
+
result
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Xdrgen::AST
|
2
|
+
class VarSize < Treetop::Runtime::SyntaxNode
|
3
|
+
include Concerns::Contained
|
4
|
+
|
5
|
+
def size
|
6
|
+
return nil if size_t.text_value.blank?
|
7
|
+
size_t.text_value
|
8
|
+
end
|
9
|
+
|
10
|
+
def resolved_size
|
11
|
+
return size unless named?
|
12
|
+
|
13
|
+
resolved = root.find_definition(size)
|
14
|
+
|
15
|
+
if resolved.blank?
|
16
|
+
raise "Could not resolve constant: #{size}"
|
17
|
+
end
|
18
|
+
|
19
|
+
resolved.value
|
20
|
+
end
|
21
|
+
|
22
|
+
def named?
|
23
|
+
size_t.is_a?(Xdrgen::AST::Identifier)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/xdrgen/cli.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'slop'
|
2
|
+
|
3
|
+
module Xdrgen
|
4
|
+
module CLI
|
5
|
+
def self.run(args)
|
6
|
+
args = args.dup
|
7
|
+
opts = Slop.parse! args do
|
8
|
+
banner 'Usage: xdrgen -o OUTPUT_DIR INPUT --gen=ruby'
|
9
|
+
on 'o', 'output=', 'The output directory'
|
10
|
+
on 'l', 'language=', 'The output language', default: 'ruby'
|
11
|
+
on 'n', 'namespace=', '"namespace" to generate code within (language-specific)'
|
12
|
+
end
|
13
|
+
|
14
|
+
fail(opts) if args.blank?
|
15
|
+
fail(opts) if opts[:output].blank?
|
16
|
+
|
17
|
+
compilation = Compilation.new(
|
18
|
+
args,
|
19
|
+
output_dir: opts[:output],
|
20
|
+
language: opts[:language].to_sym,
|
21
|
+
namespace: opts[:namespace]
|
22
|
+
)
|
23
|
+
compilation.compile
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.fail(slop, code=1)
|
27
|
+
STDERR.puts slop
|
28
|
+
exit(code)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Xdrgen
|
2
|
+
class Compilation
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
def initialize(source_paths, output_dir:".", language: :ruby, namespace: nil)
|
6
|
+
@source_paths = source_paths
|
7
|
+
@output_dir = output_dir
|
8
|
+
@namespace = namespace
|
9
|
+
@language = language
|
10
|
+
end
|
11
|
+
|
12
|
+
memoize def source
|
13
|
+
@source_paths.map{|p| IO.read(p)}.join("\n")
|
14
|
+
end
|
15
|
+
|
16
|
+
memoize def ast
|
17
|
+
parser = Parser.new
|
18
|
+
parser.parse(source)
|
19
|
+
end
|
20
|
+
|
21
|
+
def compile
|
22
|
+
output = Output.new(@source_paths, @output_dir)
|
23
|
+
|
24
|
+
|
25
|
+
generator = Generators.for_language(@language).new(ast, output, @namespace)
|
26
|
+
generator.generate
|
27
|
+
ensure
|
28
|
+
output.close
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|