超漢字アプリケーション開発用のProtocol Buffersコンパイラの開発
Revisão | 1ebc30ebe3f26f858f5b79c3f27dff3bcc418e70 (tree) |
---|---|
Hora | 2015-01-27 00:42:56 |
Autor | ornse01 <ornse01@user...> |
Commiter | ornse01 |
fix generator class structure.
@@ -4,8 +4,29 @@ require 'pathname' | ||
4 | 4 | module Protobuf end |
5 | 5 | |
6 | 6 | class Protobuf::CGenerator |
7 | - def self.field_to_c_type(field) | |
8 | - case field.type | |
7 | + def self.generate_header(msg_list) | |
8 | + msg_list = msg_list.map { |msg| Protobuf::CGenerator::Message.new msg } | |
9 | + script = Pathname("../template.erb").expand_path(__FILE__).read() | |
10 | + | |
11 | + erb = ERB.new(script, nil, '-'); | |
12 | + erb.result(binding) | |
13 | + end | |
14 | + | |
15 | + def self.generate_source | |
16 | + end | |
17 | +end | |
18 | + | |
19 | +class Protobuf::CGenerator::Field | |
20 | + def initialize(field_node) | |
21 | + @field_node = field_node | |
22 | + end | |
23 | + | |
24 | + def name | |
25 | + @field_node.name | |
26 | + end | |
27 | + | |
28 | + def to_c_type | |
29 | + case @field_node.type | |
9 | 30 | when :double |
10 | 31 | "DOUBLE" |
11 | 32 | when :float |
@@ -39,24 +60,32 @@ class Protobuf::CGenerator | ||
39 | 60 | end |
40 | 61 | end |
41 | 62 | |
42 | - def self.field_method_type(field) | |
43 | - if (field.rule == :required)||(field.rule == :optional) | |
44 | - if field.type == :int32 | |
63 | + def field_method_type | |
64 | + if (@field_node.rule == :required)||(@field_node.rule == :optional) | |
65 | + if @field_node.type == :int32 | |
45 | 66 | return :singular_numeric |
46 | - elsif field.type == :string | |
67 | + elsif @field_node.type == :string | |
47 | 68 | return :singular_string |
48 | 69 | end |
49 | - elsif field.rule == :repeated | |
70 | + elsif @field_node.rule == :repeated | |
50 | 71 | end |
51 | 72 | end |
73 | +end | |
52 | 74 | |
53 | - def self.generate_header(msg_list) | |
54 | - script = Pathname("../template.erb").expand_path(__FILE__).read() | |
75 | +class Protobuf::CGenerator::Message | |
76 | + def initialize(msg_node) | |
77 | + @msg_node = msg_node | |
78 | + end | |
55 | 79 | |
56 | - erb = ERB.new(script, nil, '-'); | |
57 | - erb.result(binding) | |
80 | + def name | |
81 | + @msg_node.name | |
58 | 82 | end |
59 | 83 | |
60 | - def self.generate_source | |
84 | + def each_field | |
85 | + return to_enum(__method__) unless block_given? | |
86 | + | |
87 | + @msg_node.each_field { |field| | |
88 | + yield Protobuf::CGenerator::Field.new field | |
89 | + } | |
61 | 90 | end |
62 | 91 | end |
@@ -7,11 +7,11 @@ typedef struct <%= m.name %>_ <%= m.name %>; | ||
7 | 7 | <%- msg_list.each do |m| -%> |
8 | 8 | <%- m.each_field do |f| -%> |
9 | 9 | /* <%= m.name %>.<%= f.name %> */ |
10 | - <%- case field_method_type f -%> | |
10 | + <%- case f.field_method_type -%> | |
11 | 11 | <%- when :singular_numeric -%> |
12 | 12 | Bool <%= m.name %>__has_<%= f.name %>(<%= m.name %> *m); |
13 | -<%= field_to_c_type f %> <%= m.name %>__<%= f.name %>(<%= m.name %> m*) | |
14 | -VOID <%= m.name %>__set_<%= f.name %>(<%= m.name %> *m, <%= field_to_c_type f %> value) | |
13 | +<%= f.to_c_type %> <%= m.name %>__<%= f.name %>(<%= m.name %> m*) | |
14 | +VOID <%= m.name %>__set_<%= f.name %>(<%= m.name %> *m, <%= f.to_c_type %> value) | |
15 | 15 | VOID <%= m.name %>__clear_<%= f.name %>(<%= m.name %> *m) |
16 | 16 | <%- when :singular_string -%> |
17 | 17 | Bool <%= m.name %>__has_<%= f.name %>(<%= m.name %> *m) |