2006-09-01 Nikolas Zimmermann <zimmermann@kde.org>
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Sep 2006 21:52:12 +0000 (21:52 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Sep 2006 21:52:12 +0000 (21:52 +0000)
        Reviewed by eseidel.  Landed by eseidel.

        Implement support for multiple parents in the SVG idls.

        For class "FooBar" go through all parents recursively,
        collect their attributes & functions & constants and
        add them directly into the class "FooBar".

        (Note: It is NOT enabled by default for now - still some things related to SVGAnimated* need to be solved first)

        * bindings/scripts/CodeGenerator.pm:
        * bindings/scripts/CodeGeneratorJS.pm:
        * bindings/scripts/generate-bindings.pl:

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

WebCore/ChangeLog
WebCore/bindings/scripts/CodeGenerator.pm
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/bindings/scripts/generate-bindings.pl

index 022da16d7623b97556d41f51edf8f505e575d11a..97842d2dfba46062345531b4356ef1d5d8e555e9 100644 (file)
@@ -1,3 +1,19 @@
+2006-09-01  Nikolas Zimmermann  <zimmermann@kde.org>
+
+        Reviewed by eseidel.  Landed by eseidel.
+
+        Implement support for multiple parents in the SVG idls.
+
+        For class "FooBar" go through all parents recursively,
+        collect their attributes & functions & constants and
+        add them directly into the class "FooBar".
+
+        (Note: It is NOT enabled by default for now - still some things related to SVGAnimated* need to be solved first)
+
+        * bindings/scripts/CodeGenerator.pm:
+        * bindings/scripts/CodeGeneratorJS.pm:
+        * bindings/scripts/generate-bindings.pl:
+
 2006-09-02  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by hyatt.  Landed by eseidel.
index c02548284313228438cb8f45f0ec4581d7192c55..0ae8023f52a2b88e53a8bf4644dd6735a7a2d5ce 100644 (file)
@@ -59,10 +59,10 @@ sub new
 
 sub StripModule($)
 {
-       my $object = shift;
-       my $name = shift;
-       $name =~ s/[a-zA-Z0-9]*:://;
-       return $name;
+    my $object = shift;
+    my $name = shift;
+    $name =~ s/[a-zA-Z0-9]*:://;
+    return $name;
 }
 
 sub ProcessDocument
@@ -95,6 +95,86 @@ sub ProcessDocument
 #  print " | *** Finished generation!\n";
 }
 
+sub AddMethodsConstantsAndAttributesFromParentClasses
+{
+    # For the passed interface, recursively parse all parent
+    # IDLs in order to find out all inherited properties/methods.
+
+    my $object = shift;
+    my $dataNode = shift;
+    my $topBaseClass = "";
+
+    my @parents = @{$dataNode->parents};
+    my $parentsMax = @{$dataNode->parents};
+
+    my $constantsRef = $dataNode->constants;
+    my $functionsRef = $dataNode->functions;
+    my $attributesRef = $dataNode->attributes;
+
+    # Exception: For the DOM 'Node' is our topmost baseclass, not EventTargetNode.
+    if(($parentsMax eq 1) and ($parents[0] eq "EventTargetNode")) {
+        return;
+    }
+
+    my $ignoreParent = 1;
+    foreach(@{$dataNode->parents}) {
+        if($ignoreParent eq 1) {
+            # Ignore first parent class, already handled by the generation itself.
+            $ignoreParent = 0;
+            next;
+        }
+
+        my $interface = $object->StripModule($_);
+
+        # Step #1: Find the IDL file associated with 'interface'
+        $endCondition = 0;
+        $foundFilename = "";
+
+        foreach(@{$useDirectories}) {
+            if($foundFilename eq "") {
+                $object->ScanDirectory("$interface.idl", $_, $_, 0);
+            }
+        }
+
+        if($foundFilename ne "") {
+            print "  |  |>  Parsing parent IDL \"$foundFilename\" for interface \"$interface\"\n";
+
+            # Step #2: Parse the found IDL file (in quiet mode).
+            my $parser = IDLParser->new(1);
+            my $document = $parser->Parse($foundFilename, "");
+
+            foreach(@{$document->classes}) {
+                my $class = $_;
+
+                # Step #3: Collect constants & functions & attributes of this parent-class...
+                my $constantsMax = @{$class->constants};
+                my $functionsMax = @{$class->functions};
+                my $attributesMax = @{$class->attributes};
+
+                print "  |  |>  -> Inherting $constantsMax constants, $functionsMax functions, $attributesMax attributes...\n  |  |>\n";
+
+                # Step #4: Concatenate data...
+                foreach(@{$class->constants}) {
+                    push(@$constantsRef, $_);
+                }
+
+                foreach(@{$class->functions}) {
+                    push(@$functionsRef, $_);
+                }
+
+                foreach(@{$class->attributes}) {
+                    push(@$attributesRef, $_);
+                }
+
+                # Step #4: Enter recursive parent search...
+                AddMethodsConstantsAndAttributesFromParentClasses($object, $class);
+            }
+        } else {
+            die("Could NOT find specified parent interface \"$interface\"!\n");
+        }
+    }
+}
 # Helper for all CodeGenerator***.pm modules
 sub FindTopBaseClass
 {
@@ -390,7 +470,7 @@ sub ScanDirectory
     }
 
     if($condition) {
-      $foundFilename = "$useDirectory/$directory/$name";
+      $foundFilename = "$directory/$name";
 
       if($reportAllFiles eq 0) {
         $endCondition = 1;
index b7140dd8ae92afe456d17ca890966fc1ca52f802..13e5c217a9cf17efd9ace329d150898930a936d9 100644 (file)
@@ -209,13 +209,13 @@ sub GenerateHeader
     my $className = "JS$interfaceName";
     my $implClassName = $interfaceName;
     
-    # FIXME: For SVG we need to support more than one parent
-    # But no more than one parent can be "concrete"
-    # Right now concrete vs. abstract parents are not respected
-    # we just use the first parent listed and ignore all others
-    # Until we fix that, we special case SVG not to die here.
-    if (@{$dataNode->parents} > 1 && !($interfaceName =~ /SVG/)) {
-        die "A class can't have more than one parent";
+    # We only support multiple parents with SVG (for now).
+    if (@{$dataNode->parents} > 1) {
+        die "A class can't have more than one parent" unless $interfaceName =~ /SVG/;
+    
+        if(0) { # FIXME: Currently disabled until SVGAnimated*List works
+            $codeGenerator->AddMethodsConstantsAndAttributesFromParentClasses($dataNode);
+        }
     }
     
     my $hasLegacyParent = $dataNode->extendedAttributes->{"LegacyParent"};
index c709df38db53bc79e07f94fd664b8b7dd527a645..19b23014efc6afa05af2ba2150402521e63e4e07 100755 (executable)
@@ -56,11 +56,10 @@ die('Must specify input file.') unless defined($idlFile);
 die('Must specify output directory.') unless defined($outputDirectory);
 die('Must specify defines') unless defined($defines);
 
-
 # Parse the given IDL file.
 my $parser = IDLParser->new(1);
 my $document = $parser->Parse($idlFile, $defines);
-       
+
 # Generate desired output for given IDL file.
 my $codeGen = CodeGenerator->new(\@idlDirectories, $generator, $outputDirectory);
 $codeGen->ProcessDocument($document);