Title: [129737] trunk/Source/WebCore
Revision
129737
Author
[email protected]
Date
2012-09-27 01:13:15 -0700 (Thu, 27 Sep 2012)

Log Message

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

Patch by Takashi Sakamoto <[email protected]> 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (129736 => 129737)


--- trunk/Source/WebCore/ChangeLog	2012-09-27 08:12:05 UTC (rev 129736)
+++ trunk/Source/WebCore/ChangeLog	2012-09-27 08:13:15 UTC (rev 129737)
@@ -1,3 +1,33 @@
+2012-09-27  Takashi Sakamoto  <[email protected]>
+
+        Follow-up to r129723 to once more allow parsing of scoped names in IDL files.
+
+        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):
+
 2012-09-27  Yury Semikhatsky  <[email protected]>
 
         Web Inspector: expose debug memory instrumentation debug data through the protocol

Modified: trunk/Source/WebCore/bindings/scripts/IDLParser.pm (129736 => 129737)


--- trunk/Source/WebCore/bindings/scripts/IDLParser.pm	2012-09-27 08:12:05 UTC (rev 129736)
+++ trunk/Source/WebCore/bindings/scripts/IDLParser.pm	2012-09-27 08:13:15 UTC (rev 129737)
@@ -208,31 +208,32 @@
 my $nextPrimitiveType_1 = '^(int|long|short|unsigned)$';
 my $nextPrimitiveType_2 = '^(double|float|unrestricted)$';
 my $nextSetGetRaises2_1 = '^(;|getraises|setraises)$';
-my $nextArgumentList_1 = '^(\(|ByteString|DOMString|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
+my $nextArgumentList_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
 my $nextNonAnyType_1 = '^(boolean|byte|double|float|int|long|octet|short|unrestricted|unsigned)$';
-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)$';
+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)$';
 my $nextOptionalIteratorInterfaceOrObject_1 = '^(;|=)$';
 my $nextAttributeOrOperationOrIterator_1 = '^(static|stringifier)$';
-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)$';
+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)$';
 my $nextUnrestrictedFloatType_1 = '^(double|float)$';
-my $nextExtendedAttributeRest3_1 = '^(,|\])$';
-my $nextExceptionField_1 = '^(\(|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
-my $nextType_1 = '^(ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
+my $nextExtendedAttributeRest3_1 = '^(\,|::|\])$';
+my $nextExceptionField_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
+my $nextType_1 = '^(::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
 my $nextSpecials_1 = '^(creator|deleter|getter|legacycaller|setter)$';
-my $nextDefinitions_1 = '^(callback|dictionary|enum|exception|interface|partial|typedef)$';
-my $nextExceptionMembers_1 = '^(\(|ByteString|DOMString|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
+my $nextDefinitions_1 = '^(::|callback|dictionary|enum|exception|interface|partial|typedef)$';
+my $nextExceptionMembers_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
 my $nextAttributeRest_1 = '^(attribute|readonly)$';
-my $nextSingleType_1 = '^(ByteString|DOMString|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
+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)$';
+my $nextSingleType_1 = '^(::|ByteString|DOMString|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
 my $nextGet_1 = '^(;|getraises|getter|setraises|setter)$';
 my $nextArgumentName_1 = '^(attribute|callback|const|creator|deleter|dictionary|enum|exception|getter|implements|inherit|interface|legacycaller|partial|serializer|setter|static|stringifier|typedef|unrestricted)$';
 my $nextConstValue_1 = '^(false|true)$';
 my $nextConstValue_2 = '^(-|Infinity|NaN)$';
 my $nextDefinition_1 = '^(callback|interface)$';
-my $nextAttributeOrOperationRest_1 = '^(\(|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$';
+my $nextAttributeOrOperationRest_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$';
 my $nextUnsignedIntegerType_1 = '^(int|long|short)$';
-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)$';
 my $nextDefaultValue_1 = '^(-|Infinity|NaN|false|null|true)$';
 
