Get rid of multiple inheritance support from the bindings generators
authorch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jul 2013 16:24:45 +0000 (16:24 +0000)
committerch.dumez@sisa.samsung.com <ch.dumez@sisa.samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jul 2013 16:24:45 +0000 (16:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=118353

Reviewed by Kentaro Hara.

Source/WebCore:

Remove multiple inheritance support from the bindings generators (except
the ObjC one which still needs it for now). Multiple inheritance is no
longer supported in Web IDL and it makes the scripts more complex than
they needs to be.

Multiple inheritance support is no longer needed now that our SVG
interfaces have been updated to use the simpler SVG2 inheritance model
and use Web IDL 'implements' statements.

Note that the IDL parser still support multiple inheritance for now in
order not to break the ObjC bindings generator.

No new tests, no behavior change.

* bindings/scripts/CodeGenerator.pm:
* bindings/scripts/CodeGeneratorCPP.pm:
(GetParentImplClassName):
(GetParent):
(GenerateImplementation):
* bindings/scripts/CodeGeneratorGObject.pm:
(GetParentClassName):
(GetParentImplClassName):
(GetParentGObjType):
* bindings/scripts/CodeGeneratorJS.pm:
(GetParentClassName):
(GenerateHeader):
(GenerateImplementation):
(GenerateConstructorDefinition):
* bindings/scripts/CodeGeneratorObjC.pm:
(AddMethodsConstantsAndAttributesFromParentInterfaces):
(GenerateImplementation):
* bindings/scripts/IDLParser.pm:
(parseInterface):
(parseException):
(parseInheritance):

Tools:

Update CodeGeneratorTestRunner.pm to use domInterface->parent instead of
deprecated domInterface->parents.

* WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm:
(_parentInterface):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@152725 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/scripts/CodeGenerator.pm
Source/WebCore/bindings/scripts/CodeGeneratorCPP.pm
Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/CodeGeneratorObjC.pm
Source/WebCore/bindings/scripts/IDLParser.pm
Tools/ChangeLog
Tools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm

index 5de7648..65b7bc7 100644 (file)
@@ -1,3 +1,46 @@
+2013-07-16  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Get rid of multiple inheritance support from the bindings generators
+        https://bugs.webkit.org/show_bug.cgi?id=118353
+
+        Reviewed by Kentaro Hara.
+
+        Remove multiple inheritance support from the bindings generators (except
+        the ObjC one which still needs it for now). Multiple inheritance is no
+        longer supported in Web IDL and it makes the scripts more complex than
+        they needs to be.
+
+        Multiple inheritance support is no longer needed now that our SVG
+        interfaces have been updated to use the simpler SVG2 inheritance model
+        and use Web IDL 'implements' statements.
+
+        Note that the IDL parser still support multiple inheritance for now in
+        order not to break the ObjC bindings generator.
+
+        No new tests, no behavior change.
+
+        * bindings/scripts/CodeGenerator.pm:
+        * bindings/scripts/CodeGeneratorCPP.pm:
+        (GetParentImplClassName):
+        (GetParent):
+        (GenerateImplementation):
+        * bindings/scripts/CodeGeneratorGObject.pm:
+        (GetParentClassName):
+        (GetParentImplClassName):
+        (GetParentGObjType):
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GetParentClassName):
+        (GenerateHeader):
+        (GenerateImplementation):
+        (GenerateConstructorDefinition):
+        * bindings/scripts/CodeGeneratorObjC.pm:
+        (AddMethodsConstantsAndAttributesFromParentInterfaces):
+        (GenerateImplementation):
+        * bindings/scripts/IDLParser.pm:
+        (parseInterface):
+        (parseException):
+        (parseInheritance):
+
 2013-07-16  Eric Carlson  <eric.carlson@apple.com>
 
         HTMLMediaElement should not add cues for disabled text tracks
index 55b7ead..27a8b7d 100644 (file)
@@ -205,58 +205,6 @@ sub ForAllParents
     &$recurse($interface);
 }
 
