text: # Copyright (C) 2013 Google Inc. All rights reserved.
  #
  # Redistribution and use in source and binary forms, with or without
  # modification, are permitted provided that the following conditions are
  # met:
  #
  #     * Redistributions of source code must retain the above copyright
  # notice, this list of conditions and the following disclaimer.
  #     * Redistributions in binary form must reproduce the above
  # copyright notice, this list of conditions and the following disclaimer
  # in the documentation and/or other materials provided with the
  # distribution.
  #     * Neither the name of Google Inc. nor the names of its
  # contributors may be used to endorse or promote products derived from
  # this software without specific prior written permission.
  #
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
  """Functions shared by various parts of the code generator.
  
  Extends IdlType and IdlUnion type with |enum_validation_expression| property.
  
  Design doc: http://www.chromium.org/developers/design-documents/idl-compiler
  """
  
  
  ################################################################################
  # Utility function exposed for Dart CodeGenerator. Only 6 methods are special
  # to Dart the rest delegate to the v8_utilities functions.
  ################################################################################
  
  
  import v8_types  # Required
  import v8_utilities
  
  
  def _scoped_name(interface, definition, base_name):
      # partial interfaces are implemented as separate classes, with their members
      # implemented as static member functions
      partial_interface_implemented_as = definition.extended_attributes.get('PartialInterfaceImplementedAs')
      if partial_interface_implemented_as:
          return '%s::%s' % (partial_interface_implemented_as, base_name)
      if (definition.is_static or
          definition.name in ('Constructor', 'NamedConstructor')):
          return '%s::%s' % (v8_utilities.cpp_name(interface), base_name)
      return 'receiver->%s' % base_name
  
  
  def _bool_to_cpp(tf):
      return "true" if tf else "false"
  
  
  # [CallWith]
  _CALL_WITH_ARGUMENTS = {
      'ScriptState': 'state',
      'ExecutionContext': 'context',
      'ScriptArguments': 'scriptArguments.release()',
      'ActiveWindow': 'DOMDartState::CurrentWindow()',
      'FirstWindow': 'DOMDartState::CurrentWindow()',
      'Document': 'document',
  }
  
  # List because key order matters, as we want arguments in deterministic order
  _CALL_WITH_VALUES = [
      'ScriptState',
      'ExecutionContext',
      'ScriptArguments',
      'ActiveWindow',
      'FirstWindow',
      'Document',
  ]
  
  
  def _call_with_arguments(call_with_values):
      if not call_with_values:
          return []
      return [_CALL_WITH_ARGUMENTS[value]
              for value in _CALL_WITH_VALUES
              if v8_utilities.extended_attribute_value_contains(call_with_values, value)]
  
  
  def _generate_native_entry(interface_name, name, kind, is_static, arity):
  
      if kind == 'Getter':
          suffix = "_Getter"
      elif kind == 'Setter':
          suffix = "_Setter"
      elif kind == 'Constructor':
          name = "constructor"
          suffix = "Callback"
      elif kind == 'Method':
          suffix = "_Callback"
  
      tag = "%s%s" % (name, suffix)
      native_entry = "_".join([interface_name, tag])
  
      argument_names = ['__arg_%d' % i for i in range(0, arity)]
  
      return {'blink_entry': name,
              'argument_names': argument_names,
              'resolver_string': native_entry}
  
  ################################################################################
  # This is the monkey patched methods most delegate to v8_utilities but some are
  # overridden in dart_utilities.
  ################################################################################
  
  
  class dart_utilities_monkey():
      def __init__(self):
          self.base_class_name = 'dart_utilities'
  
  DartUtilities = dart_utilities_monkey()
  
  DartUtilities.bool_to_cpp = _bool_to_cpp
  DartUtilities.call_with_arguments = _call_with_arguments
  DartUtilities.capitalize = v8_utilities.capitalize
  DartUtilities.cpp_name = v8_utilities.cpp_name
  DartUtilities.extended_attribute_value_contains = v8_utilities.extended_attribute_value_contains
  DartUtilities.generate_native_entry = _generate_native_entry
  DartUtilities.has_extended_attribute = v8_utilities.has_extended_attribute
  DartUtilities.has_extended_attribute_value = v8_utilities.has_extended_attribute_value
  DartUtilities.scoped_name = _scoped_name
  DartUtilities.strip_suffix = v8_utilities.strip_suffix
  DartUtilities.uncapitalize = v8_utilities.uncapitalize
  