Index: tools/idl_parser/idl_parser.py |
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py |
index bdd6dc74cd6da14fbc69da4d80ba1a96d52a4831..27b19142908eadacdc5b6e2198c1394a389b2a31 100755 |
--- a/tools/idl_parser/idl_parser.py |
+++ b/tools/idl_parser/idl_parser.py |
@@ -273,6 +273,7 @@ class IDLParser(object): |
def p_InterfaceMember(self, p): |
"""InterfaceMember : Const |
| Operation |
+ | Serializer |
| Stringifier |
| StaticMember |
| Iterable |
@@ -467,7 +468,74 @@ class IDLParser(object): |
p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'), |
self.BuildAttribute('VALUE', val)) |
- # [30-34] NOT IMPLEMENTED (Serializer) |
+ # [30] |
+ def p_Serializer(self, p): |
+ """Serializer : SERIALIZER SerializerRest""" |
+ p[0] = self.BuildProduction('Serializer', p, 1, p[2]) |
+ |
+ # [31] |
+ # TODO(jl): This adds ReturnType and ';', missing from the spec's grammar. |
+ # https://www.w3.org/Bugs/Public/show_bug.cgi?id=20361 |
+ def p_SerializerRest(self, p): |
+ """SerializerRest : ReturnType OperationRest |
+ | '=' SerializationPattern ';' |
+ | ';'""" |
+ if len(p) == 3: |
+ p[2].AddChildren(p[1]) |
+ p[0] = p[2] |
+ elif len(p) == 4: |
+ p[0] = p[2] |
+ |
+ # [32] |
+ def p_SerializationPattern(self, p): |
+ """SerializationPattern : '{' SerializationPatternMap '}' |
+ | '[' SerializationPatternList ']' |
+ | identifier""" |
+ if len(p) > 2: |
+ p[0] = p[2] |
+ else: |
+ p[0] = self.BuildAttribute('ATTRIBUTE', p[1]) |
+ |
+ # [33] |
+ # TODO(jl): This adds the "ATTRIBUTE" and "INHERIT ',' ATTRIBUTE" variants, |
+ # missing from the spec's grammar. |
+ # https://www.w3.org/Bugs/Public/show_bug.cgi?id=20361 |
+ def p_SerializationPatternMap(self, p): |
+ """SerializationPatternMap : GETTER |
+ | ATTRIBUTE |
+ | INHERIT ',' ATTRIBUTE |
+ | INHERIT Identifiers |
+ | identifier Identifiers |
+ |""" |
+ p[0] = self.BuildProduction('Map', p, 0) |
+ if len(p) == 4: |
+ p[0].AddChildren(self.BuildTrue('INHERIT')) |
+ p[0].AddChildren(self.BuildTrue('ATTRIBUTE')) |
+ elif len(p) > 1: |
+ if p[1] == 'getter': |
+ p[0].AddChildren(self.BuildTrue('GETTER')) |
+ elif p[1] == 'attribute': |
+ p[0].AddChildren(self.BuildTrue('ATTRIBUTE')) |
+ else: |
+ if p[1] == 'inherit': |
+ p[0].AddChildren(self.BuildTrue('INHERIT')) |
+ attributes = p[2] |
+ else: |
+ attributes = ListFromConcat(p[1], p[2]) |
+ p[0].AddChildren(self.BuildAttribute('ATTRIBUTES', attributes)) |
+ |
+ # [34] |
+ def p_SerializationPatternList(self, p): |
+ """SerializationPatternList : GETTER |
+ | identifier Identifiers |
+ |""" |
+ p[0] = self.BuildProduction('List', p, 0) |
+ if len(p) > 1: |
+ if p[1] == 'getter': |
+ p[0].AddChildren(self.BuildTrue('GETTER')) |
+ else: |
+ attributes = ListFromConcat(p[1], p[2]) |
+ p[0].AddChildren(self.BuildAttribute('ATTRIBUTES', attributes)) |
# [35] |
def p_Stringifier(self, p): |