Index: third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py |
diff --git a/third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py b/third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py |
deleted file mode 100644 |
index 11c52e39ff264d7c8652e60a115d51a0524becad..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py |
+++ /dev/null |
@@ -1,190 +0,0 @@ |
-# Copyright 2016 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. |
- |
-# pylint: disable=import-error,print-statement,relative-import |
- |
-"""Generates Blink Web Module bindings. |
- |
-The Blink Web Module bindings provide a stable, IDL-generated interface for the |
-Web Modules. |
- |
-The Web Modules are the high-level services like Autofill, |
-Autocomplete, Translate, Distiller, Phishing Detector, and others. Web Modules |
-typically want to introspec the document and rendering infromation to implement |
-browser features. |
- |
-The bindings are meant to be as simple and as ephemeral as possible, mostly just |
-wrapping existing DOM classes. Their primary goal is to avoid leaking the actual |
-DOM classes to the Web Modules layer. |
-""" |
- |
-import os |
-import posixpath |
- |
-from code_generator import CodeGeneratorBase, render_template |
-# TODO(dglazkov): Move TypedefResolver to code_generator.py |
-from code_generator_v8 import TypedefResolver |
-from name_style_converter import NameStyleConverter |
- |
-MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py' |
- |
-STRING_INCLUDE_PATH = 'wtf/text/WTFString.h' |
-WEB_MODULE_IDL_ATTRIBUTE = 'WebModuleAPI' |
- |
- |
-def interface_context(idl_interface, type_resolver): |
- builder = InterfaceContextBuilder(MODULE_PYNAME, type_resolver) |
- builder.set_class_name(idl_interface.name) |
- builder.set_inheritance(idl_interface.parent) |
- |
- for idl_attribute in idl_interface.attributes: |
- builder.add_attribute(idl_attribute) |
- |
- for idl_operation in idl_interface.operations: |
- builder.add_operation(idl_operation) |
- |
- return builder.build() |
- |
- |
-class TypeResolver(object): |
- """Resolves Web IDL types into corresponding C++ types and include paths |
- to the generated and existing files.""" |
- |
- def __init__(self, interfaces_info): |
- self.interfaces_info = interfaces_info |
- |
- def includes_from_interface(self, interface_name): |
- interface_info = self.interfaces_info.get(interface_name) |
- if interface_info is None: |
- raise KeyError('Unknown interface "%s".' % interface_name) |
- return set([interface_info['include_path']]) |
- |
- def _includes_from_type(self, idl_type): |
- if idl_type.is_void: |
- return set() |
- if idl_type.is_primitive_type: |
- return set() |
- if idl_type.is_string_type: |
- return set([STRING_INCLUDE_PATH]) |
- |
- # TODO(dglazkov): Handle complex/weird types. |
- return self.includes_from_interface(idl_type.base_type) |
- |
- def includes_from_definition(self, idl_definition): |
- return self._includes_from_type(idl_definition.idl_type) |
- |
- def type_from_definition(self, idl_definition): |
- # TODO(dglazkov): The output of this method must be a reasonable C++ |
- # type that can be used directly in the jinja2 template. |
- return idl_definition.idl_type.base_type |
- |
- def base_class_includes(self): |
- return set(['platform/heap/Handle.h']) |
- |
- |
-class InterfaceContextBuilder(object): |
- def __init__(self, code_generator, type_resolver): |
- self.result = {'code_generator': code_generator} |
- self.type_resolver = type_resolver |
- |
- def set_class_name(self, class_name): |
- converter = NameStyleConverter(class_name) |
- self.result['class_name'] = converter.to_all_cases() |
- self._ensure_set('cpp_includes').update( |
- self.type_resolver.includes_from_interface(class_name)) |
- |
- def set_inheritance(self, base_interface): |
- if base_interface is None: |
- self._ensure_set('header_includes').update( |
- self.type_resolver.base_class_includes()) |
- return |
- self.result['base_class'] = base_interface |
- self._ensure_set('header_includes').update( |
- self.type_resolver.includes_from_interface(base_interface)) |
- |
- def _ensure_set(self, name): |
- return self.result.setdefault(name, set()) |
- |
- def _ensure_list(self, name): |
- return self.result.setdefault(name, []) |
- |
- def add_attribute(self, idl_attribute): |
- self._ensure_list('attributes').append( |
- self.create_attribute(idl_attribute)) |
- self._ensure_set('cpp_includes').update( |
- self.type_resolver.includes_from_definition(idl_attribute)) |
- |
- def add_operation(self, idl_operation): |
- if not idl_operation.name: |
- return |
- self._ensure_list('methods').append( |
- self.create_method(idl_operation)) |
- self._ensure_set('cpp_includes').update( |
- self.type_resolver.includes_from_definition(idl_operation)) |
- |
- def create_method(self, idl_operation): |
- name = idl_operation.name |
- return_type = self.type_resolver.type_from_definition(idl_operation) |
- return { |
- 'name': name, |
- 'return_type': return_type |
- } |
- |
- def create_attribute(self, idl_attribute): |
- name = idl_attribute.name |
- return_type = self.type_resolver.type_from_definition(idl_attribute) |
- return { |
- 'name': name, |
- 'return_type': return_type |
- } |
- |
- def build(self): |
- return self.result |
- |
- |
-class CodeGeneratorWebModule(CodeGeneratorBase): |
- def __init__(self, info_provider, cache_dir, output_dir): |
- CodeGeneratorBase.__init__(self, MODULE_PYNAME, info_provider, |
- cache_dir, output_dir) |
- self.type_resolver = TypeResolver(info_provider.interfaces_info) |
- self.typedef_resolver = TypedefResolver(info_provider) |
- |
- def get_template(self, file_extension): |
- template_filename = 'web_module_interface.%s.tmpl' % file_extension |
- return self.jinja_env.get_template(template_filename) |
- |
- def generate_file(self, template_context, file_extension): |
- template = self.get_template(file_extension) |
- path = posixpath.join( |
- self.output_dir, |
- '%s.%s' % (template_context['class_name']['snake_case'], |
- file_extension)) |
- text = render_template(template, template_context) |
- return (path, text) |
- |
- def generate_interface_code(self, interface): |
- # TODO(dglazkov): Implement callback interfaces. |
- # TODO(dglazkov): Make sure partial interfaces are handled. |
- if interface.is_callback or interface.is_partial: |
- raise ValueError('Partial or callback interfaces are not supported') |
- |
- template_context = interface_context(interface, self.type_resolver) |
- |
- return ( |
- self.generate_file(template_context, 'h'), |
- self.generate_file(template_context, 'cc') |
- ) |
- |
- def generate_code(self, definitions, definition_name): |
- self.typedef_resolver.resolve(definitions, definition_name) |
- |
- # TODO(dglazkov): Implement dictionaries |
- if definition_name not in definitions.interfaces: |
- return None |
- |
- interface = definitions.interfaces[definition_name] |
- if WEB_MODULE_IDL_ATTRIBUTE not in interface.extended_attributes: |
- return None |
- |
- return self.generate_interface_code(interface) |