OLD | NEW |
---|---|
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Generates java source files from a mojom.Module.""" | 5 """Generates java source files from a mojom.Module.""" |
6 | 6 |
7 import argparse | 7 import argparse |
8 import os | 8 import os |
9 import re | 9 import re |
10 | 10 |
11 import mojom.generate.generator as generator | 11 import mojom.generate.generator as generator |
12 import mojom.generate.module as mojom | 12 import mojom.generate.module as mojom |
13 import mojom.generate.pack as pack | |
rmcilroy
2014/06/05 11:01:17
nit - remove unneeded import.
qsr
2014/06/05 11:46:11
Done.
| |
13 from mojom.generate.template_expander import UseJinja | 14 from mojom.generate.template_expander import UseJinja |
14 | 15 |
15 | 16 |
16 GENERATOR_PREFIX = 'java' | 17 GENERATOR_PREFIX = 'java' |
17 | 18 |
18 _spec_to_java_type = { | 19 _spec_to_java_type = { |
19 'b': 'boolean', | 20 'b': 'boolean', |
20 'd': 'double', | 21 'd': 'double', |
21 'f': 'float', | 22 'f': 'float', |
22 'h:d:c': 'org.chromium.mojo.system.DataPipe.ConsumerHandle', | 23 'h:d:c': 'org.chromium.mojo.system.DataPipe.ConsumerHandle', |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
55 uccc = UpperCamelCase(name) | 56 uccc = UpperCamelCase(name) |
56 return uccc[0].lower() + uccc[1:] | 57 return uccc[0].lower() + uccc[1:] |
57 | 58 |
58 def ConstantStyle(name): | 59 def ConstantStyle(name): |
59 components = NameToComponent(name) | 60 components = NameToComponent(name) |
60 if components[0] == 'k': | 61 if components[0] == 'k': |
61 components = components[1:] | 62 components = components[1:] |
62 return '_'.join([x.upper() for x in components]) | 63 return '_'.join([x.upper() for x in components]) |
63 | 64 |
64 def GetNameForElement(element): | 65 def GetNameForElement(element): |
65 if (isinstance(element, mojom.Enum) or | 66 if isinstance(element, (mojom.Enum, |
66 isinstance(element, mojom.Interface) or | 67 mojom.Interface, |
67 isinstance(element, mojom.Struct)): | 68 mojom.Struct)): |
68 return UpperCamelCase(element.name) | 69 return UpperCamelCase(element.name) |
69 if (isinstance(element, mojom.Method) or | 70 if isinstance(element, mojom.InterfaceRequest): |
70 isinstance(element, mojom.Parameter) or | 71 return GetNameForElement(element.kind) |
71 isinstance(element, mojom.Field)): | 72 if isinstance(element, (mojom.Method, |
73 mojom.Parameter, | |
74 mojom.Field)): | |
72 return CamelCase(element.name) | 75 return CamelCase(element.name) |
73 if isinstance(element, mojom.EnumValue): | 76 if isinstance(element, mojom.EnumValue): |
74 return (UpperCamelCase(element.enum_name) + '.' + | 77 return (UpperCamelCase(element.enum_name) + '.' + |
75 ConstantStyle(element.name)) | 78 ConstantStyle(element.name)) |
76 if (isinstance(element, mojom.NamedValue) or | 79 if isinstance(element, (mojom.NamedValue, |
77 isinstance(element, mojom.Constant)): | 80 mojom.Constant)): |
78 return ConstantStyle(element.name) | 81 return ConstantStyle(element.name) |
79 raise Exception("Unexpected element: " % element) | 82 raise Exception("Unexpected element: " % element) |
80 | 83 |
81 def ParseStringAttribute(attribute): | 84 def ParseStringAttribute(attribute): |
82 if isinstance(attribute, basestring): | 85 if isinstance(attribute, basestring): |
83 return attribute | 86 return attribute |
84 assert attribute[0] == 'EXPRESSION' | 87 assert attribute[0] == 'EXPRESSION' |
85 assert len(attribute[1]) == 1 | 88 assert len(attribute[1]) == 1 |
86 return attribute[1][0][1:-1].encode('string_escape') | 89 return attribute[1][0][1:-1].encode('string_escape') |
87 | 90 |
88 def GetPackage(module): | 91 def GetPackage(module): |
89 if 'JavaPackage' in module.attributes: | 92 if 'JavaPackage' in module.attributes: |
90 return ParseStringAttribute(module.attributes['JavaPackage']) | 93 return ParseStringAttribute(module.attributes['JavaPackage']) |
91 # Default package. | 94 # Default package. |
92 return "org.chromium.mojom." + module.namespace | 95 return "org.chromium.mojom." + module.namespace |
93 | 96 |
97 def GetSuperClass(method): | |
98 return "org.chromium.mojo.bindings.Struct" | |
99 | |
94 def GetNameForKind(kind): | 100 def GetNameForKind(kind): |
95 def _GetNameHierachy(kind): | 101 def _GetNameHierachy(kind): |
96 hierachy = [] | 102 hierachy = [] |
97 if kind.parent_kind: | 103 if kind.parent_kind: |
98 hierachy = _GetNameHierachy(kind.parent_kind) | 104 hierachy = _GetNameHierachy(kind.parent_kind) |
99 hierachy.append(kind.name) | 105 hierachy.append(GetNameForElement(kind)) |
100 return hierachy | 106 return hierachy |
101 | 107 |
102 elements = [GetPackage(kind.module)] | 108 elements = [GetPackage(kind.module)] |
103 elements += _GetNameHierachy(kind) | 109 elements += _GetNameHierachy(kind) |
104 return '.'.join(elements) | 110 return '.'.join(elements) |
105 | 111 |
106 def GetJavaType(kind): | 112 def GetJavaType(kind): |
107 if isinstance(kind, (mojom.Struct, mojom.Interface)): | 113 if isinstance(kind, (mojom.Struct, mojom.Interface)): |
108 return GetNameForKind(kind) | 114 return GetNameForKind(kind) |
115 if isinstance(kind, mojom.InterfaceRequest): | |
116 return GetNameForKind(kind.kind) | |
109 if isinstance(kind, mojom.Array): | 117 if isinstance(kind, mojom.Array): |
110 return "%s[]" % GetJavaType(kind.kind) | 118 return "%s[]" % GetJavaType(kind.kind) |
111 if isinstance(kind, mojom.Enum): | 119 if isinstance(kind, mojom.Enum): |
112 return "int" | 120 return "int" |
113 return _spec_to_java_type[kind.spec] | 121 return _spec_to_java_type[kind.spec] |
114 | 122 |
123 def IsHandle(kind): | |
124 return kind.spec[0] == 'h' | |
125 | |
115 def TranslateConstants(token, module): | 126 def TranslateConstants(token, module): |
116 def _TranslateNamedValue(named_value): | 127 def _TranslateNamedValue(named_value): |
117 entity_name = GetNameForElement(named_value) | 128 entity_name = GetNameForElement(named_value) |
118 if named_value.parent_kind: | 129 if named_value.parent_kind: |
119 return GetJavaType(named_value.parent_kind) + '.' + entity_name | 130 return GetJavaType(named_value.parent_kind) + '.' + entity_name |
120 # Handle the case where named_value is a module level constant: | 131 # Handle the case where named_value is a module level constant: |
121 if not isinstance(named_value, mojom.EnumValue): | 132 if not isinstance(named_value, mojom.EnumValue): |
122 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' + | 133 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' + |
123 entity_name) | 134 entity_name) |
124 return GetPackage(named_value.module) + '.' + entity_name | 135 return GetPackage(named_value.module) + '.' + entity_name |
(...skipping 16 matching lines...) Expand all Loading... | |
141 return ParseStringAttribute(module.attributes['JavaConstantsClassName']) | 152 return ParseStringAttribute(module.attributes['JavaConstantsClassName']) |
142 # This constructs the name of the embedding classes for module level constants | 153 # This constructs the name of the embedding classes for module level constants |
143 # by extracting the mojom's filename and prepending it to Constants. | 154 # by extracting the mojom's filename and prepending it to Constants. |
144 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) + | 155 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) + |
145 'Constants') | 156 'Constants') |
146 | 157 |
147 class Generator(generator.Generator): | 158 class Generator(generator.Generator): |
148 | 159 |
149 java_filters = { | 160 java_filters = { |
150 "expression_to_text": ExpressionToText, | 161 "expression_to_text": ExpressionToText, |
162 "is_handle": IsHandle, | |
151 "java_type": GetJavaType, | 163 "java_type": GetJavaType, |
152 "name": GetNameForElement, | 164 "name": GetNameForElement, |
165 "super_class": GetSuperClass, | |
153 "verify_token_type": generator.VerifyTokenType, | 166 "verify_token_type": generator.VerifyTokenType, |
154 } | 167 } |
155 | 168 |
156 def GetJinjaExports(self): | 169 def GetJinjaExports(self): |
157 return { | 170 return { |
158 "module": self.module, | 171 "module": self.module, |
159 "package": GetPackage(self.module), | 172 "package": GetPackage(self.module), |
160 } | 173 } |
161 | 174 |
175 @UseJinja("java_templates/enum.java.tmpl", filters=java_filters, | |
176 lstrip_blocks=True, trim_blocks=True) | |
177 def GenerateEnumSource(self, enum): | |
178 exports = self.GetJinjaExports() | |
179 exports.update({"enum": enum}) | |
180 return exports | |
181 | |
182 @UseJinja("java_templates/struct.java.tmpl", filters=java_filters, | |
183 lstrip_blocks=True, trim_blocks=True) | |
184 def GenerateStructSource(self, struct): | |
185 exports = self.GetJinjaExports() | |
186 exports.update({"struct": struct}) | |
187 return exports | |
188 | |
162 @UseJinja("java_templates/constants.java.tmpl", filters=java_filters, | 189 @UseJinja("java_templates/constants.java.tmpl", filters=java_filters, |
163 lstrip_blocks=True, trim_blocks=True) | 190 lstrip_blocks=True, trim_blocks=True) |
164 def GenerateConstantsSource(self, module): | 191 def GenerateConstantsSource(self, module): |
165 exports = self.GetJinjaExports() | 192 exports = self.GetJinjaExports() |
166 exports.update({"main_entity": GetConstantsMainEntityName(module), | 193 exports.update({"main_entity": GetConstantsMainEntityName(module), |
167 "constants": module.constants}) | 194 "constants": module.constants}) |
168 return exports | 195 return exports |
169 | 196 |
170 def GenerateFiles(self, unparsed_args): | 197 def GenerateFiles(self, unparsed_args): |
171 parser = argparse.ArgumentParser() | 198 parser = argparse.ArgumentParser() |
172 parser.add_argument("--java_output_directory", dest="java_output_directory") | 199 parser.add_argument("--java_output_directory", dest="java_output_directory") |
173 args = parser.parse_args(unparsed_args) | 200 args = parser.parse_args(unparsed_args) |
174 if self.output_dir and args.java_output_directory: | 201 if self.output_dir and args.java_output_directory: |
175 self.output_dir = os.path.join(args.java_output_directory, | 202 self.output_dir = os.path.join(args.java_output_directory, |
176 GetPackage(self.module).replace('.', '/')) | 203 GetPackage(self.module).replace('.', '/')) |
177 if not os.path.exists(self.output_dir): | 204 if not os.path.exists(self.output_dir): |
178 try: | 205 try: |
179 os.makedirs(self.output_dir) | 206 os.makedirs(self.output_dir) |
180 except: | 207 except: |
181 # Ignore errors on directory creation. | 208 # Ignore errors on directory creation. |
182 pass | 209 pass |
183 | 210 |
211 for enum in self.module.enums: | |
212 self.Write(self.GenerateEnumSource(enum), | |
213 "%s.java" % GetNameForElement(enum)) | |
214 | |
215 for struct in self.module.structs: | |
216 self.Write(self.GenerateStructSource(struct), | |
217 "%s.java" % GetNameForElement(struct)) | |
218 | |
184 if self.module.constants: | 219 if self.module.constants: |
185 self.Write(self.GenerateConstantsSource(self.module), | 220 self.Write(self.GenerateConstantsSource(self.module), |
186 "%s.java" % GetConstantsMainEntityName(self.module)) | 221 "%s.java" % GetConstantsMainEntityName(self.module)) |
OLD | NEW |