OLD | NEW |
| (Empty) |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 """Generate template contexts of dictionaries for both v8 bindings and | |
6 implementation classes that are used by blink's core/modules. | |
7 """ | |
8 | |
9 import operator | |
10 from v8_globals import includes | |
11 import dart_types | |
12 from dart_utilities import DartUtilities | |
13 | |
14 | |
15 DICTIONARY_H_INCLUDES = frozenset([ | |
16 'bindings/core/v8/V8Binding.h', | |
17 'platform/heap/Handle.h', | |
18 ]) | |
19 | |
20 DICTIONARY_CPP_INCLUDES = frozenset([ | |
21 'bindings/common/ExceptionState.h', | |
22 # FIXME: Remove this, http://crbug.com/321462 | |
23 'bindings/core/v8/Dictionary.h', | |
24 ]) | |
25 | |
26 | |
27 def setter_name_for_dictionary_member(member): | |
28 return 'set%s' % DartUtilities.capitalize(member.name) | |
29 | |
30 | |
31 def has_method_name_for_dictionary_member(member): | |
32 return 'has%s' % DartUtilities.capitalize(member.name) | |
33 | |
34 | |
35 def unwrap_nullable_if_needed(idl_type): | |
36 if idl_type.is_nullable: | |
37 return idl_type.inner_type | |
38 return idl_type | |
39 | |
40 | |
41 # Context for Dart bindings | |
42 | |
43 def dictionary_context(dictionary): | |
44 includes.clear() | |
45 includes.update(DICTIONARY_CPP_INCLUDES) | |
46 return { | |
47 'cpp_class': DartUtilities.cpp_name(dictionary), | |
48 'header_includes': set(DICTIONARY_H_INCLUDES), | |
49 'members': [member_context(member) | |
50 for member in sorted(dictionary.members, | |
51 key=operator.attrgetter('name'))], | |
52 'dart_class': dart_types.dart_type(dictionary.name), | |
53 | |
54 } | |
55 | |
56 | |
57 def member_context(member): | |
58 idl_type = member.idl_type | |
59 idl_type.add_includes_for_type() | |
60 idl_type = unwrap_nullable_if_needed(idl_type) | |
61 | |
62 def default_values(): | |
63 if not member.default_value: | |
64 return None, None | |
65 if member.default_value.is_null: | |
66 return None, 'v8::Null(isolate)' | |
67 cpp_default_value = str(member.default_value) | |
68 v8_default_value = idl_type.cpp_value_to_v8_value( | |
69 cpp_value=cpp_default_value, isolate='isolate', | |
70 creation_context='creationContext') | |
71 return cpp_default_value, v8_default_value | |
72 | |
73 cpp_default_value, dart_default_value = default_values() | |
74 | |
75 dart_enum_expression = idl_type.enum_validation_expression | |
76 if dart_enum_expression: | |
77 dart_enum_expression = dart_enum_expression.format(param_name='string') | |
78 | |
79 return { | |
80 'cpp_default_value': cpp_default_value, | |
81 'cpp_type': idl_type.cpp_type, | |
82 'cpp_value_to_dart_value': idl_type.cpp_value_to_dart_value( | |
83 cpp_value='impl->%s()' % member.name, | |
84 creation_context='creationContext', | |
85 extended_attributes=member.extended_attributes), | |
86 'enum_validation_expression': dart_enum_expression, | |
87 'has_method_name': has_method_name_for_dictionary_member(member), | |
88 'is_object': idl_type.name == 'Object', | |
89 'name': member.name, | |
90 'setter_name': setter_name_for_dictionary_member(member), | |
91 'dart_default_value': dart_default_value, | |
92 } | |
93 | |
94 | |
95 # Context for implementation classes | |
96 | |
97 def dictionary_impl_context(dictionary, interfaces_info): | |
98 includes.clear() | |
99 header_includes = set(['platform/heap/Handle.h']) | |
100 return { | |
101 'header_includes': header_includes, | |
102 'cpp_class': DartUtilities.cpp_name(dictionary), | |
103 'members': [member_impl_context(member, interfaces_info, | |
104 header_includes) | |
105 for member in dictionary.members], | |
106 } | |
107 | |
108 | |
109 def member_impl_context(member, interfaces_info, header_includes): | |
110 idl_type = unwrap_nullable_if_needed(member.idl_type) | |
111 is_object = idl_type.name == 'Object' | |
112 | |
113 def getter_expression(): | |
114 if idl_type.impl_should_use_nullable_container: | |
115 return 'm_%s.get()' % member.name | |
116 return 'm_%s' % member.name | |
117 | |
118 def has_method_expression(): | |
119 if idl_type.impl_should_use_nullable_container or idl_type.is_enum or id
l_type.is_string_type: | |
120 return '!m_%s.isNull()' % member.name | |
121 elif is_object: | |
122 return '!(m_{0}.isEmpty() || m_{0}.isNull() || m_{0}.isUndefined())'
.format(member.name) | |
123 else: | |
124 return 'm_%s' % member.name | |
125 | |
126 def member_cpp_type(): | |
127 member_cpp_type = idl_type.cpp_type_args(used_in_cpp_sequence=True) | |
128 if idl_type.impl_should_use_nullable_container: | |
129 return dart_types.cpp_template_type('Nullable', member_cpp_type) | |
130 return member_cpp_type | |
131 | |
132 cpp_default_value = None | |
133 if member.default_value and not member.default_value.is_null: | |
134 cpp_default_value = str(member.default_value) | |
135 | |
136 header_includes.update(idl_type.impl_includes_for_type(interfaces_info)) | |
137 return { | |
138 'cpp_default_value': cpp_default_value, | |
139 'getter_expression': getter_expression(), | |
140 'has_method_expression': has_method_expression(), | |
141 'has_method_name': has_method_name_for_dictionary_member(member), | |
142 'is_object': is_object, | |
143 'is_traceable': (idl_type.is_garbage_collected or | |
144 idl_type.is_will_be_garbage_collected), | |
145 'member_cpp_type': member_cpp_type(), | |
146 'name': member.name, | |
147 'rvalue_cpp_type': idl_type.cpp_type_args(used_as_rvalue_type=True), | |
148 'setter_name': setter_name_for_dictionary_member(member), | |
149 } | |
OLD | NEW |