Commit 99e66d37 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

IDL compiler: Support multi-layered extended attributes

Adds IdlType.effective_annotations, which supports multi-layered
extended attributes.  For example, given the following IDL
fragments,

  typedef [ExtAttr1] long NewLong;
  void f([ExtAttr2] NewLong arg);

arg.idl_type.effective_annotations returns [ExtAttr1, ExtAttr2]
while arg.idl_type.extended_attributes returns [ExtAttr1] only.

c.f. https://crbug.com/1058762

Bug: 839389
Change-Id: I49cdd82dfa0b8c3468610ffce6458eec963d9148
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2096408Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/master@{#749556}
parent 573a3a4c
...@@ -597,9 +597,10 @@ class IdlCompiler(object): ...@@ -597,9 +597,10 @@ class IdlCompiler(object):
idl_def = StubUserDefinedType(ref.identifier) idl_def = StubUserDefinedType(ref.identifier)
if isinstance(idl_def, UserDefinedType): if isinstance(idl_def, UserDefinedType):
idl_type = self._idl_type_factory.definition_type( idl_type = self._idl_type_factory.definition_type(
user_defined_type=idl_def) reference_type=ref, user_defined_type=idl_def)
elif isinstance(idl_def, Typedef): elif isinstance(idl_def, Typedef):
idl_type = self._idl_type_factory.typedef_type(typedef=idl_def) idl_type = self._idl_type_factory.typedef_type(
reference_type=ref, typedef=idl_def)
else: else:
assert False assert False
ref.set_target_object(idl_type) ref.set_target_object(idl_type)
......
...@@ -54,7 +54,7 @@ class IdlTypesTest(unittest.TestCase): ...@@ -54,7 +54,7 @@ class IdlTypesTest(unittest.TestCase):
ext_attrs = ExtendedAttributes([ExtendedAttribute('Clamp')]) ext_attrs = ExtendedAttributes([ExtendedAttribute('Clamp')])
annotated_type = factory.simple_type( annotated_type = factory.simple_type(
'short', extended_attributes=ext_attrs) 'short', extended_attributes=ext_attrs)
self.assertTrue(annotated_type.is_annotated) self.assertTrue(annotated_type.extended_attributes)
self.assertTrue(annotated_type.is_numeric) self.assertTrue(annotated_type.is_numeric)
optional_type = factory.simple_type('DOMString', is_optional=True) optional_type = factory.simple_type('DOMString', is_optional=True)
...@@ -63,7 +63,7 @@ class IdlTypesTest(unittest.TestCase): ...@@ -63,7 +63,7 @@ class IdlTypesTest(unittest.TestCase):
annotated_optional = factory.simple_type( annotated_optional = factory.simple_type(
'long', is_optional=True, extended_attributes=ext_attrs) 'long', is_optional=True, extended_attributes=ext_attrs)
self.assertTrue(annotated_optional.is_annotated) self.assertTrue(annotated_optional.extended_attributes)
self.assertTrue(annotated_optional.is_optional) self.assertTrue(annotated_optional.is_optional)
self.assertTrue(annotated_optional.is_numeric) self.assertTrue(annotated_optional.is_numeric)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment