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

Unified Diff: third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py

Issue 2581373004: [Webmodules]: Start handling types a bit more intelligently. (Closed)
Patch Set: Feedback addressed. Created 4 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 | « no previous file | third_party/WebKit/Source/bindings/scripts/code_generator_web_module_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index 4128751edec696f15543a9e8112c63939a25e1a0..7953d0fc2ad622a50b15d569e46f56c509413ecb 100644
--- a/third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py
+++ b/third_party/WebKit/Source/bindings/scripts/code_generator_web_module.py
@@ -29,10 +29,10 @@ from code_generator_v8 import TypedefResolver
MODULE_PYNAME = os.path.splitext(os.path.basename(__file__))[0] + '.py'
WEB_MODULE_IDL_ATTRIBUTE = 'WebModuleAPI'
-
+STRING_INCLUDE_PATH = 'wtf/text/WTFString.h'
def interface_context(idl_interface):
- builder = InterfaceContextBuilder(MODULE_PYNAME)
+ builder = InterfaceContextBuilder(MODULE_PYNAME, TypeResolver())
builder.set_class_name(idl_interface.name)
builder.set_inheritance(idl_interface.parent)
@@ -45,9 +45,40 @@ def interface_context(idl_interface):
return builder.build()
+class TypeResolver(object):
+ """Resolves Web IDL types into corresponding C++ types and include paths
+ to the generated and existing files."""
+
+ def includes_from_interface(self, base_type):
+ # TODO(dglazkov): Are there any exceptional conditions here?
+ return set([base_type])
+
+ 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.
+ # TODO(dglazkov): Make these proper paths to generated and non-generated
+ # files.
+ return set([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
+
+
class InterfaceContextBuilder(object):
- def __init__(self, code_generator):
+ 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):
self.result['class_name'] = class_name
@@ -57,7 +88,7 @@ class InterfaceContextBuilder(object):
return
self.result['inherits_expression'] = ' : public %s' % base_interface
self._ensure_set('cpp_includes').update(
- self._includes_for_type(base_interface))
+ self.type_resolver.includes_from_interface(base_interface))
def _ensure_set(self, name):
return self.result.setdefault(name, set())
@@ -65,19 +96,11 @@ class InterfaceContextBuilder(object):
def _ensure_list(self, name):
return self.result.setdefault(name, [])
- def _includes_for_type(self, idl_type):
- # TODO(dglazkov): Make this actually work.
- name = idl_type
- return set([name])
-
- def _get_return_type(self, idl_definition):
- return idl_definition.idl_type.preprocessed_type.base_type
-
def add_attribute(self, idl_attribute):
self._ensure_list('attributes').append(
self.create_attribute(idl_attribute))
self._ensure_set('cpp_includes').update(
- self._includes_for_type(self._get_return_type(idl_attribute)))
+ self.type_resolver.includes_from_definition(idl_attribute))
def add_operation(self, idl_operation):
if not idl_operation.name:
@@ -85,11 +108,11 @@ class InterfaceContextBuilder(object):
self._ensure_list('methods').append(
self.create_method(idl_operation))
self._ensure_set('cpp_includes').update(
- self._includes_for_type(self._get_return_type(idl_operation)))
+ self.type_resolver.includes_from_definition(idl_operation))
def create_method(self, idl_operation):
name = idl_operation.name
- return_type = idl_operation.idl_type.preprocessed_type.base_type
+ return_type = self.type_resolver.type_from_definition(idl_operation)
return {
'name': name,
'return_type': return_type
@@ -97,7 +120,7 @@ class InterfaceContextBuilder(object):
def create_attribute(self, idl_attribute):
name = idl_attribute.name
- return_type = idl_attribute.idl_type.preprocessed_type.base_type
+ return_type = self.type_resolver.type_from_definition(idl_attribute)
return {
'name': name,
'return_type': return_type
« no previous file with comments | « no previous file | third_party/WebKit/Source/bindings/scripts/code_generator_web_module_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698