Chromium Code Reviews| Index: tools/json_schema_compiler/js_externs_generator.py |
| diff --git a/tools/json_schema_compiler/js_externs_generator.py b/tools/json_schema_compiler/js_externs_generator.py |
| index 52a1d255d32c60f99e85c17ec9fcb44a904e1b57..828f09a7cbb34dadf1e37062d681952bc6f30b7d 100644 |
| --- a/tools/json_schema_compiler/js_externs_generator.py |
| +++ b/tools/json_schema_compiler/js_externs_generator.py |
| @@ -38,11 +38,11 @@ class _Generator(object): |
| self._namespace.name) |
| .Append()) |
| + c.Cblock(self._GenerateNamespaceObject()) |
| + |
| for js_type in self._namespace.types.values(): |
| c.Cblock(self._GenerateType(js_type)) |
| - c.Cblock(self._GenerateNamespaceObject()) |
| - |
| for function in self._namespace.functions.values(): |
| c.Cblock(self._GenerateFunction(function)) |
| @@ -53,22 +53,30 @@ class _Generator(object): |
| def _GenerateType(self, js_type): |
| """Given a Type object, returns the Code for this type's definition. |
| - |
| """ |
| c = Code() |
| - |
| - # Since enums are just treated as strings for now, don't generate their |
| - # type. |
| if js_type.property_type is PropertyType.ENUM: |
| - return c |
| - |
| - c.Concat(self._GenerateTypeJsDoc(js_type)) |
| + c.Concat(self._GenerateEnumJsDoc(js_type)) |
| + else: |
| + c.Concat(self._GenerateTypeJsDoc(js_type)) |
| - var = 'var ' + js_type.simple_name |
| - if self._IsTypeConstructor(js_type): var += ' = function()' |
| - var += ';' |
| - c.Append(var) |
| + return c |
| + def _GenerateEnumJsDoc(self, js_type): |
| + """ Given an Enum Type object, returns the Code for the enum's definition. |
| + """ |
| + c = Code() |
| + c.Append('/**').Append(' * @enum {string}').Append(' */') |
| + c.Append('chrome.%s.%s = {' % (self._namespace.name, js_type.name)) |
| + value_lines = [] |
| + for value in [v.name for v in js_type.enum_values]: |
| + value_lines.append(" %s: '%s'," % (value, value)) |
|
Tyler Breisacher (Chromium)
2015/03/24 20:07:52
It seems a bit strange to have a list comp and the
Devlin
2015/03/24 20:31:55
Done.
|
| + # Remove last trailing comma. |
| + # TODO(devlin): This will be unneeded, if when |
|
Tyler Breisacher (Chromium)
2015/03/24 20:07:52
Actually I think you can drop line 77 now, because
Devlin
2015/03/24 20:31:55
Done.
|
| + # https://github.com/google/closure-compiler/issues/796 is fixed. |
| + value_lines[-1] = value_lines[-1][:-1] |
| + c.Append('\n'.join(value_lines)) |
| + c.Append('};') |
| return c |
| def _IsTypeConstructor(self, js_type): |
| @@ -90,12 +98,19 @@ class _Generator(object): |
| for line in js_type.description.splitlines(): |
| c.Comment(line, comment_prefix = ' * ') |
| - if self._IsTypeConstructor(js_type): |
| + is_constructor = self._IsTypeConstructor(js_type) |
| + if is_constructor: |
| c.Comment('@constructor', comment_prefix = ' * ') |
| else: |
| c.Concat(self._GenerateTypedef(js_type.properties)) |
| c.Append(' */') |
| + |
| + var = 'var ' + js_type.simple_name |
| + if is_constructor: var += ' = function()' |
|
Tyler Breisacher (Chromium)
2015/03/24 20:07:52
I think you need the body too:
if is_constructor:
Devlin
2015/03/24 20:31:55
I would have thought so, too, but figured maybe th
|
| + var += ';' |
| + c.Append(var) |
| + |
| return c |
| def _GenerateTypedef(self, properties): |
| @@ -173,7 +188,12 @@ class _Generator(object): |
| elif js_type.property_type is PropertyType.ARRAY: |
| return 'Array' |
| elif js_type.property_type is PropertyType.REF: |
| - return js_type.ref_type |
| + ref_type = js_type.ref_type |
| + # Enums are defined as chrome.fooAPI.MyEnum, but types are defined simply |
| + # as MyType. |
| + if self._namespace.types[ref_type].property_type is PropertyType.ENUM: |
| + ref_type = 'chrome.%s.%s' % (self._namespace.name, ref_type) |
| + return ref_type |
| elif js_type.property_type.is_fundamental: |
| return js_type.property_type.name |
| else: |