Index: tools/json_schema_compiler/js_interface_generator.py |
diff --git a/tools/json_schema_compiler/js_interface_generator.py b/tools/json_schema_compiler/js_interface_generator.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8ea94d48cbab36d464d667792fc44a395040b2d |
--- /dev/null |
+++ b/tools/json_schema_compiler/js_interface_generator.py |
@@ -0,0 +1,102 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+""" |
+Generator that produces an interface file for the Closure Compiler. |
+Note: This is a work in progress, and generated interfaces may require tweaking. |
+""" |
+ |
+from code import Code |
+from js_util import JsUtil |
+from model import * |
+from schema_util import * |
+ |
+import os |
+import sys |
+import re |
+ |
+ASSERT = """ |
+assertNotReached('Interface file for Closure Compiler should not be executed.'); |
+""" |
+ |
+class JsInterfaceGenerator(object): |
+ def Generate(self, namespace): |
+ return _Generator(namespace).Generate() |
+ |
+class _Generator(object): |
+ def __init__(self, namespace): |
+ self._namespace = namespace |
+ first = namespace.name[0].upper() |
+ rest = namespace.name[1:] |
+ self._interface = first + rest |
+ self._js_util = JsUtil() |
+ |
+ def Generate(self): |
+ """Generates a Code object with the schema for the entire namespace. |
+ """ |
+ c = Code() |
+ (c.Append(self._GetHeader(sys.argv[0], self._namespace.name)) |
+ .Append()) |
+ |
+ c.Cblock(self._GenerateInterfaceObject()) |
+ |
+ c.Sblock('%s.prototype = {' % self._interface) |
+ |
+ for function in self._namespace.functions.values(): |
+ c.Cblock(self._GenerateFunction(function)) |
+ |
+ for event in self._namespace.events.values(): |
+ c.Cblock(self._GenerateEvent(event)) |
+ |
+ c.TrimTrailingNewlines() |
+ |
+ c.Eblock('};') |
+ |
+ return c |
+ |
+ def _GetHeader(self, tool, namespace): |
+ """Returns the file header text. |
+ """ |
+ return (self._js_util.GetLicense() + '\n' + |
+ self._js_util.GetInfo(tool) + '\n' + |
+ ('/** @fileoverview Interface for %s that can be overriden. */' % |
+ namespace) + '\n' + |
+ ASSERT); |
+ |
+ def _GenerateInterfaceObject(self): |
+ """Generates the code creating the interface object. |
+ For example: |
+ /** @interface */ |
+ function SettingsPrivate() {} |
+ """ |
+ c = Code() |
+ (c.Append('/** @interface */') |
+ .Append('function %s() {}' % self._interface)) |
+ return c |
+ |
+ def _GenerateFunction(self, function): |
+ """Generates the inteface for a function, including a JSDoc comment. |
+ """ |
+ c = Code() |
+ if function.deprecated: |
+ return c |
+ |
+ (c.Concat(self._js_util.GenerateFunctionJsDoc(self._namespace.name, |
+ function)) |
+ .Append('%s: assertNotReached,' % (function.name))) |
+ |
+ return c |
+ |
+ def _GenerateEvent(self, event): |
+ """Generates the interface for an event. |
+ """ |
+ c = Code() |
+ c.Sblock(line='/**', line_prefix=' * ') |
+ if (event.description): |
+ c.Comment(event.description, comment_prefix='') |
+ c.Append('@type {!ChromeEvent}') |
+ c.Append(self._js_util.GenerateSeeLink(self._namespace.name, 'event', |
+ event.name)) |
+ c.Eblock(' */') |
+ c.Append('%s: new ChromeEvent(),' % (event.name)) |
+ return c |