-sub AddMethodsConstantsAndAttributesFromParentInterfaces
-{
-    # Add to $interface all of its inherited interface members, except for those
-    # inherited through $interface's first listed parent.  If an array reference
-    # is passed in as $parents, the names of all ancestor interfaces visited
-    # will be appended to the array.  If $collectDirectParents is true, then
-    # even the names of $interface's first listed parent and its ancestors will
-    # be appended to $parents.
-
-    my $object = shift;
-    my $interface = shift;
-    my $parents = shift;
-    my $collectDirectParents = shift;
-
-    my $first = 1;
-
-    $object->ForAllParents($interface, sub {
-        my $currentInterface = shift;
-
-        if ($first) {
-            # Ignore first parent class, already handled by the generation itself.
-            $first = 0;
-
-            if ($collectDirectParents) {
-                # Just collect the names of the direct ancestor interfaces,
-                # if necessary.
-                push(@$parents, $currentInterface->name);
-                $object->ForAllParents($currentInterface, sub {
-                    my $currentInterface = shift;
-                    push(@$parents, $currentInterface->name);
-                }, undef);
-            }
-
-            # Prune the recursion here.
-            return 'prune';
-        }
-
-        # Collect the name of this additional parent.
-        push(@$parents, $currentInterface->name) if $parents;
-
-        print "  |  |>  -> Inheriting "
-            . @{$currentInterface->constants} . " constants, "
-            . @{$currentInterface->functions} . " functions, "
-            . @{$currentInterface->attributes} . " attributes...\n  |  |>\n" if $verbose;
-
-        # Add this parent's members to $interface.
-        push(@{$interface->constants}, @{$currentInterface->constants});
-        push(@{$interface->functions}, @{$currentInterface->functions});
-        push(@{$interface->attributes}, @{$currentInterface->attributes});
-    });
-}
-
 sub FindSuperMethod
 {
     my ($object, $interface, $functionName) = @_;
index df1fc2a..c39a774 100644 (file)
@@ -139,30 +139,25 @@ sub GetParentImplClassName
 {
     my $interface = shift;
 
-    if (@{$interface->parents} eq 0) {
+    unless ($interface->parent) {
         return "EventTarget" if $interface->extendedAttributes->{"EventTarget"};
         return "Object";
     }
 
-    return $interface->parents(0);
+    return $interface->parent;
 }
 
 sub GetParent
 {
     my $interface = shift;
-    my $numParents = @{$interface->parents};
 
-    my $parent = "";
-    if ($numParents eq 0) {
+    my $parent;
+    if (!$interface->parent) {
         $parent = "WebDOMObject";
         $parent = "WebDOMEventTarget" if $interface->extendedAttributes->{"EventTarget"};
-    } elsif ($numParents eq 1) {
-        my $parentName = $interface->parents(0);
-        $parent = "WebDOM" . $parentName;
     } else {
-        my @parents = @{$interface->parents};
-        my $firstParent = shift(@parents);
-        $parent = "WebDOM" . $firstParent;
+        my $parentName = $interface->parent;
+        $parent = "WebDOM" . $parentName;
     }
 
     return $parent;
@@ -591,12 +586,6 @@ sub GenerateImplementation
     my $object = shift;
     my $interface = shift;
 
-    my @ancestorInterfaceNames = ();
-
-    if (@{$interface->parents} > 1) {
-        $codeGenerator->AddMethodsConstantsAndAttributesFromParentInterfaces($interface, \@ancestorInterfaceNames);
-    }
-
     my $interfaceName = $interface->name;
     my $className = GetClassName($interfaceName);
     my $implClassName = GetImplClassName($interfaceName);
index a52d47c..ef0bf07 100644 (file)
@@ -87,15 +87,15 @@ EOF
 sub GetParentClassName {
     my $interface = shift;
 
-    return "WebKitDOMObject" if @{$interface->parents} eq 0;
-    return "WebKitDOM" . $interface->parents(0);
+    return "WebKitDOMObject" unless $interface->parent;
+    return "WebKitDOM" . $interface->parent;
 }
 
 sub GetParentImplClassName {
     my $interface = shift;
 
-    return "Object" if @{$interface->parents} eq 0;
-    return $interface->parents(0);
+    return "Object" unless $interface->parent;
+    return $interface->parent;
 }
 
 sub IsBaseType
@@ -183,8 +183,8 @@ sub ClassNameToGObjectType {
 sub GetParentGObjType {
     my $interface = shift;
 
-    return "WEBKIT_TYPE_DOM_OBJECT" if @{$interface->parents} eq 0;
-    return "WEBKIT_TYPE_DOM_" . ClassNameToGObjectType($interface->parents(0));
+    return "WEBKIT_TYPE_DOM_OBJECT" unless $interface->parent;
+    return "WEBKIT_TYPE_DOM_" . ClassNameToGObjectType($interface->parent);
 }
 
 sub GetClassName {
index d5d1378..a845547 100644 (file)
@@ -167,8 +167,8 @@ sub GetParentClassName
     my $interface = shift;
 
     return $interface->extendedAttributes->{"JSLegacyParent"} if $interface->extendedAttributes->{"JSLegacyParent"};
-    return "JSDOMWrapper" if (@{$interface->parents} eq 0);
-    return "JS" . $interface->parents(0);
+    return "JSDOMWrapper" unless $interface->parent;
+    return "JS" . $interface->parent;
 }
 
 sub GetCallbackClassName
@@ -650,17 +650,10 @@ sub GenerateHeader
 
     my $interfaceName = $interface->name;
     my $className = "JS$interfaceName";
-    my @ancestorInterfaceNames = ();
     my %structureFlags = ();
 
-    # We only support multiple parents with SVG (for now).
-    if (@{$interface->parents} > 1) {
-        die "A class can't have more than one parent" unless $interfaceName =~ /SVG/;
-        $codeGenerator->AddMethodsConstantsAndAttributesFromParentInterfaces($interface, \@ancestorInterfaceNames);
-    }
-
     my $hasLegacyParent = $interface->extendedAttributes->{"JSLegacyParent"};
-    my $hasRealParent = @{$interface->parents} > 0;
+    my $hasRealParent = $interface->parent;
     my $hasParent = $hasLegacyParent || $hasRealParent;
     my $parentClassName = GetParentClassName($interface);
     my $needsMarkChildren = $interface->extendedAttributes->{"JSCustomMarkFunction"} || $interface->extendedAttributes->{"EventTarget"} || $interface->name eq "EventTarget";
@@ -1194,12 +1187,6 @@ sub GenerateHeader
     push(@headerContent, "\n} // namespace WebCore\n\n");
     push(@headerContent, "#endif // ${conditionalString}\n\n") if $conditionalString;
     push(@headerContent, "#endif\n");
-
-    # - Generate dependencies.
-    if ($writeDependencies && @ancestorInterfaceNames) {
-        push(@depsContent, "$className.h : ", join(" ", map { "$_.idl" } @ancestorInterfaceNames), "\n");
-        push(@depsContent, map { "$_.idl :\n" } @ancestorInterfaceNames); 
-    }
 }
 
 sub GenerateAttributesHashTable($$)
@@ -1584,7 +1571,7 @@ sub GenerateImplementation
     my $className = "JS$interfaceName";
 
     my $hasLegacyParent = $interface->extendedAttributes->{"JSLegacyParent"};
-    my $hasRealParent = @{$interface->parents} > 0;
+    my $hasRealParent = $interface->parent;
     my $hasParent = $hasLegacyParent || $hasRealParent;
     my $parentClassName = GetParentClassName($interface);
     my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
@@ -4091,7 +4078,8 @@ bool fill${interfaceName}Init(${interfaceName}Init& eventInit, JSDictionary& dic
 {
 END
 
-            foreach my $interfaceBase (@{$interface->parents}) {
+            if ($interface->parent) {
+                my $interfaceBase = $interface->parent;
                 push(@implContent, <<END);
     if (!fill${interfaceBase}Init(eventInit, dictionary))
         return false;
index 7ace6bf..c4992c3 100644 (file)
@@ -266,6 +266,57 @@ sub ReadPublicInterfaces
     $interfaceAvailabilityVersion = "WEBKIT_VERSION_LATEST" if $newPublicClass;
 }
 
+sub AddMethodsConstantsAndAttributesFromParentInterfaces
+{
+    # Add to $interface all of its inherited interface members, except for those
+    # inherited through $interface's first listed parent.  If an array reference
+    # is passed in as $parents, the names of all ancestor interfaces visited
+    # will be appended to the array.  If $collectDirectParents is true, then
+    # even the names of $interface's first listed parent and its ancestors will
+    # be appended to $parents.
+
+    my $interface = shift;
+    my $parents = shift;
+    my $collectDirectParents = shift;
+
+    my $first = 1;
+
+    $codeGenerator->ForAllParents($interface, sub {
+        my $currentInterface = shift;
+
+        if ($first) {
+            # Ignore first parent class, already handled by the generation itself.
+            $first = 0;
+
+            if ($collectDirectParents) {
+                # Just collect the names of the direct ancestor interfaces,
+                # if necessary.
+                push(@$parents, $currentInterface->name);
+                $codeGenerator->ForAllParents($currentInterface, sub {
+                    my $currentInterface = shift;
+                    push(@$parents, $currentInterface->name);
+                }, undef);
+            }
+
+            # Prune the recursion here.
+            return 'prune';
+        }
+
+        # Collect the name of this additional parent.
+        push(@$parents, $currentInterface->name) if $parents;
+
+        print "  |  |>  -> Inheriting "
+            . @{$currentInterface->constants} . " constants, "
+            . @{$currentInterface->functions} . " functions, "
+            . @{$currentInterface->attributes} . " attributes...\n  |  |>\n" if $verbose;
+
+        # Add this parent's members to $interface.
+        push(@{$interface->constants}, @{$currentInterface->constants});
+        push(@{$interface->functions}, @{$currentInterface->functions});
+        push(@{$interface->attributes}, @{$currentInterface->attributes});
+    });
+}
+
 sub GenerateInterface
 {
     my $object = shift;
@@ -1048,7 +1099,7 @@ sub GenerateImplementation
     my @ancestorInterfaceNames = ();
 
     if (@{$interface->parents} > 1) {
-        $codeGenerator->AddMethodsConstantsAndAttributesFromParentInterfaces($interface, \@ancestorInterfaceNames);
+        AddMethodsConstantsAndAttributesFromParentInterfaces($interface, \@ancestorInterfaceNames);
     }
 
     my $interfaceName = $interface->name;
index 96db9b0..1cba130 100644 (file)
@@ -43,7 +43,8 @@ struct( idlDocument => {
 # Used to represent 'interface' blocks
 struct( domInterface => {
     name => '$',      # Class identifier
-    parents => '@',      # List of strings
+    parent => '$',      # Parent class identifier
+    parents => '@',      # Parent class identifiers (Kept for compatibility with ObjC bindings)
     constants => '@',    # List of 'domConstant'
     functions => '@',    # List of 'domFunction'
     anonymousFunctions => '@', # List of 'domFunction'
@@ -496,7 +497,9 @@ sub parseInterface
         my $interfaceNameToken = $self->getToken();
         $self->assertTokenType($interfaceNameToken, IdentifierToken);
         $interface->name($interfaceNameToken->value());
-        push(@{$interface->parents}, @{$self->parseInheritance()});
+        my $parents = $self->parseInheritance();
+        $interface->parents($parents);
+        $interface->parent($parents->[0]);
         $self->assertTokenValue($self->getToken(), "{", __LINE__);
         my $interfaceMembers = $self->parseInterfaceMembers();
         $self->assertTokenValue($self->getToken(), "}", __LINE__);
@@ -695,7 +698,9 @@ sub parseException
         $self->assertTokenType($exceptionNameToken, IdentifierToken);
         $interface->name($exceptionNameToken->value());
         $interface->isException(1);
-        push(@{$interface->parents}, @{$self->parseInheritance()});
+        my $parents = $self->parseInheritance();
+        $interface->parents($parents);
+        $interface->parent($parents->[0]);
         $self->assertTokenValue($self->getToken(), "{", __LINE__);
         my $exceptionMembers = $self->parseExceptionMembers();
         $self->assertTokenValue($self->getToken(), "}", __LINE__);
@@ -738,7 +743,7 @@ sub parseInheritance
         $self->assertTokenValue($self->getToken(), ":", __LINE__);
         my $scopedName = $self->parseScopedName();
         push(@parent, $scopedName);
-        # Multiple inheritance?
+        # Multiple inheritance (needed for ObjC bindings).
         push(@parent, @{$self->parseIdentifiers()});
     }
     return \@parent;
index c35e867..a50e137 100644 (file)
@@ -1,3 +1,16 @@
+2013-07-16  Christophe Dumez  <ch.dumez@sisa.samsung.com>
+
+        Get rid of multiple inheritance support from the bindings generators
+        https://bugs.webkit.org/show_bug.cgi?id=118353
+
+        Reviewed by Kentaro Hara.
+
+        Update CodeGeneratorTestRunner.pm to use domInterface->parent instead of
+        deprecated domInterface->parents.
+
+        * WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm:
+        (_parentInterface):
+
 2013-07-16  Brian Holt  <brian.holt@samsung.com>
 
         check-webkit-style: "using namespace foo;" should be flagged as an error in headers
index 73051ff..3de84d0 100644 (file)
@@ -416,7 +416,7 @@ sub _parentClassRefGetterExpression
 sub _parentInterface
 {
     my ($interface) = @_;
-    return $interface->parents->[0];
+    return $interface->parent;
 }
 
 sub _platformType