Skip to content

Commit 91502f6

Browse files
committed
Update widlparser. Fixes #864.
1 parent f3ec253 commit 91502f6

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

bikeshed/widlparser/test.py

+4
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@ def testDifference(input, output):
152152
typedef (short or Foo) maybeFoo;
153153
typedef sequence<(short or Foo)> maybeFoos;
154154
typedef FrozenArray<(short or Foo)> frozenMaybeFoos;
155+
typedef record<DOMString, Foo[]>? recordFoo;
156+
typedef record<DOMString, (short or Foo)>? recordMaybeFoo;
157+
typedef record<USVString, any> recordAny;
158+
typedef record<any, any> recordBroken;
155159
interface foo {
156160
[one] attribute Foo one;
157161
[two] Foo two()bar;

bikeshed/widlparser/widlparser/productions.py

+35-3
Original file line numberDiff line numberDiff line change
@@ -529,13 +529,15 @@ class NonAnyType(Production): # PrimitiveType [TypeSuffix] | "ByteString" [Typ
529529
# "USVString" TypeSuffix |
530530
# identifier [TypeSuffix] | "sequence" "<" Type ">" [Null] | "object" [TypeSuffix] |
531531
# "Date" [TypeSuffix] | "RegExp" [TypeSuffix] | "Error" TypeSuffix |
532-
# "DOMException" TypeSuffix | "Promise" "<" ReturnType ">" [Null] | BufferRelatedType [Nulls]
533-
# "FrozenArray" "<" Type ">" [Null]
532+
# "DOMException" TypeSuffix | "Promise" "<" ReturnType ">" [Null] | BufferRelatedType [Nulls] |
533+
# "FrozenArray" "<" Type ">" [Null] | "record" "<" StringType "," Type ">"
534534

535535
BufferRelatedTypes = frozenset(['ArrayBuffer', 'DataView', 'Int8Array', 'Int16Array', 'Int32Array',
536536
'Uint8Array', 'Uint16Array', 'Uint32Array', 'Uint8ClampedArray',
537537
'Float32Array', 'Float64Array'])
538538

539+
StringTypes = frozenset(['ByteString', 'DOMString', 'USVString'])
540+
539541
@classmethod
540542
def peek(cls, tokens):
541543
if (PrimitiveType.peek(tokens)):
@@ -560,12 +562,21 @@ def peek(cls, tokens):
560562
elif (token and token.isSymbol(cls.BufferRelatedTypes)):
561563
Symbol.peek(tokens, '?')
562564
return tokens.popPosition(True)
565+
elif (token and token.isSymbol('record')):
566+
if (Symbol.peek(tokens, '<')):
567+
if (Symbol.peek(tokens, cls.StringTypes)):
568+
if (Symbol.peek(tokens, ',')):
569+
if (Type.peek(tokens)):
570+
if (Symbol.peek(tokens, '>')):
571+
Symbol.peek(tokens, '?')
572+
return tokens.popPosition(True)
563573
return tokens.popPosition(False)
564574

565575
def __init__(self, tokens):
566576
Production.__init__(self, tokens)
567577
self.sequence = None
568578
self.promise = None
579+
self.record = None
569580
self._openType = None
570581
self._closeType = None
571582
self.null = False
@@ -595,6 +606,14 @@ def __init__(self, tokens):
595606
elif (token.isSymbol(self.BufferRelatedTypes)):
596607
self.type = Symbol(tokens, None, False)
597608
self.null = Symbol(tokens, '?', False) if (Symbol.peek(tokens, '?')) else None
609+
elif (token.isSymbol('record')):
610+
self.record = Symbol(tokens)
611+
self._openType = Symbol(tokens, '<')
612+
self.keyType = Symbol(tokens)
613+
self._comma = Symbol(tokens, ',')
614+
self.type = Type(tokens)
615+
self._closeType = Symbol(tokens, '>', False)
616+
self.null = Symbol(tokens, '?', False) if (Symbol.peek(tokens, '?')) else None
598617
else:
599618
self.type = Symbol(tokens, None, False) # "ByteString" | "DOMString" | "USVString" | "object" | "Date" | "RegExp"
600619
self.suffix = TypeSuffix(tokens) if (TypeSuffix.peek(tokens)) else None
@@ -607,6 +626,10 @@ def _unicode(self):
607626
if (self.promise):
608627
output = unicode(self.promise) + unicode(self._openType) + unicode(self.type) + unicode(self._closeType)
609628
return output + (unicode(self.null) if (self.null) else '')
629+
if (self.record):
630+
output = unicode(self.record) + unicode(self._openType) + unicode(self.keyType) + unicode(self._comma) + unicode(self.type) + unicode(self._closeType)
631+
return output + (unicode(self.null) if (self.null) else '')
632+
610633
output = unicode(self.type)
611634
output = output + (unicode(self.null) if (self.null) else '')
612635
return output + (unicode(self.suffix) if (self.suffix) else '')
@@ -626,6 +649,15 @@ def _markup(self, generator):
626649
generator.addText(self._closeType)
627650
generator.addText(self.null)
628651
return self
652+
if (self.record):
653+
self.record.markup(generator)
654+
generator.addText(self._openType)
655+
self.keyType.markup(generator)
656+
generator.addText(self._comma)
657+
self.type.markup(generator)
658+
generator.addText(self._closeType)
659+
generator.addText(self.null)
660+
return self
629661
if (isinstance(self.type, basestring)):
630662
generator.addTypeName(self.type)
631663
if (self.suffix):
@@ -638,7 +670,7 @@ def _markup(self, generator):
638670
return self
639671

640672
def __repr__(self):
641-
output = '[NonAnyType: ' + ('[sequence] ' if (self.sequence) else '') + ('[Promise] ' if (self.promise) else '')
673+
output = '[NonAnyType: ' + ('[sequence] ' if (self.sequence) else '') + ('[Promise] ' if (self.promise) else '') + ('[record] [StringType: ' + repr(self.keyType) + '] ' if (self.record) else '')
642674
output += repr(self.type) + ('[null]' if (self.null) else '')
643675
return output + (repr(self.suffix) if (self.suffix) else '') + ']'
644676

bikeshed/widlparser/widlparser/tokenizer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class Tokenizer(object):
5656
'Date', 'deleter', 'dictionary', 'DOMString', 'double', 'enum', 'Error', 'exception', 'false', 'float',
5757
'Float32Array', 'Float64Array', 'FrozenArray', 'getter', 'implements', 'Infinity', '-Infinity', 'inherit', 'Int8Array',
5858
'Int16Array', 'Int32Array', 'interface', 'iterable', 'legacycaller', 'legacyiterable', 'long', 'maplike',
59-
'namespace', 'NaN', 'null', 'object', 'octet', 'optional', 'or', 'partial', 'Promise', 'readonly', 'RegExp', 'required',
59+
'namespace', 'NaN', 'null', 'object', 'octet', 'optional', 'or', 'partial', 'Promise', 'readonly', 'record', 'RegExp', 'required',
6060
'sequence', 'serializer', 'setlike', 'setter', 'short', 'static', 'stringifier', 'true', 'typedef',
6161
'Uint8Array', 'Uint16Array', 'Uint32Array', 'Uint8ClampedArray', 'unrestricted', 'unsigned', 'USVString',
6262
'void'))

0 commit comments

Comments
 (0)