Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: Source/bindings/scripts/IDLParser.pm

Issue 15076011: Support union return type for anonymous named/indexed getter (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # 1 #
2 # KDOM IDL parser 2 # KDOM IDL parser
3 # 3 #
4 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> 4 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org>
5 # 5 #
6 # This library is free software; you can redistribute it and/or 6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Library General Public 7 # modify it under the terms of the GNU Library General Public
8 # License as published by the Free Software Foundation; either 8 # License as published by the Free Software Foundation; either
9 # version 2 of the License, or (at your option) any later version. 9 # version 2 of the License, or (at your option) any later version.
10 # 10 #
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 57
58 # Used to represent domInterface contents (name of method, signature) 58 # Used to represent domInterface contents (name of method, signature)
59 struct( domFunction => { 59 struct( domFunction => {
60 isStatic => '$', 60 isStatic => '$',
61 signature => '$', # Return type/Object name/extended attributes 61 signature => '$', # Return type/Object name/extended attributes
62 parameters => '@', # List of 'domSignature' 62 parameters => '@', # List of 'domSignature'
63 }); 63 });
64 64
65 # Used to represent domInterface contents (name of attribute, signature) 65 # Used to represent domInterface contents (name of attribute, signature)
66 struct( domAttribute => { 66 struct( domAttribute => {
67 type => '$', # Attribute type (including namespace) 67 type => '$', # Attribute type (including namespace) (string or UnionType)
68 isStatic => '$', 68 isStatic => '$',
69 isReadOnly => '$', 69 isReadOnly => '$',
70 signature => '$', # Attribute signature 70 signature => '$', # Attribute signature
71 getterExceptions => '@', # Possibly raised exceptions. 71 getterExceptions => '@', # Possibly raised exceptions.
72 setterExceptions => '@', # Possibly raised exceptions. 72 setterExceptions => '@', # Possibly raised exceptions.
73 }); 73 });
74 74
75 # Used to represent a map of 'variable name' <-> 'variable type' 75 # Used to represent a map of 'variable name' <-> 'variable type'
76 struct( domSignature => { 76 struct( domSignature => {
77 name => '$', # Variable name 77 name => '$', # Variable name
78 type => '$', # Variable type 78 type => '$', # Variable type (string or UnionType)
79 specials => '@', # Specials 79 specials => '@', # Specials
80 extendedAttributes => '$', # Extended attributes 80 extendedAttributes => '$', # Extended attributes
81 isOptional => '$', # Is variable optional (optional T) 81 isOptional => '$', # Is variable optional (optional T)
82 isNullable => '$', # Is variable type Nullable (T?) 82 isNullable => '$', # Is variable type Nullable (T?)
83 isVariadic => '$' # Is variable variadic (long... numbers) 83 isVariadic => '$' # Is variable variadic (long... numbers)
84 }); 84 });
85 85
86 # Used to represent string constants 86 # Used to represent string constants
87 struct( domConstant => { 87 struct( domConstant => {
88 name => '$', # DOM Constant identifier 88 name => '$', # DOM Constant identifier
(...skipping 11 matching lines...) Expand all
100 struct( Token => { 100 struct( Token => {
101 type => '$', # type of token 101 type => '$', # type of token
102 value => '$' # value of token 102 value => '$' # value of token
103 }); 103 });
104 104
105 struct( Typedef => { 105 struct( Typedef => {
106 extendedAttributes => '$', # Extended attributes 106 extendedAttributes => '$', # Extended attributes
107 type => '$', # Type of data 107 type => '$', # Type of data
108 }); 108 });
109 109
110 struct( UnionType => {
111 unionMemberTypes => '@', # (UnionType or string)[]
112 });
113
110 # Maps 'typedef name' -> Typedef 114 # Maps 'typedef name' -> Typedef
111 my %typedefs = (); 115 my %typedefs = ();
112 116
113 sub new { 117 sub new {
114 my $class = shift; 118 my $class = shift;
115 119
116 my $emptyToken = Token->new(); 120 my $emptyToken = Token->new();
117 $emptyToken->type(EmptyToken); 121 $emptyToken->type(EmptyToken);
118 $emptyToken->value("empty"); 122 $emptyToken->value("empty");
119 123
(...skipping 1624 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 return $self->getToken()->value(); 1748 return $self->getToken()->value();
1745 } 1749 }
1746 $self->assertUnexpectedToken($next->value(), __LINE__); 1750 $self->assertUnexpectedToken($next->value(), __LINE__);
1747 } 1751 }
1748 1752
1749 sub parseType 1753 sub parseType
1750 { 1754 {
1751 my $self = shift; 1755 my $self = shift;
1752 my $next = $self->nextToken(); 1756 my $next = $self->nextToken();
1753 if ($next->value() eq "(") { 1757 if ($next->value() eq "(") {
1754 $self->parseUnionType(); 1758 my $unionType = $self->parseUnionType();
1755 $self->parseTypeSuffix(); 1759 my $suffix = $self->parseTypeSuffix();
1756 return; 1760 die "Suffix after UnionType is not supported." if $suffix ne "";
1761 return $unionType;
1757 } 1762 }
1758 if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) { 1763 if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) {
1759 return $self->parseSingleType(); 1764 return $self->parseSingleType();
1760 } 1765 }
1761 $self->assertUnexpectedToken($next->value(), __LINE__); 1766 $self->assertUnexpectedToken($next->value(), __LINE__);
1762 } 1767 }
1763 1768
1764 sub parseSingleType 1769 sub parseSingleType
1765 { 1770 {
1766 my $self = shift; 1771 my $self = shift;
1767 my $next = $self->nextToken(); 1772 my $next = $self->nextToken();
1768 if ($next->value() eq "any") { 1773 if ($next->value() eq "any") {
1769 $self->assertTokenValue($self->getToken(), "any", __LINE__); 1774 $self->assertTokenValue($self->getToken(), "any", __LINE__);
1770 return "any" . $self->parseTypeSuffixStartingWithArray(); 1775 return "any" . $self->parseTypeSuffixStartingWithArray();
1771 } 1776 }
1772 if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1 /) { 1777 if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1 /) {
1773 return $self->parseNonAnyType(); 1778 return $self->parseNonAnyType();
1774 } 1779 }
1775 $self->assertUnexpectedToken($next->value(), __LINE__); 1780 $self->assertUnexpectedToken($next->value(), __LINE__);
1776 } 1781 }
1777 1782
1778 sub parseUnionType 1783 sub parseUnionType
1779 { 1784 {
1780 my $self = shift; 1785 my $self = shift;
1781 my $next = $self->nextToken(); 1786 my $next = $self->nextToken();
1782 if ($next->value() eq "(") { 1787 if ($next->value() eq "(") {
1788 my $unionType = UnionType->new();
1783 $self->assertTokenValue($self->getToken(), "(", __LINE__); 1789 $self->assertTokenValue($self->getToken(), "(", __LINE__);
1784 $self->parseUnionMemberType(); 1790 push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType();
1785 $self->assertTokenValue($self->getToken(), "or", __LINE__); 1791 $self->assertTokenValue($self->getToken(), "or", __LINE__);
1786 $self->parseUnionMemberType(); 1792 push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType();
1787 $self->parseUnionMemberTypes(); 1793 push @{$unionType->unionMemberTypes}, $self->parseUnionMemberTypes();
1788 $self->assertTokenValue($self->getToken(), ")", __LINE__); 1794 $self->assertTokenValue($self->getToken(), ")", __LINE__);
1789 return; 1795 return $unionType;
1790 } 1796 }
1791 $self->assertUnexpectedToken($next->value(), __LINE__); 1797 $self->assertUnexpectedToken($next->value(), __LINE__);
1792 } 1798 }
1793 1799
1800 # Returns UnionType or string
1794 sub parseUnionMemberType 1801 sub parseUnionMemberType
1795 { 1802 {
1796 my $self = shift; 1803 my $self = shift;
1797 my $next = $self->nextToken(); 1804 my $next = $self->nextToken();
1798 if ($next->value() eq "(") { 1805 if ($next->value() eq "(") {
1799 $self->parseUnionType(); 1806 my $unionType = $self->parseUnionType();
1800 $self->parseTypeSuffix(); 1807 my $suffix = $self->parseTypeSuffix();
1801 return; 1808 die "Suffix after UnionType is not supported." if $suffix ne "";
1809 return $unionType;
1802 } 1810 }
1803 if ($next->value() eq "any") { 1811 if ($next->value() eq "any") {
1804 $self->assertTokenValue($self->getToken(), "any", __LINE__); 1812 my $type = $self->assertTokenValue($self->getToken(), "any", __LINE__);
1805 $self->assertTokenValue($self->getToken(), "[", __LINE__); 1813 $type .= $self->assertTokenValue($self->getToken(), "[", __LINE__);
1806 $self->assertTokenValue($self->getToken(), "]", __LINE__); 1814 $type .= $self->assertTokenValue($self->getToken(), "]", __LINE__);
1807 $self->parseTypeSuffix(); 1815 $type .= $self->parseTypeSuffix();
1808 return; 1816 return $type;
1809 } 1817 }
1810 if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1 /) { 1818 if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1 /) {
1811 $self->parseNonAnyType(); 1819 return $self->parseNonAnyType();
1812 return;
1813 } 1820 }
1814 $self->assertUnexpectedToken($next->value(), __LINE__); 1821 $self->assertUnexpectedToken($next->value(), __LINE__);
1815 } 1822 }
1816 1823
1817 sub parseUnionMemberTypes 1824 sub parseUnionMemberTypes
1818 { 1825 {
1819 my $self = shift; 1826 my $self = shift;
1827 my @types = ();
1820 my $next = $self->nextToken(); 1828 my $next = $self->nextToken();
1821 if ($next->value() eq "or") { 1829 if ($next->value() eq "or") {
1822 $self->assertTokenValue($self->getToken(), "or", __LINE__); 1830 $self->assertTokenValue($self->getToken(), "or", __LINE__);
1823 $self->parseUnionMemberType(); 1831 push @types, $self->parseUnionMemberType();
1824 $self->parseUnionMemberTypes(); 1832 push @types, $self->parseUnionMemberTypes();
1825 } 1833 }
1834 return @types;
1826 } 1835 }
1827 1836
1828 sub parseNonAnyType 1837 sub parseNonAnyType
1829 { 1838 {
1830 my $self = shift; 1839 my $self = shift;
1831 my $next = $self->nextToken(); 1840 my $next = $self->nextToken();
1832 if ($next->value() =~ /$nextNonAnyType_1/) { 1841 if ($next->value() =~ /$nextNonAnyType_1/) {
1833 return $self->parsePrimitiveType() . $self->parseTypeSuffix(); 1842 return $self->parsePrimitiveType() . $self->parseTypeSuffix();
1834 } 1843 }
1835 if ($next->value() eq "ByteString") { 1844 if ($next->value() eq "ByteString") {
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
2215 $customConstructor->{overloadedIndex} = $index++; 2224 $customConstructor->{overloadedIndex} = $index++;
2216 push(@{$interface->customConstructors}, $customConstructor); 2225 push(@{$interface->customConstructors}, $customConstructor);
2217 } 2226 }
2218 delete $extendedAttributeList->{"CustomConstructors"}; 2227 delete $extendedAttributeList->{"CustomConstructors"};
2219 $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING"; 2228 $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING";
2220 } 2229 }
2221 $interface->extendedAttributes($extendedAttributeList); 2230 $interface->extendedAttributes($extendedAttributeList);
2222 } 2231 }
2223 2232
2224 1; 2233 1;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698