55f81f2210
- Add `.style.yapf` with configuration to use Google style. - Run `yapf` on all `.py` files in this repo. - Manually fix one trailing space in a doc string. - Run `git cl format runtime` to satisfy presubmit. Change-Id: I7e6bd11e91f07926b9188362599af398551eed79 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/111600 Commit-Queue: Nate Bosch <nbosch@google.com> Reviewed-by: Alexander Thomas <athom@google.com>
193 lines
6.1 KiB
Python
Executable File
193 lines
6.1 KiB
Python
Executable File
#!/usr/bin/python
|
|
# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
from idlnode import *
|
|
|
|
|
|
def render(idl_node, indent_str=' '):
|
|
output = []
|
|
indent_stack = []
|
|
|
|
def begin_indent():
|
|
indent_stack.append(indent_str)
|
|
|
|
def end_indent():
|
|
indent_stack.pop()
|
|
|
|
def sort(nodes):
|
|
return sorted(nodes, key=lambda node: node.id)
|
|
|
|
def wln(node=None):
|
|
"""Writes the given node and adds a new line."""
|
|
w(node)
|
|
output.append('\n')
|
|
|
|
def wsp(node):
|
|
"""Writes the given node and adds a space if there was output."""
|
|
mark = len(output)
|
|
w(node)
|
|
if mark != len(output):
|
|
w(' ')
|
|
|
|
def w(node, list_separator=None):
|
|
"""Writes the given node.
|
|
|
|
Args:
|
|
node -- a string, IDLNode instance or a list of such.
|
|
list_separator -- if provided, and node is a list,
|
|
list_separator will be written between the list items.
|
|
"""
|
|
if node is None:
|
|
return
|
|
elif isinstance(node, str):
|
|
if output and output[-1].endswith('\n'):
|
|
# Auto-indent.
|
|
output.extend(indent_stack)
|
|
output.append(node)
|
|
elif isinstance(node, list):
|
|
for i in range(0, len(node)):
|
|
if i > 0:
|
|
w(list_separator)
|
|
w(node[i])
|
|
elif isinstance(node, IDLFile):
|
|
w(node.interfaces)
|
|
w(node.enums)
|
|
w(node.typeDefs)
|
|
elif isinstance(node, IDLModule):
|
|
wsp(node.annotations)
|
|
wsp(node.ext_attrs)
|
|
wln('module %s {' % node.id)
|
|
begin_indent()
|
|
w(node.interfaces)
|
|
w(node.enums)
|
|
w(node.typeDefs)
|
|
end_indent()
|
|
wln('};')
|
|
elif isinstance(node, IDLEnum):
|
|
w('enum %s {}' % node.id)
|
|
# TODO(antonm): emit values as well.
|
|
elif isinstance(node, IDLInterface):
|
|
if node.annotations:
|
|
wln(node.annotations)
|
|
if node.ext_attrs:
|
|
wln(node.ext_attrs)
|
|
w('interface %s' % node.id)
|
|
begin_indent()
|
|
begin_indent()
|
|
if node.parents:
|
|
wln(' :')
|
|
w(node.parents, ',\n')
|
|
wln(' {')
|
|
end_indent()
|
|
if node.constants:
|
|
wln()
|
|
wln('/* Constants */')
|
|
w(sort(node.constants))
|
|
if node.attributes:
|
|
wln()
|
|
wln('/* Attributes */')
|
|
w(sort(node.attributes))
|
|
if node.operations:
|
|
wln()
|
|
wln('/* Operations */')
|
|
w(sort(node.operations))
|
|
end_indent()
|
|
wln('};')
|
|
elif isinstance(node, IDLParentInterface):
|
|
wsp(node.annotations)
|
|
w(node.type.id)
|
|
elif isinstance(node, IDLAnnotations):
|
|
sep = ''
|
|
for (name, annotation) in sorted(node.items()):
|
|
w(sep)
|
|
sep = ' '
|
|
if annotation and len(annotation):
|
|
subRes = []
|
|
for (argName, argValue) in sorted(annotation.items()):
|
|
if argValue is None:
|
|
subRes.append(argName)
|
|
else:
|
|
subRes.append('%s=%s' % (argName, argValue))
|
|
w('@%s(%s)' % (name, ', '.join(subRes)))
|
|
else:
|
|
w('@%s' % name)
|
|
elif isinstance(node, IDLExtAttrs):
|
|
if len(node):
|
|
w('[')
|
|
i = 0
|
|
for k in sorted(node):
|
|
if i > 0:
|
|
w(', ')
|
|
w(k)
|
|
v = node[k]
|
|
if v is not None:
|
|
if isinstance(v, IDLExtAttrFunctionValue):
|
|
if v.id:
|
|
w('=')
|
|
w(v)
|
|
elif isinstance(v, list):
|
|
assert k == 'Constructor'
|
|
w(v[0])
|
|
for c in v[1:]:
|
|
w(', ')
|
|
w(k)
|
|
w(c)
|
|
else:
|
|
w('=%s' % v.__str__())
|
|
i += 1
|
|
w(']')
|
|
elif isinstance(node, IDLExtAttrFunctionValue):
|
|
if node.id:
|
|
w(node.id)
|
|
w('(')
|
|
w(node.arguments, ', ')
|
|
w(')')
|
|
elif isinstance(node, IDLAttribute):
|
|
wsp(node.annotations)
|
|
wsp(node.ext_attrs)
|
|
if node.is_read_only:
|
|
w('readonly ')
|
|
w('attribute ')
|
|
w(node.type.id)
|
|
if (node.type.nullable):
|
|
w('?')
|
|
w(' ')
|
|
w(node.id)
|
|
wln(';')
|
|
elif isinstance(node, IDLConstant):
|
|
wsp(node.annotations)
|
|
wsp(node.ext_attrs)
|
|
wln('const %s %s = %s;' % (node.type.id, node.id, node.value))
|
|
elif isinstance(node, IDLOperation):
|
|
wsp(node.annotations)
|
|
wsp(node.ext_attrs)
|
|
if node.is_static:
|
|
w('static ')
|
|
if node.specials:
|
|
w(node.specials, ' ')
|
|
w(' ')
|
|
w(node.type.id)
|
|
if (node.type.nullable):
|
|
w('?')
|
|
w(' ')
|
|
w(node.id)
|
|
w('(')
|
|
w(node.arguments, ', ')
|
|
w(')')
|
|
wln(';')
|
|
elif isinstance(node, IDLArgument):
|
|
wsp(node.ext_attrs)
|
|
if (node.optional):
|
|
w('optional ')
|
|
w(node.type.id)
|
|
if node.type.nullable:
|
|
w('?')
|
|
w(' %s' % node.id)
|
|
else:
|
|
raise TypeError("Expected str or IDLNode but %s found" % type(node))
|
|
|
|
w(idl_node)
|
|
return ''.join(output)
|