OLD | NEW |
---|---|
(Empty) | |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 """ | |
5 Generator that produces an interface file for the Closure Compiler. | |
6 Note: This is a work in progress, and generated externs may require tweaking. | |
7 """ | |
8 | |
9 from code import Code | |
10 from js_util import JsUtil | |
11 from model import * | |
12 from schema_util import * | |
13 | |
14 import os | |
15 import sys | |
16 from datetime import datetime | |
17 import re | |
18 | |
19 LICENSE = ("""// Copyright %s The Chromium Authors. All rights reserved. | |
Devlin
2015/12/04 17:44:23
Might almost be worth defining this as a constant
stevenjb
2015/12/04 18:24:07
Done.
| |
20 // Use of this source code is governed by a BSD-style license that can be | |
21 // found in the LICENSE file. | |
22 """ % datetime.now().year) | |
23 | |
24 INFO = """// This file was generated by: | |
25 // %s. | |
26 """ | |
27 | |
28 class JsInterfaceGenerator(object): | |
29 def Generate(self, namespace): | |
30 return _Generator(namespace).Generate() | |
31 | |
32 def GetHeader(tool, namespace): | |
33 """Returns the file header text. | |
34 """ | |
35 return (LICENSE + '\n' + (INFO % tool) + '\n' + | |
36 ('/** @fileoverview Interface for %s that can be overriden. */' % | |
37 namespace)) | |
38 GetHeader = staticmethod(GetHeader) | |
39 | |
40 class _Generator(object): | |
41 def __init__(self, namespace): | |
42 self._namespace = namespace | |
43 first = namespace.name[0].upper() | |
44 rest = namespace.name[1:] | |
45 self._interface = first + rest | |
46 self._js_util = JsUtil() | |
47 | |
48 def Generate(self): | |
49 """Generates a Code object with the schema for the entire namespace. | |
50 """ | |
51 c = Code() | |
52 (c.Append(JsInterfaceGenerator.GetHeader(sys.argv[0], | |
53 self._namespace.name)) | |
54 .Append()) | |
55 | |
56 c.Cblock(self._GenerateInterfaceObject()) | |
57 | |
58 c.Sblock('%s.prototype = {' % self._interface) | |
59 | |
60 for function in self._namespace.functions.values(): | |
61 c.Cblock(self._GenerateFunction(function)) | |
62 | |
63 for event in self._namespace.events.values(): | |
64 c.Cblock(self._GenerateEvent(event)) | |
65 | |
Devlin
2015/12/04 17:44:23
What about enums?
stevenjb
2015/12/04 18:24:07
We don't need them in the interface, they are alre
Devlin
2015/12/04 18:28:59
Well, the enums are exposed as JS objects on the A
| |
66 c.TrimTrailingNewlines() | |
67 | |
68 c.Eblock('};') | |
69 | |
70 return c | |
71 | |
72 def _GenerateInterfaceObject(self): | |
73 """Generates the code creating the interface object. | |
74 For example: | |
75 /** @interface */ | |
76 function SettingsPrivate() {} | |
77 """ | |
78 c = Code() | |
79 (c.Append('/** @interface */') | |
80 .Append('function %s() {}' % self._interface)) | |
81 return c | |
82 | |
83 def _GenerateFunction(self, function): | |
84 """Generates the inteface for a function, including a JSDoc comment. | |
85 """ | |
86 c = Code() | |
87 if function.deprecated: | |
88 return c | |
89 | |
90 (c.Concat(self._js_util.GenerateFunctionJsDoc(self._namespace.name, | |
91 function)) | |
92 .Append('%s: assertNotReached,' % (function.name))) | |
Devlin
2015/12/04 17:44:23
Do we want asssertNotReached over just function()
stevenjb
2015/12/04 18:24:07
asssertNotReached is what michael used in the exis
| |
93 | |
94 return c | |
95 | |
96 def _GenerateEvent(self, event): | |
97 """Generates the interface for an event. | |
98 """ | |
99 c = Code() | |
100 c.Sblock(line='/**', line_prefix=' * ') | |
101 if (event.description): | |
102 c.Comment(event.description, comment_prefix='') | |
103 c.Append('@type {!ChromeEvent}') | |
104 c.Append(self._js_util.GenerateSeeLink(self._namespace.name, 'event', | |
105 event.name)) | |
106 c.Eblock(' */') | |
107 c.Append('%s: new ChromeEvent(),' % (event.name)) | |
108 return c | |
OLD | NEW |