+
 sub parseDefinitions
 {
     my $self = shift;
@@ -280,7 +281,7 @@
     if ($next->value() eq "typedef") {
         return $self->parseTypedef($extendedAttributeList);
     }
-    if ($next->type() == IdentifierToken) {
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
         return $self->parseImplementsStatement($extendedAttributeList);
     }
     $self->assertUnexpectedToken($next->value(), __LINE__);
@@ -571,9 +572,8 @@
     my $next = $self->nextToken();
     if ($next->value() eq ":") {
         $self->assertTokenValue($self->getToken(), ":", __LINE__);
-        my $token = $self->getToken();
-        $self->assertTokenType($token, IdentifierToken);
-        push(@parent, $token->value());
+        my $scopedName = $self->parseScopedName();
+        push(@parent, $scopedName);
         # Multiple inheritance?
         push(@parent, @{$self->parseIdentifiers()});
     }
@@ -664,9 +664,9 @@
 
     my $next = $self->nextToken();
     if ($next->type() == IdentifierToken) {
-        $self->assertTokenType($self->getToken(), IdentifierToken);
+        $self->parseScopedName();
         $self->assertTokenValue($self->getToken(), "implements", __LINE__);
-        $self->assertTokenType($self->getToken(), IdentifierToken);
+        $self->parseScopedName();
         $self->assertTokenValue($self->getToken(), ";", __LINE__);
         return;
     }
@@ -1368,9 +1368,9 @@
 {
     my $self = shift;
     my $next = $self->nextToken();
-    if ($next->type() == IdentifierToken) {
-        my $token = $self->getToken();
-        return $self->parseExtendedAttributeRest($token->value());
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
+        my $scopedName = $self->parseScopedName();
+        return $self->parseExtendedAttributeRest($scopedName);
     }
     # backward compatibility. Spec doesn' allow "[]". But WebKit requires.
     if ($next->value() eq ']') {
@@ -1383,9 +1383,9 @@
 {
     my $self = shift;
     my $next = $self->nextToken();
-    if ($next->type() == IdentifierToken) {
-        my $token = $self->getToken();
-        return $self->parseExtendedAttributeRest($token->value());
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
+        my $scopedName = $self->parseScopedName();
+        return $self->parseExtendedAttributeRest($scopedName);
     }
     return {};
 }
@@ -1421,9 +1421,9 @@
 {
     my $self = shift;
     my $next = $self->nextToken();
-    if ($next->type() == IdentifierToken) {
-        my $token = $self->getToken();
-        return $self->parseExtendedAttributeRest3($token->value());
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
+        my $scopedName = $self->parseScopedName();
+        return $self->parseExtendedAttributeRest3($scopedName);
     }
     if ($next->type() == IntegerToken) {
         my $token = $self->getToken();
@@ -1440,15 +1440,13 @@
     my $next = $self->nextToken();
     if ($next->value() eq "&") {
         $self->assertTokenValue($self->getToken(), "&", __LINE__);
-        my $token = $self->getToken();
-        $self->assertTokenType($token, IdentifierToken);
-        return $name . "&" . $token->value();
+        my $rightValue = $self->parseScopedName();
+        return $name . "&" . $rightValue;
     }
     if ($next->value() eq "|") {
         $self->assertTokenValue($self->getToken(), "|", __LINE__);
-        my $token = $self->getToken();
-        $self->assertTokenType($token, IdentifierToken);
-        return $name . "|" . $token->value();
+        my $rightValue = $self->parseScopedName();
+        return $name . "|" . $rightValue;
     }
     if ($next->value() eq "(") {
         my $attr = {};
@@ -1460,21 +1458,21 @@
     if ($next->type() == IdentifierToken || $next->value() =~ /$nextExtendedAttributeRest3_1/) {
         my @names = ();
         push(@names, $name);
-        push(@names, @{$self->parseIdentifierList()});
+        push(@names, @{$self->parseScopedNameListNoComma()});
         return join(' ', @names);
     }
     $self->assertUnexpectedToken($next->value());
 }
 
-sub parseIdentifierList
+sub parseScopedNameListNoComma
 {
     my $self = shift;
     my @names = ();
 
     while (1) {
         my $next = $self->nextToken();
-        if ($next->type() == IdentifierToken) {
-            push(@names, $self->getToken()->value());
+        if ($next->type() == IdentifierToken || $next->value() eq "::") {
+            push(@names, $self->parseScopedName());
         } else {
             last;
         }
@@ -1658,9 +1656,9 @@
         $self->assertTokenValue($self->getToken(), "Date", __LINE__);
         return "Date" . $self->parseTypeSuffix();
     }
-    if ($next->type() == IdentifierToken) {
-        my $token = $self->getToken();
-        return $token->value() . $self->parseTypeSuffix();
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
+        my $name = $self->parseScopedName();
+        return $name . $self->parseTypeSuffix();
     }
     $self->assertUnexpectedToken($next->value(), __LINE__);
 }
@@ -1967,10 +1965,7 @@
     if ($next->value() eq "(") {
         my @exceptions = ();
         $self->assertTokenValue($self->getToken(), "(", __LINE__);
-        my $token = $self->getToken();
-        $self->assertTokenType($token, IdentifierToken);
-        push(@exceptions, $token->value());
-        push(@exceptions, @{$self->parseIdentifiers()});
+        push(@exceptions, @{$self->parseScopedNameList()});
         $self->assertTokenValue($self->getToken(), ")", __LINE__);
         return \@exceptions;
     }
@@ -2013,7 +2008,7 @@
     if ($next->value() eq "module") {
         return $self->parseModule();
     }
-    if ($next->type() == IdentifierToken) {
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
         return $self->parseImplementsStatement({});
     }
     $self->assertUnexpectedToken($next->value(), __LINE__);
@@ -2273,6 +2268,93 @@
     }
 }
 
+sub parseScopedName
+{
+    my $self = shift;
+    my $next = $self->nextToken();
+    if ($next->value() eq "::") {
+        return $self->parseAbsoluteScopedName();
+    }
+    if ($next->type() == IdentifierToken) {
+        return $self->parseRelativeScopedName();
+    }
+    $self->assertUnexpectedToken($next->value());
+}
+
+sub parseAbsoluteScopedName
+{
+    my $self = shift;
+    my $next = $self->nextToken();
+    if ($next->value() eq "::") {
+        $self->assertTokenValue($self->getToken(), "::");
+        my $token = $self->getToken();
+        $self->assertTokenType($token, IdentifierToken);
+        return "::" . $token->value() . $self->parseScopedNameParts();
+    }
+    $self->assertUnexpectedToken($next->value());
+}
+
+sub parseRelativeScopedName
+{
+    my $self = shift;
+    my $next = $self->nextToken();
+    if ($next->type() == IdentifierToken) {
+        my $token = $self->getToken();
+        return $token->value() . $self->parseScopedNameParts();
+    }
+    $self->assertUnexpectedToken($next->value());
+}
+
+sub parseScopedNameParts
+{
+    my $self = shift;
+    my @names = ();
+
+    while (1) {
+        my $next = $self->nextToken();
+        if ($next->value() eq "::") {
+            $self->assertTokenValue($self->getToken(), "::");
+            push(@names, "::");
+            my $token = $self->getToken();
+            $self->assertTokenType($token, IdentifierToken);
+            push(@names, $token->value());
+        } else {
+            last;
+        }
+    }
+    return join("", @names);
+}
+
+sub parseScopedNameList
+{
+    my $self = shift;
+    my $next = $self->nextToken();
+    if ($next->type() == IdentifierToken || $next->value() eq "::") {
+        my @names = ();
+        push(@names, $self->parseScopedName());
+        push(@names, @{$self->parseScopedNames()});
+        return \@names;
+    }
+    $self->assertUnexpectedToken($next->value(), __LINE__);
+}
+
+sub parseScopedNames
+{
+    my $self = shift;
+    my @names = ();
+
+    while (1) {
+        my $next = $self->nextToken();
+        if ($next->value() eq ",") {
+            $self->assertTokenValue($self->getToken(), ",");
+            push(@names, $self->parseScopedName());
+        } else {
+            last;
+        }
+    }
+    return \@names;
+}
+
 sub applyMemberList
 {
     my $dataNode = shift;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to