Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Unified Diff: sdk/lib/html/scripts/idlnode.py

Issue 11691009: Moved most of html lib generating scripts into tools. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/html/scripts/htmlrenamer.py ('k') | sdk/lib/html/scripts/idlnode_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/html/scripts/idlnode.py
diff --git a/sdk/lib/html/scripts/idlnode.py b/sdk/lib/html/scripts/idlnode.py
deleted file mode 100755
index 7c488a5ef8ef2a419f1a5f5f17ee266f08744583..0000000000000000000000000000000000000000
--- a/sdk/lib/html/scripts/idlnode.py
+++ /dev/null
@@ -1,524 +0,0 @@
-#!/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.
-
-import os
-import sys
-
-
-class IDLNode(object):
- """Base class for all IDL elements.
- IDLNode may contain various child nodes, and have properties. Examples
- of IDLNode are interfaces, interface members, function arguments,
- etc.
- """
-
- def __init__(self, ast):
- """Initializes an IDLNode from a PegParser AST output."""
- self.id = self._find_first(ast, 'Id') if ast is not None else None
-
- def __repr__(self):
- """Generates string of the form <class id extra extra ... 0x12345678>."""
- extras = self._extra_repr()
- if isinstance(extras, list):
- extras = ' '.join([str(e) for e in extras])
- try:
- if self.id:
- return '<%s %s 0x%x>' % (
- type(self).__name__,
- ('%s %s' % (self.id, extras)).strip(),
- hash(self))
- return '<%s %s 0x%x>' % (
- type(self).__name__,
- extras,
- hash(self))
- except Exception, e:
- return "can't convert to string: %s" % e
-
- def _extra_repr(self):
- """Returns string of extra info for __repr__()."""
- return ''
-
- def __cmp__(self, other):
- """Override default compare operation.
- IDLNodes are equal if all their properties are equal."""
- if other is None or not isinstance(other, IDLNode):
- return 1
- return self.__dict__.__cmp__(other.__dict__)
-
- def reset_id(self, newId):
- """Reset the id of the Node. This is typically done during a normalization
- phase (e.g., "DOMWindow" -> "Window")."""
- self.id = newId
-
- def all(self, type_filter=None):
- """Returns a list containing this node and all it child nodes
- (recursive).
-
- Args:
- type_filter -- can be used to limit the results to a specific
- node type (e.g. IDLOperation).
- """
- res = []
- if type_filter is None or isinstance(self, type_filter):
- res.append(self)
- for v in self._all_subnodes():
- if isinstance(v, IDLNode):
- res.extend(v.all(type_filter))
- elif isinstance(v, list):
- for item in v:
- if isinstance(item, IDLNode):
- res.extend(item.all(type_filter))
- return res
-
- def _all_subnodes(self):
- """Accessor used by all() to find subnodes."""
- return self.__dict__.values()
-
- def to_dict(self):
- """Converts the IDLNode and its children into a dictionary.
- This method is useful mostly for debugging and pretty printing.
- """
- res = {}
- for (k, v) in self.__dict__.items():
- if v == None or v == False or v == [] or v == {}:
- # Skip empty/false members.
- continue
- elif isinstance(v, IDLDictNode) and not len(v):
- # Skip empty dict sub-nodes.
- continue
- elif isinstance(v, list):
- # Convert lists:
- new_v = []
- for sub_node in v:
- if isinstance(sub_node, IDLNode):
- # Convert sub-node:
- new_v.append(sub_node.to_dict())
- else:
- new_v.append(sub_node)
- v = new_v
- elif isinstance(v, IDLNode):
- # Convert sub-node:
- v = v.to_dict()
- res[k] = v
- return res
-
- def _find_all(self, ast, label, max_results=sys.maxint):
- """Searches the AST for tuples with a given label. The PegParser
- output is composed of lists and tuples, where the tuple 1st argument
- is a label. If ast root is a list, will search recursively inside each
- member in the list.
-
- Args:
- ast -- the AST to search.
- label -- the label to look for.
- res -- results are put into this list.
- max_results -- maximum number of results.
- """
- res = []
- if max_results <= 0:
- return res
-
- if isinstance(ast, list):
- for childAst in ast:
- sub_res = self._find_all(childAst, label,
- max_results - len(res))
- res.extend(sub_res)
- elif isinstance(ast, tuple):
- (nodeLabel, value) = ast
- if nodeLabel == label:
- res.append(value)
- return res
-
- def _find_first(self, ast, label):
- """Convenience method for _find_all(..., max_results=1).
- Returns a single element instead of a list, or None if nothing
- is found."""
- res = self._find_all(ast, label, max_results=1)
- if len(res):
- return res[0]
- return None
-
- def _has(self, ast, label):
- """Returns true if an element with the given label is
- in the AST by searching for it."""
- return len(self._find_all(ast, label, max_results=1)) == 1
-
- def _convert_all(self, ast, label, idlnode_ctor):
- """Converts AST elements into IDLNode elements.
- Uses _find_all to find elements with a given label and converts
- them into IDLNodes with a given constructor.
- Returns:
- A list of the converted nodes.
- Args:
- ast -- the ast element to start a search at.
- label -- the element label to look for.
- idlnode_ctor -- a constructor function of one of the IDLNode
- sub-classes.
- """
- res = []
- found = self._find_all(ast, label)
- if not found:
- return res
- if not isinstance(found, list):
- raise RuntimeError("Expected list but %s found" % type(found))
- for childAst in found:
- converted = idlnode_ctor(childAst)
- res.append(converted)
- return res
-
- def _convert_first(self, ast, label, idlnode_ctor):
- """Like _convert_all, but only converts the first found results."""
- childAst = self._find_first(ast, label)
- if not childAst:
- return None
- return idlnode_ctor(childAst)
-
- def _convert_ext_attrs(self, ast):
- """Helper method for uniform conversion of extended attributes."""
- self.ext_attrs = IDLExtAttrs(ast)
-
- def _convert_annotations(self, ast):
- """Helper method for uniform conversion of annotations."""
- self.annotations = IDLAnnotations(ast)
-
-
-class IDLDictNode(IDLNode):
- """Base class for dictionary-like IDL nodes such as extended attributes
- and annotations. The base class implements various dict interfaces."""
-
- def __init__(self, ast):
- IDLNode.__init__(self, None)
- if ast is not None and isinstance(ast, dict):
- self.__map = ast
- else:
- self.__map = {}
-
- def __len__(self):
- return len(self.__map)
-
- def __getitem__(self, key):
- return self.__map[key]
-
- def __setitem__(self, key, value):
- self.__map[key] = value
-
- def __delitem__(self, key):
- del self.__map[key]
-
- def __contains__(self, key):
- return key in self.__map
-
- def __iter__(self):
- return self.__map.__iter__()
-
- def get(self, key, default=None):
- return self.__map.get(key, default)
-
- def items(self):
- return self.__map.items()
-
- def keys(self):
- return self.__map.keys()
-
- def values(self):
- return self.__map.values()
-
- def clear(self):
- self.__map = {}
-
- def to_dict(self):
- """Overrides the default IDLNode.to_dict behavior.
- The IDLDictNode members are copied into a new dictionary, and
- IDLNode members are recursively converted into dicts as well.
- """
- res = {}
- for (k, v) in self.__map.items():
- if isinstance(v, IDLNode):
- v = v.to_dict()
- res[k] = v
- return res
-
- def _all_subnodes(self):
- # Usually an IDLDictNode does not contain further IDLNodes.
- return []
-
-
-class IDLFile(IDLNode):
- """IDLFile is the top-level node in each IDL file. It may contain interfaces."""
-
- def __init__(self, ast, filename=None):
- IDLNode.__init__(self, ast)
- self.filename = filename
- self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
- modules = self._convert_all(ast, 'Module', IDLModule)
- self.implementsStatements = self._convert_all(ast, 'ImplStmt',
- IDLImplementsStatement)
- for module in modules:
- self.interfaces.extend(module.interfaces)
- self.implementsStatements.extend(module.implementsStatements)
-
-
-class IDLModule(IDLNode):
- """IDLModule has an id, and may contain interfaces, type defs and
- implements statements."""
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self._convert_ext_attrs(ast)
- self._convert_annotations(ast)
- self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
- self.typeDefs = self._convert_all(ast, 'TypeDef', IDLTypeDef)
- self.implementsStatements = self._convert_all(ast, 'ImplStmt',
- IDLImplementsStatement)
-
-
-class IDLExtAttrs(IDLDictNode):
- """IDLExtAttrs is an IDLDictNode that stores IDL Extended Attributes.
- Modules, interfaces, members and arguments can all own IDLExtAttrs."""
- def __init__(self, ast=None):
- IDLDictNode.__init__(self, None)
- if not ast:
- return
- ext_attrs_ast = self._find_first(ast, 'ExtAttrs')
- if not ext_attrs_ast:
- return
- for ext_attr in self._find_all(ext_attrs_ast, 'ExtAttr'):
- name = self._find_first(ext_attr, 'Id')
- value = self._find_first(ext_attr, 'ExtAttrValue')
-
- func_value = self._find_first(value, 'ExtAttrFunctionValue')
- if func_value:
- # E.g. NamedConstructor=Audio(in [Optional] DOMString src)
- self[name] = IDLExtAttrFunctionValue(
- func_value,
- self._find_first(func_value, 'ExtAttrArgList'))
- continue
-
- ctor_args = not value and self._find_first(ext_attr, 'ExtAttrArgList')
- if ctor_args:
- # E.g. Constructor(Element host)
- self[name] = IDLExtAttrFunctionValue(None, ctor_args)
- continue
-
- self[name] = value
-
- def _all_subnodes(self):
- # Extended attributes may contain IDLNodes, e.g. IDLExtAttrFunctionValue
- return self.values()
-
-
-class IDLExtAttrFunctionValue(IDLNode):
- """IDLExtAttrFunctionValue."""
- def __init__(self, func_value_ast, arg_list_ast):
- IDLNode.__init__(self, func_value_ast)
- self.arguments = self._convert_all(arg_list_ast, 'Argument', IDLArgument)
-
-
-class IDLType(IDLNode):
- """IDLType is used to describe constants, attributes and operations'
- return and input types. IDLType matches AST labels such as ScopedName,
- StringType, VoidType, IntegerType, etc."""
-
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- # Search for a 'ScopedName' or any label ending with 'Type'.
- if isinstance(ast, list):
- self.id = self._find_first(ast, 'ScopedName')
- if not self.id:
- # FIXME: use regexp search instead
- def findType(ast):
- for label, childAst in ast:
- if label.endswith('Type'):
- type = self._label_to_type(label, ast)
- if type != 'sequence':
- return type
- type_ast = self._find_first(childAst, 'Type')
- if not type_ast:
- return type
- return 'sequence<%s>' % findType(type_ast)
- raise Exception('No type declaration found in %s' % ast)
- self.id = findType(ast)
- array_modifiers = self._find_first(ast, 'ArrayModifiers')
- if array_modifiers:
- self.id += array_modifiers
- elif isinstance(ast, tuple):
- (label, value) = ast
- if label == 'ScopedName':
- self.id = value
- else:
- self.id = self._label_to_type(label, ast)
- elif isinstance(ast, str):
- self.id = ast
- if not self.id:
- raise SyntaxError('Could not parse type %s' % (ast))
-
- def _label_to_type(self, label, ast):
- if label == 'LongLongType':
- label = 'long long'
- elif label.endswith('Type'):
- # Omit 'Type' suffix and lowercase the rest.
- label = '%s%s' % (label[0].lower(), label[1:-4])
-
- # Add unsigned qualifier.
- if self._has(ast, 'Unsigned'):
- label = 'unsigned %s' % label
- return label
-
-
-class IDLTypeDef(IDLNode):
- """IDLNode for 'typedef [type] [id]' declarations."""
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self._convert_annotations(ast)
- self.type = self._convert_first(ast, 'Type', IDLType)
-
-
-class IDLInterface(IDLNode):
- """IDLInterface node contains operations, attributes, constants,
- as well as parent references."""
-
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self._convert_ext_attrs(ast)
- self._convert_annotations(ast)
- self.parents = self._convert_all(ast, 'ParentInterface',
- IDLParentInterface)
- javascript_interface_name = self.ext_attrs.get('InterfaceName', self.id)
- self.javascript_binding_name = javascript_interface_name
- self.doc_js_name = javascript_interface_name
- self.operations = self._convert_all(ast, 'Operation',
- lambda ast: IDLOperation(ast, self.doc_js_name))
- self.attributes = self._convert_all(ast, 'Attribute',
- lambda ast: IDLAttribute(ast, self.doc_js_name))
- self.constants = self._convert_all(ast, 'Const',
- lambda ast: IDLConstant(ast, self.doc_js_name))
- self.is_supplemental = 'Supplemental' in self.ext_attrs
- self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs
- self.is_fc_suppressed = 'Suppressed' in self.ext_attrs
-
- def reset_id(self, new_id):
- """Reset the id of the Interface and corresponding the JS names."""
- if self.id != new_id:
- self.id = new_id
- self.doc_js_name = new_id
- self.javascript_binding_name = new_id
- for member in self.operations:
- member.doc_js_interface_name = new_id
- for member in self.attributes:
- member.doc_js_interface_name = new_id
- for member in self.constants:
- member.doc_js_interface_name = new_id
-
- def has_attribute(self, candidate):
- for attribute in self.attributes:
- if (attribute.id == candidate.id and
- attribute.is_read_only == candidate.is_read_only):
- return True
- return False
-
-
-class IDLParentInterface(IDLNode):
- """This IDLNode specialization is for 'Interface Child : Parent {}'
- declarations."""
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self._convert_annotations(ast)
- self.type = self._convert_first(ast, 'InterfaceType', IDLType)
-
-
-class IDLMember(IDLNode):
- """A base class for constants, attributes and operations."""
-
- def __init__(self, ast, doc_js_interface_name):
- IDLNode.__init__(self, ast)
- self.type = self._convert_first(ast, 'Type', IDLType)
- self._convert_ext_attrs(ast)
- self._convert_annotations(ast)
- self.doc_js_interface_name = doc_js_interface_name
- self.is_fc_suppressed = 'Suppressed' in self.ext_attrs
- self.is_static = self._has(ast, 'Static')
-
-
-class IDLOperation(IDLMember):
- """IDLNode specialization for 'type name(args)' declarations."""
- def __init__(self, ast, doc_js_interface_name):
- IDLMember.__init__(self, ast, doc_js_interface_name)
- self.type = self._convert_first(ast, 'ReturnType', IDLType)
- self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
- self.raises = self._convert_first(ast, 'Raises', IDLType)
- self.specials = self._find_all(ast, 'Special')
- self.is_stringifier = self._has(ast, 'Stringifier')
- def _extra_repr(self):
- return [self.arguments]
-
-
-class IDLAttribute(IDLMember):
- """IDLNode specialization for 'attribute type name' declarations."""
- def __init__(self, ast, doc_js_interface_name):
- IDLMember.__init__(self, ast, doc_js_interface_name)
- self.is_read_only = self._has(ast, 'ReadOnly')
- # There are various ways to define exceptions for attributes:
- self.raises = self._convert_first(ast, 'Raises', IDLType)
- self.get_raises = self.raises \
- or self._convert_first(ast, 'GetRaises', IDLType)
- self.set_raises = self.raises \
- or self._convert_first(ast, 'SetRaises', IDLType)
- def _extra_repr(self):
- extra = []
- if self.is_read_only: extra.append('readonly')
- if self.raises: extra.append('raises')
- return extra
-
-class IDLConstant(IDLMember):
- """IDLNode specialization for 'const type name = value' declarations."""
- def __init__(self, ast, doc_js_interface_name):
- IDLMember.__init__(self, ast, doc_js_interface_name)
- self.value = self._find_first(ast, 'ConstExpr')
-
-
-class IDLArgument(IDLNode):
- """IDLNode specialization for operation arguments."""
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self.type = self._convert_first(ast, 'Type', IDLType)
- self._convert_ext_attrs(ast)
-
- def __repr__(self):
- return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id)
-
-
-class IDLImplementsStatement(IDLNode):
- """IDLNode specialization for 'X implements Y' declarations."""
- def __init__(self, ast):
- IDLNode.__init__(self, ast)
- self.implementor = self._convert_first(ast, 'ImplStmtImplementor',
- IDLType)
- self.implemented = self._convert_first(ast, 'ImplStmtImplemented',
- IDLType)
-
-
-class IDLAnnotations(IDLDictNode):
- """IDLDictNode specialization for a list of FremontCut annotations."""
- def __init__(self, ast=None):
- IDLDictNode.__init__(self, ast)
- self.id = None
- if not ast:
- return
- for annotation in self._find_all(ast, 'Annotation'):
- name = self._find_first(annotation, 'Id')
- value = IDLAnnotation(annotation)
- self[name] = value
-
-
-class IDLAnnotation(IDLDictNode):
- """IDLDictNode specialization for one annotation."""
- def __init__(self, ast=None):
- IDLDictNode.__init__(self, ast)
- self.id = None
- if not ast:
- return
- for arg in self._find_all(ast, 'AnnotationArg'):
- name = self._find_first(arg, 'Id')
- value = self._find_first(arg, 'AnnotationArgValue')
- self[name] = value
« no previous file with comments | « sdk/lib/html/scripts/htmlrenamer.py ('k') | sdk/lib/html/scripts/idlnode_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698