Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 from model import PropertyType | 5 from model import PropertyType |
| 6 import code | 6 import code |
| 7 import cpp_util | 7 import cpp_util |
| 8 import model | 8 import model |
| 9 import os | 9 import os |
| 10 | 10 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 58 ) | 58 ) |
| 59 | 59 |
| 60 c.Concat(self._cpp_type_generator.GetNamespaceStart()) | 60 c.Concat(self._cpp_type_generator.GetNamespaceStart()) |
| 61 c.Append() | 61 c.Append() |
| 62 if self._namespace.types: | 62 if self._namespace.types: |
| 63 (c.Append('//') | 63 (c.Append('//') |
| 64 .Append('// Types') | 64 .Append('// Types') |
| 65 .Append('//') | 65 .Append('//') |
| 66 .Append() | 66 .Append() |
| 67 ) | 67 ) |
| 68 for type_ in self._namespace.types.values(): | 68 for type_ in self._FieldDependencyOrder(): |
| 69 (c.Concat(self._GenerateType(type_)) | 69 (c.Concat(self._GenerateType(type_)) |
| 70 .Append() | 70 .Append() |
| 71 ) | 71 ) |
| 72 if self._namespace.functions: | 72 if self._namespace.functions: |
| 73 (c.Append('//') | 73 (c.Append('//') |
| 74 .Append('// Functions') | 74 .Append('// Functions') |
| 75 .Append('//') | 75 .Append('//') |
| 76 .Append() | 76 .Append() |
| 77 ) | 77 ) |
| 78 for function in self._namespace.functions.values(): | 78 for function in self._namespace.functions.values(): |
| 79 (c.Concat(self._GenerateFunction(function)) | 79 (c.Concat(self._GenerateFunction(function)) |
| 80 .Append() | 80 .Append() |
| 81 ) | 81 ) |
| 82 (c.Concat(self._cpp_type_generator.GetNamespaceEnd()) | 82 (c.Concat(self._cpp_type_generator.GetNamespaceEnd()) |
| 83 .Concat(self._cpp_type_generator.GetRootNamespaceEnd()) | 83 .Concat(self._cpp_type_generator.GetRootNamespaceEnd()) |
| 84 .Append() | 84 .Append() |
| 85 .Append('#endif // %s' % ifndef_name) | 85 .Append('#endif // %s' % ifndef_name) |
| 86 .Append() | 86 .Append() |
| 87 ) | 87 ) |
| 88 return c | 88 return c |
| 89 | 89 |
| 90 def _FieldDependencyOrder(self): | |
| 91 """Generates the list of types in the current namespace in an order in which | |
| 92 depended-upon types appear before types which depend on them. | |
| 93 """ | |
| 94 dependency_order = [] | |
| 95 | |
| 96 def ExpandType(path, type_): | |
| 97 if type_ in path: | |
| 98 raise NotImplementedError("Circular dependencies of non-optional " + | |
|
asargent_no_longer_on_chrome
2012/03/26 17:40:35
As discussed in person, I'm inclined to simply dis
| |
| 99 "properties not implemented. Path: " + ", ".join(map( | |
| 100 lambda x: x.name, path)) + ", referencing: " + type_.name) | |
| 101 for prop in type_.properties.values(): | |
| 102 if not prop.optional and prop.type_ == PropertyType.REF: | |
| 103 ExpandType(path + [type_], self._namespace.types[prop.ref_type]) | |
| 104 if not type_ in dependency_order: | |
| 105 dependency_order.append(type_) | |
| 106 | |
| 107 for type_ in self._namespace.types.values(): | |
| 108 ExpandType([], type_) | |
| 109 return dependency_order | |
| 110 | |
| 90 def _GenerateEnumDeclaration(self, enum_name, prop, values): | 111 def _GenerateEnumDeclaration(self, enum_name, prop, values): |
| 91 """Generate the declaration of a C++ enum for the given property and | 112 """Generate the declaration of a C++ enum for the given property and |
| 92 values. | 113 values. |
| 93 """ | 114 """ |
| 94 c = code.Code() | 115 c = code.Code() |
| 95 c.Sblock('enum %s {' % enum_name) | 116 c.Sblock('enum %s {' % enum_name) |
| 96 if prop.optional: | 117 if prop.optional: |
| 97 c.Append(self._cpp_type_generator.GetEnumNoneValue(prop) + ',') | 118 c.Append(self._cpp_type_generator.GetEnumNoneValue(prop) + ',') |
| 98 for value in values: | 119 for value in values: |
| 99 c.Append(self._cpp_type_generator.GetEnumValue(prop, value) + ',') | 120 c.Append(self._cpp_type_generator.GetEnumValue(prop, value) + ',') |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 c.Comment(param.description) | 278 c.Comment(param.description) |
| 258 if param.type_ == PropertyType.ANY: | 279 if param.type_ == PropertyType.ANY: |
| 259 c.Comment("Value* Result::Create(Value*) not generated " | 280 c.Comment("Value* Result::Create(Value*) not generated " |
| 260 "because it's redundant.") | 281 "because it's redundant.") |
| 261 continue | 282 continue |
| 262 c.Append('Value* Create(const %s);' % cpp_util.GetParameterDeclaration( | 283 c.Append('Value* Create(const %s);' % cpp_util.GetParameterDeclaration( |
| 263 param, self._cpp_type_generator.GetType(param))) | 284 param, self._cpp_type_generator.GetType(param))) |
| 264 c.Eblock('};') | 285 c.Eblock('};') |
| 265 | 286 |
| 266 return c | 287 return c |
| OLD | NEW |