| Index: Source/bindings/scripts/IDLParser.pm
|
| diff --git a/Source/bindings/scripts/IDLParser.pm b/Source/bindings/scripts/IDLParser.pm
|
| index 177f3e919b1d9c2be73f0bd92942f328ad1bf95c..0ce3573502330a24bc29325bfda33531547812ad 100644
|
| --- a/Source/bindings/scripts/IDLParser.pm
|
| +++ b/Source/bindings/scripts/IDLParser.pm
|
| @@ -64,7 +64,7 @@ struct( domFunction => {
|
|
|
| # Used to represent domInterface contents (name of attribute, signature)
|
| struct( domAttribute => {
|
| - type => '$', # Attribute type (including namespace)
|
| + type => '$', # Attribute type (including namespace) (string or UnionTypeWithSuffix)
|
| isStatic => '$',
|
| isReadOnly => '$',
|
| signature => '$', # Attribute signature
|
| @@ -75,7 +75,7 @@ struct( domAttribute => {
|
| # Used to represent a map of 'variable name' <-> 'variable type'
|
| struct( domSignature => {
|
| name => '$', # Variable name
|
| - type => '$', # Variable type
|
| + type => '$', # Variable type (string or UnionTypeWithSuffix)
|
| specials => '@', # Specials
|
| extendedAttributes => '$', # Extended attributes
|
| isOptional => '$', # Is variable optional (optional T)
|
| @@ -107,6 +107,20 @@ struct( Typedef => {
|
| type => '$', # Type of data
|
| });
|
|
|
| +struct( UnionTypeWithSuffix => {
|
| + unionType => '$', # UnionType
|
| + suffix => '$', # suffix
|
| +});
|
| +
|
| +struct( UnionType => {
|
| + unionMemberTypes => '@', # UnionMemberType[]
|
| +});
|
| +
|
| +struct( UnionMemberType => {
|
| + unionTypeWithSuffix => '$', # UnionTypeWithSuffix
|
| + singleType => '$', # NonAnyType | "any" "[" "]" TypeSuffix
|
| +});
|
| +
|
| # Maps 'typedef name' -> Typedef
|
| my %typedefs = ();
|
|
|
| @@ -1751,9 +1765,10 @@ sub parseType
|
| my $self = shift;
|
| my $next = $self->nextToken();
|
| if ($next->value() eq "(") {
|
| - $self->parseUnionType();
|
| - $self->parseTypeSuffix();
|
| - return;
|
| + my $unionTypeWithSuffix = UnionTypeWithSuffix->new();
|
| + $unionTypeWithSuffix->unionType($self->parseUnionType());
|
| + $unionTypeWithSuffix->suffix($self->parseTypeSuffix());
|
| + return $unionTypeWithSuffix;
|
| }
|
| if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) {
|
| return $self->parseSingleType();
|
| @@ -1780,13 +1795,14 @@ sub parseUnionType
|
| my $self = shift;
|
| my $next = $self->nextToken();
|
| if ($next->value() eq "(") {
|
| + my $unionType = UnionType->new();
|
| $self->assertTokenValue($self->getToken(), "(", __LINE__);
|
| - $self->parseUnionMemberType();
|
| + push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType();
|
| $self->assertTokenValue($self->getToken(), "or", __LINE__);
|
| - $self->parseUnionMemberType();
|
| - $self->parseUnionMemberTypes();
|
| + push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType();
|
| + push @{$unionType->unionMemberTypes}, $self->parseUnionMemberTypes();
|
| $self->assertTokenValue($self->getToken(), ")", __LINE__);
|
| - return;
|
| + return $unionType;
|
| }
|
| $self->assertUnexpectedToken($next->value(), __LINE__);
|
| }
|
| @@ -1796,20 +1812,23 @@ sub parseUnionMemberType
|
| my $self = shift;
|
| my $next = $self->nextToken();
|
| if ($next->value() eq "(") {
|
| - $self->parseUnionType();
|
| - $self->parseTypeSuffix();
|
| - return;
|
| + my $unionMemberType = UnionMemberType->new();
|
| + my $unionTypeWithSuffix = UnionTypeWithSuffix->new();
|
| + $unionTypeWithSuffix->unionType($self->parseUnionType());
|
| + $unionTypeWithSuffix->suffix($self->parseTypeSuffix());
|
| +
|
| + $unionMemberType->unionTypeWithSuffix($unionTypeWithSuffix);
|
| + return $unionMemberType;
|
| }
|
| if ($next->value() eq "any") {
|
| - $self->assertTokenValue($self->getToken(), "any", __LINE__);
|
| - $self->assertTokenValue($self->getToken(), "[", __LINE__);
|
| - $self->assertTokenValue($self->getToken(), "]", __LINE__);
|
| - $self->parseTypeSuffix();
|
| - return;
|
| + my $type = $self->assertTokenValue($self->getToken(), "any", __LINE__);
|
| + $type .= $self->assertTokenValue($self->getToken(), "[", __LINE__);
|
| + $type .= $self->assertTokenValue($self->getToken(), "]", __LINE__);
|
| + $type .= $self->parseTypeSuffix();
|
| + return $type;
|
| }
|
| if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1/) {
|
| - $self->parseNonAnyType();
|
| - return;
|
| + return $self->parseNonAnyType();
|
| }
|
| $self->assertUnexpectedToken($next->value(), __LINE__);
|
| }
|
| @@ -1819,10 +1838,13 @@ sub parseUnionMemberTypes
|
| my $self = shift;
|
| my $next = $self->nextToken();
|
| if ($next->value() eq "or") {
|
| + my @types = ();
|
| $self->assertTokenValue($self->getToken(), "or", __LINE__);
|
| - $self->parseUnionMemberType();
|
| - $self->parseUnionMemberTypes();
|
| + push @types, $self->parseUnionMemberType();
|
| + push @types, $self->parseUnionMemberTypes();
|
| + return @types;
|
| }
|
| + return ();
|
| }
|
|
|
| sub parseNonAnyType
|
|
|