| Index: client/dom/scripts/generator.py
|
| diff --git a/client/dom/scripts/generator.py b/client/dom/scripts/generator.py
|
| index 6239fc89f8c8e422717e99b494aa12ab378cb571..971a91042e15771b69fb06e9203260c9d221c957 100644
|
| --- a/client/dom/scripts/generator.py
|
| +++ b/client/dom/scripts/generator.py
|
| @@ -225,15 +225,9 @@ def MatchSourceFilter(filter, thing):
|
| else:
|
| return any(token in thing.annotations for token in filter)
|
|
|
| -def AnalyzeOperation(interface, operations):
|
| - """Makes operation calling convention decision for a set of overloads.
|
| -
|
| - Returns: An OperationInfo object.
|
| - """
|
| -
|
| - # Zip together arguments from each overload by position, then convert
|
| - # to a dart argument.
|
|
|
| +# Given a list of overloaded arguments, render a dart argument.
|
| +def _DartArg(args, interface):
|
| # Given a list of overloaded arguments, choose a suitable name.
|
| def OverloadedName(args):
|
| return '_OR_'.join(sorted(set(arg.id for arg in args)))
|
| @@ -246,18 +240,25 @@ def AnalyzeOperation(interface, operations):
|
| else:
|
| return TypeName(typeIds, interface)
|
|
|
| - # Given a list of overloaded arguments, render a dart argument.
|
| - def DartArg(args):
|
| - filtered = filter(None, args)
|
| - optional = any(not arg or arg.is_optional for arg in args)
|
| - type = OverloadedType(filtered)
|
| - name = OverloadedName(filtered)
|
| - if optional:
|
| - return (name, type, 'null')
|
| - else:
|
| - return (name, type, None)
|
| + filtered = filter(None, args)
|
| + optional = any(not arg or arg.is_optional for arg in args)
|
| + type = OverloadedType(filtered)
|
| + name = OverloadedName(filtered)
|
| + if optional:
|
| + return (name, type, 'null')
|
| + else:
|
| + return (name, type, None)
|
| +
|
| +
|
| +def AnalyzeOperation(interface, operations):
|
| + """Makes operation calling convention decision for a set of overloads.
|
|
|
| - args = map(lambda *args: DartArg(args),
|
| + Returns: An OperationInfo object.
|
| + """
|
| +
|
| + # Zip together arguments from each overload by position, then convert
|
| + # to a dart argument.
|
| + args = map(lambda *args: _DartArg(args, interface),
|
| *(op.arguments for op in operations))
|
|
|
| info = OperationInfo()
|
| @@ -269,6 +270,41 @@ def AnalyzeOperation(interface, operations):
|
| info.arg_infos = args
|
| return info
|
|
|
| +
|
| +def AnalyzeConstructor(interface):
|
| + """Returns an OperationInfo object for the constructor.
|
| +
|
| + Returns None if the interface has no Constructor.
|
| + """
|
| + def GetArgs(func_value):
|
| + return map(lambda arg: _DartArg([arg], interface), func_value.arguments)
|
| +
|
| + if 'Constructor' in interface.ext_attrs:
|
| + name = None
|
| + func_value = interface.ext_attrs.get('Constructor')
|
| + if func_value:
|
| + # [Constructor(param,...)]
|
| + args = GetArgs(func_value)
|
| + else: # [Constructor]
|
| + args = []
|
| + else:
|
| + func_value = interface.ext_attrs.get('NamedConstructor')
|
| + if func_value:
|
| + name = func_value.id
|
| + args = GetArgs(func_value)
|
| + else:
|
| + return None
|
| +
|
| + info = OperationInfo()
|
| + info.overloads = None # [func_value]
|
| + info.declared_name = name
|
| + info.name = name
|
| + info.js_name = name
|
| + info.type_name = interface.id
|
| + info.arg_infos = args
|
| + return info
|
| +
|
| +
|
| def RecognizeCallback(interface):
|
| """Returns the info for the callback method if the interface smells like a
|
| callback.
|
| @@ -295,6 +331,7 @@ def FindMatchingAttribute(interface, attr1):
|
| return matches[0]
|
| return None
|
|
|
| +
|
| class OperationInfo(object):
|
| """Holder for various derived information from a set of overloaded operations.
|
|
|
|
|