blob: d8ea94d48cbab36d464d667792fc44a395040b2d [file] [log] [blame]
# 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