Changeset 129737 in webkit


Ignore:
Timestamp:
Sep 27, 2012 1:13:15 AM (12 years ago)
Author:
mrowe@apple.com
Message:

Follow-up to r129723 to once more allow parsing of scoped names in IDL files.

Patch by Takashi Sakamoto <tasak@google.com> on 2012-09-27
Reviewed by Kentaro Hara.

This functionality was supported by the old IDL parser but was lost in the rewrite of the parser
in r129723. It is being reinstated to unbreak clients that currently depend on it, but will likely
be removed in the future once those clients have a chance to adopt an approach that more closely
follows the WebIDL syntax.

  • bindings/scripts/IDLParser.pm:

(parseDefinition):
(parseInheritance):
(parseImplementsStatement):
(parseExtendedAttribute):
(parseExtendedAttribute2):
(parseExtendedAttributeRest2):
(parseExtendedAttributeRest3):
(parseScopedNameListNoComma):
(parseNonAnyType):
(parseExceptionList):
(parseDefinitionOld):
(parseScopedName):
(parseAbsoluteScopedName):
(parseRelativeScopedName):
(parseScopedNameParts):
(parseScopedNameList):
(parseScopedNames):

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r129734 r129737  
     12012-09-27  Takashi Sakamoto  <tasak@google.com>
     2
     3        Follow-up to r129723 to once more allow parsing of scoped names in IDL files.
     4
     5        Reviewed by Kentaro Hara.
     6
     7        This functionality was supported by the old IDL parser but was lost in the rewrite of the parser
     8        in r129723. It is being reinstated to unbreak clients that currently depend on it, but will likely
     9        be removed in the future once those clients have a chance to adopt an approach that more closely
     10        follows the WebIDL syntax.
     11
     12        * bindings/scripts/IDLParser.pm:
     13        (parseDefinition):
     14        (parseInheritance):
     15        (parseImplementsStatement):
     16        (parseExtendedAttribute):
     17        (parseExtendedAttribute2):
     18        (parseExtendedAttributeRest2):
     19        (parseExtendedAttributeRest3):
     20        (parseScopedNameListNoComma):
     21        (parseNonAnyType):
     22        (parseExceptionList):
     23        (parseDefinitionOld):
     24        (parseScopedName):
     25        (parseAbsoluteScopedName):
     26        (parseRelativeScopedName):
     27        (parseScopedNameParts):
     28        (parseScopedNameList):
     29        (parseScopedNames):
     30
    1312012-09-27  Yury Semikhatsky  <yurys@chromium.org>
    232
  • trunk/Source/WebCore/bindings/scripts/IDLParser.pm

    r129723 r129737  
    209209my $nextPrimitiveType_2 = '^(double|float|unrestricted)$';
    210210my $nextSetGetRaises2_1 = '^(;|getraises|setraises)$';
    211 my $nextArgumentList_1 = '^(\(|ByteString|DOMString|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
     211my $nextArgumentList_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
    212212my $nextNonAnyType_1 = '^(boolean|byte|double|float|int|long|octet|short|unrestricted|unsigned)$';
    213 my $nextInterfaceMemberOld_1 = '^(\(|ByteString|DOMString|Date|any|attribute|boolean|byte|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
     213my $nextInterfaceMemberOld_1 = '^(\(|::|ByteString|DOMString|Date|any|attribute|boolean|byte|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
    214214my $nextOptionalIteratorInterfaceOrObject_1 = '^(;|=)$';
    215215my $nextAttributeOrOperationOrIterator_1 = '^(static|stringifier)$';
    216 my $nextAttributeOrOperationOrIterator_2 = '^(\(|ByteString|DOMString|Date|any|boolean|byte|creator|deleter|double|float|getter|int|legacycaller|long|object|octet|sequence|setter|short|unrestricted|unsigned|void)$';
     216my $nextAttributeOrOperationOrIterator_2 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|creator|deleter|double|float|getter|int|legacycaller|long|object|octet|sequence|setter|short|unrestricted|unsigned|void)$';
    217217my $nextUnrestrictedFloatType_1 = '^(double|float)$';
    218 my $nextExtendedAttributeRest3_1 = '^(,|\])$';
    219 my $nextExceptionField_1 = '^(\(|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
    220 my $nextType_1 = '^(ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
     218my $nextExtendedAttributeRest3_1 = '^(\,|::|\])$';
     219my $nextExceptionField_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
     220my $nextType_1 = '^(::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
    221221my $nextSpecials_1 = '^(creator|deleter|getter|legacycaller|setter)$';
    222 my $nextDefinitions_1 = '^(callback|dictionary|enum|exception|interface|partial|typedef)$';
    223 my $nextExceptionMembers_1 = '^(\(|ByteString|DOMString|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
     222my $nextDefinitions_1 = '^(::|callback|dictionary|enum|exception|interface|partial|typedef)$';
     223my $nextExceptionMembers_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
    224224my $nextAttributeRest_1 = '^(attribute|readonly)$';
    225 my $nextSingleType_1 = '^(ByteString|DOMString|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
     225my $nextInterfaceMembers_1 = '^(\(|::|ByteString|DOMString|Date|any|attribute|boolean|byte|const|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
     226my $nextSingleType_1 = '^(::|ByteString|DOMString|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
    226227my $nextGet_1 = '^(;|getraises|getter|setraises|setter)$';
    227228my $nextArgumentName_1 = '^(attribute|callback|const|creator|deleter|dictionary|enum|exception|getter|implements|inherit|interface|legacycaller|partial|serializer|setter|static|stringifier|typedef|unrestricted)$';
     
    229230my $nextConstValue_2 = '^(-|Infinity|NaN)$';
    230231my $nextDefinition_1 = '^(callback|interface)$';
    231 my $nextAttributeOrOperationRest_1 = '^(\(|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$';
     232my $nextAttributeOrOperationRest_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$';
    232233my $nextUnsignedIntegerType_1 = '^(int|long|short)$';
    233 my $nextInterfaceMembers_1 = '^(\(|ByteString|DOMString|Date|any|attribute|boolean|byte|const|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
    234234my $nextDefaultValue_1 = '^(-|Infinity|NaN|false|null|true)$';
     235
    235236
    236237sub parseDefinitions
     
    281282        return $self->parseTypedef($extendedAttributeList);
    282283    }
    283     if ($next->type() == IdentifierToken) {
     284    if ($next->type() == IdentifierToken || $next->value() eq "::") {
    284285        return $self->parseImplementsStatement($extendedAttributeList);
    285286    }
     
    572573    if ($next->value() eq ":") {
    573574        $self->assertTokenValue($self->getToken(), ":", __LINE__);
    574         my $token = $self->getToken();
    575         $self->assertTokenType($token, IdentifierToken);
    576         push(@parent, $token->value());
     575        my $scopedName = $self->parseScopedName();
     576        push(@parent, $scopedName);
    577577        # Multiple inheritance?
    578578        push(@parent, @{$self->parseIdentifiers()});
     
    665665    my $next = $self->nextToken();
    666666    if ($next->type() == IdentifierToken) {
    667         $self->assertTokenType($self->getToken(), IdentifierToken);
     667        $self->parseScopedName();
    668668        $self->assertTokenValue($self->getToken(), "implements", __LINE__);
    669         $self->assertTokenType($self->getToken(), IdentifierToken);
     669        $self->parseScopedName();
    670670        $self->assertTokenValue($self->getToken(), ";", __LINE__);
    671671        return;
     
    13691369    my $self = shift;
    13701370    my $next = $self->nextToken();
    1371     if ($next->type() == IdentifierToken) {
    1372         my $token = $self->getToken();
    1373         return $self->parseExtendedAttributeRest($token->value());
     1371    if ($next->type() == IdentifierToken || $next->value() eq "::") {
     1372        my $scopedName = $self->parseScopedName();
     1373        return $self->parseExtendedAttributeRest($scopedName);
    13741374    }
    13751375    # backward compatibility. Spec doesn' allow "[]". But WebKit requires.
     
    13841384    my $self = shift;
    13851385    my $next = $self->nextToken();
    1386     if ($next->type() == IdentifierToken) {
    1387         my $token = $self->getToken();
    1388         return $self->parseExtendedAttributeRest($token->value());
     1386    if ($next->type() == IdentifierToken || $next->value() eq "::") {
     1387        my $scopedName = $self->parseScopedName();
     1388        return $self->parseExtendedAttributeRest($scopedName);
    13891389    }
    13901390    return {};
     
    14221422    my $self = shift;
    14231423    my $next = $self->nextToken();
    1424     if ($next->type() == IdentifierToken) {
    1425         my $token = $self->getToken();
    1426         return $self->parseExtendedAttributeRest3($token->value());
     1424    if ($next->type() == IdentifierToken || $next->value() eq "::") {
     1425        my $scopedName = $self->parseScopedName();
     1426        return $self->parseExtendedAttributeRest3($scopedName);
    14271427    }
    14281428    if ($next->type() == IntegerToken) {
     
    14411441    if ($next->value() eq "&") {
    14421442        $self->assertTokenValue($self->getToken(), "&", __LINE__);
    1443         my $token = $self->getToken();
    1444         $self->assertTokenType($token, IdentifierToken);
    1445         return $name . "&" . $token->value();
     1443        my $rightValue = $self->parseScopedName();
     1444        return $name . "&" . $rightValue;
    14461445    }
    14471446    if ($next->value() eq "|") {
    14481447        $self->assertTokenValue($self->getToken(), "|", __LINE__);
    1449         my $token = $self->getToken();
    1450         $self->assertTokenType($token, IdentifierToken);
    1451         return $name . "|" . $token->value();
     1448        my $rightValue = $self->parseScopedName();
     1449        return $name . "|" . $rightValue;
    14521450    }
    14531451    if ($next->value() eq "(") {
     
    14611459        my @names = ();
    14621460        push(@names, $name);
    1463         push(@names, @{$self->parseIdentifierList()});
     1461        push(@names, @{$self->parseScopedNameListNoComma()});
    14641462        return join(' ', @names);
    14651463    }
     
    14671465}
    14681466
    1469 sub parseIdentifierList
     1467sub parseScopedNameListNoComma
    14701468{
    14711469    my $self = shift;
     
    14741472    while (1) {
    14751473        my $next = $self->nextToken();
    1476         if ($next->type() == IdentifierToken) {
    1477             push(@names, $self->getToken()->value());
     1474        if ($next->type() == IdentifierToken || $next->value() eq "::") {
     1475            push(@names, $self->parseScopedName());
    14781476        } else {
    14791477            last;
     
    16591657        return "Date" . $self->parseTypeSuffix();
    16601658    }
    1661     if ($next->type() == IdentifierToken) {
    1662         my $token = $self->getToken();
    1663         return $token->value() . $self->parseTypeSuffix();
     1659    if ($next->type() == IdentifierToken || $next->value() eq "::") {
     1660        my $name = $self->parseScopedName();
     1661        return $name . $self->parseTypeSuffix();
    16641662    }
    16651663    $self->assertUnexpectedToken($next->value(), __LINE__);
     
    19681966        my @exceptions = ();
    19691967        $self->assertTokenValue($self->getToken(), "(", __LINE__);
    1970         my $token = $self->getToken();
    1971         $self->assertTokenType($token, IdentifierToken);
    1972         push(@exceptions, $token->value());
    1973         push(@exceptions, @{$self->parseIdentifiers()});
     1968        push(@exceptions, @{$self->parseScopedNameList()});
    19741969        $self->assertTokenValue($self->getToken(), ")", __LINE__);
    19751970        return \@exceptions;
     
    20142009        return $self->parseModule();
    20152010    }
    2016     if ($next->type() == IdentifierToken) {
     2011    if ($next->type() == IdentifierToken || $next->value() eq "::") {
    20172012        return $self->parseImplementsStatement({});
    20182013    }
     
    22722267        $self->assertTokenValue($self->getToken(), ";", __LINE__);
    22732268    }
     2269}
     2270
     2271sub parseScopedName
     2272{
     2273    my $self = shift;
     2274    my $next = $self->nextToken();
     2275    if ($next->value() eq "::") {
     2276        return $self->parseAbsoluteScopedName();
     2277    }
     2278    if ($next->type() == IdentifierToken) {
     2279        return $self->parseRelativeScopedName();
     2280    }
     2281    $self->assertUnexpectedToken($next->value());
     2282}
     2283
     2284sub parseAbsoluteScopedName
     2285{
     2286    my $self = shift;
     2287    my $next = $self->nextToken();
     2288    if ($next->value() eq "::") {
     2289        $self->assertTokenValue($self->getToken(), "::");
     2290        my $token = $self->getToken();
     2291        $self->assertTokenType($token, IdentifierToken);
     2292        return "::" . $token->value() . $self->parseScopedNameParts();
     2293    }
     2294    $self->assertUnexpectedToken($next->value());
     2295}
     2296
     2297sub parseRelativeScopedName
     2298{
     2299    my $self = shift;
     2300    my $next = $self->nextToken();
     2301    if ($next->type() == IdentifierToken) {
     2302        my $token = $self->getToken();
     2303        return $token->value() . $self->parseScopedNameParts();
     2304    }
     2305    $self->assertUnexpectedToken($next->value());
     2306}
     2307
     2308sub parseScopedNameParts
     2309{
     2310    my $self = shift;
     2311    my @names = ();
     2312
     2313    while (1) {
     2314        my $next = $self->nextToken();
     2315        if ($next->value() eq "::") {
     2316            $self->assertTokenValue($self->getToken(), "::");
     2317            push(@names, "::");
     2318            my $token = $self->getToken();
     2319            $self->assertTokenType($token, IdentifierToken);
     2320            push(@names, $token->value());
     2321        } else {
     2322            last;
     2323        }
     2324    }
     2325    return join("", @names);
     2326}
     2327
     2328sub parseScopedNameList
     2329{
     2330    my $self = shift;
     2331    my $next = $self->nextToken();
     2332    if ($next->type() == IdentifierToken || $next->value() eq "::") {
     2333        my @names = ();
     2334        push(@names, $self->parseScopedName());
     2335        push(@names, @{$self->parseScopedNames()});
     2336        return \@names;
     2337    }
     2338    $self->assertUnexpectedToken($next->value(), __LINE__);
     2339}
     2340
     2341sub parseScopedNames
     2342{
     2343    my $self = shift;
     2344    my @names = ();
     2345
     2346    while (1) {
     2347        my $next = $self->nextToken();
     2348        if ($next->value() eq ",") {
     2349            $self->assertTokenValue($self->getToken(), ",");
     2350            push(@names, $self->parseScopedName());
     2351        } else {
     2352            last;
     2353        }
     2354    }
     2355    return \@names;
    22742356}
    22752357
Note: See TracChangeset for help on using the changeset viewer.