| Index: webkit/port/bindings/scripts/IDLParser.pm | 
| =================================================================== | 
| --- webkit/port/bindings/scripts/IDLParser.pm	(revision 19361) | 
| +++ webkit/port/bindings/scripts/IDLParser.pm	(working copy) | 
| @@ -1,441 +0,0 @@ | 
| -# | 
| -# KDOM IDL parser | 
| -# | 
| -# Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> | 
| -# | 
| -# This file is part of the KDE project | 
| -# | 
| -# This library is free software; you can redistribute it and/or | 
| -# modify it under the terms of the GNU Library General Public | 
| -# License as published by the Free Software Foundation; either | 
| -# version 2 of the License, or (at your option) any later version. | 
| -# | 
| -# This library is distributed in the hope that it will be useful, | 
| -# but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| -# Library General Public License for more details. | 
| -# | 
| -# You should have received a copy of the GNU Library General Public License | 
| -# aint with this library; see the file COPYING.LIB.  If not, write to | 
| -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 
| -# Boston, MA 02111-1307, USA. | 
| -# | 
| - | 
| -package IDLParser; | 
| - | 
| -use IDLStructure; | 
| - | 
| -use constant MODE_UNDEF    => 0; # Default mode. | 
| - | 
| -use constant MODE_MODULE  => 10; # 'module' section | 
| -use constant MODE_INTERFACE  => 11; # 'interface' section | 
| -use constant MODE_EXCEPTION  => 12; # 'exception' section | 
| -use constant MODE_ALIAS    => 13; # 'alias' section | 
| - | 
| -# Helper variables | 
| -my @temporaryContent = ""; | 
| - | 
| -my $parseMode = MODE_UNDEF; | 
| -my $preservedParseMode = MODE_UNDEF; | 
| - | 
| -my $beQuiet; # Should not display anything on STDOUT? | 
| -my $document = 0; # Will hold the resulting 'idlDocument' | 
| - | 
| -my $directive = ""; | 
| - | 
| -# Default Constructor | 
| -sub new | 
| -{ | 
| -    my $object = shift; | 
| -    my $reference = { }; | 
| - | 
| -    $document = 0; | 
| -    $beQuiet = shift; | 
| - | 
| -    bless($reference, $object); | 
| -    return $reference; | 
| -} | 
| - | 
| - | 
| -sub ParseInheritance | 
| -{ | 
| -    my $object = shift; | 
| -    my $fileName = shift; | 
| -    my $defines = shift; | 
| -    my $preprocessor = shift; | 
| - | 
| -    $directive = "inheritance"; | 
| -    return $object->ParseImpl($fileName, $defines, $preprocessor); | 
| -} | 
| - | 
| -# Returns the parsed 'idlDocument' | 
| -sub Parse | 
| -{ | 
| -    my $object = shift; | 
| -    my $fileName = shift; | 
| -    my $defines = shift; | 
| -    my $preprocessor = shift; | 
| - | 
| -    $directive = ""; | 
| -    return $object->ParseImpl($fileName, $defines, $preprocessor); | 
| -} | 
| - | 
| -sub ParseImpl | 
| -{ | 
| -    my $object = shift; | 
| -    my $fileName = shift; | 
| -    my $defines = shift; | 
| -    my $preprocessor = shift; | 
| - | 
| -    if (!$preprocessor) { | 
| -        $preprocessor = "/usr/bin/gcc -E -P -x c++"; | 
| -    } | 
| - | 
| -    if (!$defines) { | 
| -        $defines = ""; | 
| -    } | 
| - | 
| -    print " | *** Starting to parse $fileName...\n |\n" unless $beQuiet; | 
| - | 
| -    open FILE, $preprocessor . " " . join(" ", (map { "-D$_" } split(/ /, $defines))) . " ". $fileName . "|" or die "Could not open $fileName"; | 
| -    my @documentContent = <FILE>; | 
| -    close FILE; | 
| - | 
| -    my $dataAvailable = 0; | 
| - | 
| -    # Simple IDL Parser (tm) | 
| -    foreach (@documentContent) { | 
| -        my $newParseMode = $object->DetermineParseMode($_); | 
| - | 
| -        if ($newParseMode ne MODE_UNDEF) { | 
| -            if ($dataAvailable eq 0) { | 
| -                $dataAvailable = 1; # Start node building... | 
| -            } else { | 
| -                $object->ProcessSection(); | 
| -            } | 
| -        } | 
| - | 
| -        # Update detected data stream mode... | 
| -        if ($newParseMode ne MODE_UNDEF) { | 
| -            $parseMode = $newParseMode; | 
| -        } | 
| - | 
| -        push(@temporaryContent, $_); | 
| -    } | 
| - | 
| -    # Check if there is anything remaining to parse... | 
| -    if (($parseMode ne MODE_UNDEF) and ($#temporaryContent > 0)) { | 
| -        $object->ProcessSection(); | 
| -    } | 
| - | 
| -    print " | *** Finished parsing!\n" unless $beQuiet; | 
| - | 
| -    $document->fileName($fileName); | 
| - | 
| -    return $document; | 
| -} | 
| - | 
| -sub ParseModule | 
| -{ | 
| -    my $object = shift; | 
| -    my $dataNode = shift; | 
| - | 
| -    print " |- Trying to parse module...\n" unless $beQuiet; | 
| - | 
| -    my $data = join("", @temporaryContent); | 
| -    $data =~ /$IDLStructure::moduleSelector/; | 
| - | 
| -    my $moduleName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); | 
| -    $dataNode->module($moduleName); | 
| - | 
| -    print "  |----> Module; NAME \"$moduleName\"\n |-\n |\n" unless $beQuiet; | 
| -} | 
| - | 
| -sub dumpExtendedAttributes | 
| -{ | 
| -    my $padStr = shift; | 
| -    my $attrs = shift; | 
| - | 
| -    if (!%{$attrs}) { | 
| -        return ""; | 
| -    } | 
| - | 
| -    my @temp; | 
| -    while (($name, $value) = each(%{$attrs})) { | 
| -        push(@temp, "$name=$value"); | 
| -    } | 
| - | 
| -    return $padStr . "[" . join(", ", @temp) . "]"; | 
| -} | 
| - | 
| -sub parseExtendedAttributes | 
| -{ | 
| -    my $str = shift; | 
| -    $str =~ s/\[\s*(.*)\]/$1/g; | 
| - | 
| -    my %attrs = (); | 
| - | 
| -    foreach my $value (split(/\s*,\s*/, $str)) { | 
| -        ($name,$value) = split(/\s*=\s*/, $value, 2); | 
| - | 
| -        # Attributes with no value are set to be true | 
| -        $value = 1 unless defined $value; | 
| -        $attrs{$name} = $value; | 
| -    } | 
| - | 
| -    return \%attrs; | 
| -} | 
| - | 
| -sub ParseInterface | 
| -{ | 
| -    my $object = shift; | 
| -    my $dataNode = shift; | 
| -    my $sectionName = shift; | 
| - | 
| -    my $data = join("", @temporaryContent); | 
| - | 
| -    # Look for end-of-interface mark | 
| -    $data =~ /};/g; | 
| -    $data = substr($data, index($data, $sectionName), pos($data) - length($data)); | 
| - | 
| -    $data =~ s/[\n\r]/ /g; | 
| - | 
| -    # Beginning of the regexp parsing magic | 
| -    if ($sectionName eq "exception") { | 
| -        print " |- Trying to parse exception...\n" unless $beQuiet; | 
| - | 
| -        my $exceptionName = ""; | 
| -        my $exceptionData = ""; | 
| -        my $exceptionDataName = ""; | 
| -        my $exceptionDataType = ""; | 
| - | 
| -        # Match identifier of the exception, and enclosed data... | 
| -        $data =~ /$IDLStructure::exceptionSelector/; | 
| -        $exceptionName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); | 
| -        $exceptionData = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); | 
| - | 
| -        ('' =~ /^/); # Reset variables needed for regexp matching | 
| - | 
| -        # ... parse enclosed data (get. name & type) | 
| -        $exceptionData =~ /$IDLStructure::exceptionSubSelector/; | 
| -        $exceptionDataType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); | 
| -        $exceptionDataName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); | 
| - | 
| -        # Fill in domClass datastructure | 
| -        $dataNode->name($exceptionName); | 
| - | 
| -        my $newDataNode = new domAttribute(); | 
| -        $newDataNode->type("readonly attribute"); | 
| -        $newDataNode->signature(new domSignature()); | 
| - | 
| -        $newDataNode->signature->name($exceptionDataName); | 
| -        $newDataNode->signature->type($exceptionDataType); | 
| - | 
| -        my $arrayRef = $dataNode->attributes; | 
| -        push(@$arrayRef, $newDataNode); | 
| - | 
| -        print "  |----> Exception; NAME \"$exceptionName\" DATA TYPE \"$exceptionDataType\" DATA NAME \"$exceptionDataName\"\n |-\n |\n" unless $beQuiet; | 
| -    } elsif ($sectionName eq "interface") { | 
| -        print " |- Trying to parse interface...\n" unless $beQuiet; | 
| - | 
| -        my $interfaceName = ""; | 
| -        my $interfaceData = ""; | 
| - | 
| -        # Match identifier of the interface, and enclosed data... | 
| -        $data =~ /$IDLStructure::interfaceSelector/; | 
| - | 
| -        $interfaceExtendedAttributes = (defined($1) ? $1 : " "); chop($interfaceExtendedAttributes); | 
| -        $interfaceName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); | 
| -        $interfaceBase = (defined($3) ? $3 : ""); | 
| -        $interfaceData = (defined($4) ? $4 : die("Parsing error!\nSource:\n$data\n)")); | 
| - | 
| -        # Fill in known parts of the domClass datastructure now... | 
| -        $dataNode->name($interfaceName); | 
| -        $dataNode->extendedAttributes(parseExtendedAttributes($interfaceExtendedAttributes)); | 
| - | 
| -        # Inheritance detection | 
| -        my @interfaceParents = split(/,/, $interfaceBase); | 
| -        foreach(@interfaceParents) { | 
| -            my $line = $_; | 
| -            $line =~ s/\s*//g; | 
| - | 
| -            my $arrayRef = $dataNode->parents; | 
| -            push(@$arrayRef, $line); | 
| -        } | 
| - | 
| -        return if ($directive eq "inheritance"); | 
| - | 
| -        $interfaceData =~ s/[\n\r]/ /g; | 
| -        my @interfaceMethods = split(/;/, $interfaceData); | 
| - | 
| -        foreach my $line (@interfaceMethods) { | 
| -            if ($line =~ /[ \t]attribute[ \t]/) { | 
| -                $line =~ /$IDLStructure::interfaceAttributeSelector/; | 
| - | 
| -                my $attributeType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $attributeExtendedAttributes = (defined($2) ? $2 : " "); chop($attributeExtendedAttributes); | 
| - | 
| -                my $attributeDataType = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $attributeDataName = (defined($4) ? $4 : die("Parsing error!\nSource:\n$line\n)")); | 
| - | 
| -                ('' =~ /^/); # Reset variables needed for regexp matching | 
| - | 
| -                $line =~ /$IDLStructure::getterRaisesSelector/; | 
| -                my $getterException = (defined($1) ? $1 : ""); | 
| - | 
| -                $line =~ /$IDLStructure::setterRaisesSelector/; | 
| -                my $setterException = (defined($1) ? $1 : ""); | 
| - | 
| -                my $newDataNode = new domAttribute(); | 
| -                $newDataNode->type($attributeType); | 
| -                $newDataNode->signature(new domSignature()); | 
| - | 
| -                $newDataNode->signature->name($attributeDataName); | 
| -                $newDataNode->signature->type($attributeDataType); | 
| -                $newDataNode->signature->extendedAttributes(parseExtendedAttributes($attributeExtendedAttributes)); | 
| - | 
| -                my $arrayRef = $dataNode->attributes; | 
| -                push(@$arrayRef, $newDataNode); | 
| - | 
| -                print "  |  |>  Attribute; TYPE \"$attributeType\" DATA NAME \"$attributeDataName\" DATA TYPE \"$attributeDataType\" GET EXCEPTION? \"$getterException\" SET EXCEPTION? \"$setterException\"" . | 
| -                    dumpExtendedAttributes("\n  |                 ", $newDataNode->signature->extendedAttributes) . "\n" unless $beQuiet; | 
| - | 
| -                $getterException =~ s/\s+//g; | 
| -                $setterException =~ s/\s+//g; | 
| -                @{$newDataNode->getterExceptions} = split(/,/, $getterException); | 
| -                @{$newDataNode->setterExceptions} = split(/,/, $setterException); | 
| -            } elsif (($line !~ s/^\s*$//g) and ($line !~ /^\s*const/)) { | 
| -                $line =~ /$IDLStructure::interfaceMethodSelector/ or die "Parsing error!\nSource:\n$line\n)"; | 
| - | 
| -                my $methodExtendedAttributes = (defined($1) ? $1 : " "); chop($methodExtendedAttributes); | 
| -                my $methodType = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $methodName = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $methodSignature = (defined($4) ? $4 : die("Parsing error!\nSource:\n$line\n)")); | 
| - | 
| -                ('' =~ /^/); # Reset variables needed for regexp matching | 
| - | 
| -                $line =~ /$IDLStructure::raisesSelector/; | 
| -                my $methodException = (defined($1) ? $1 : ""); | 
| - | 
| -                my $newDataNode = new domFunction(); | 
| - | 
| -                $newDataNode->signature(new domSignature()); | 
| -                $newDataNode->signature->name($methodName); | 
| -                $newDataNode->signature->type($methodType); | 
| -                $newDataNode->signature->extendedAttributes(parseExtendedAttributes($methodExtendedAttributes)); | 
| - | 
| -                print "  |  |-  Method; TYPE \"$methodType\" NAME \"$methodName\" EXCEPTION? \"$methodException\"" . | 
| -                    dumpExtendedAttributes("\n  |              ", $newDataNode->signature->extendedAttributes) . "\n" unless $beQuiet; | 
| - | 
| -                $methodException =~ s/\s+//g; | 
| -                @{$newDataNode->raisesExceptions} = split(/,/, $methodException); | 
| - | 
| -                my @params = split(/,/, $methodSignature); | 
| -                foreach(@params) { | 
| -                    my $line = $_; | 
| - | 
| -                    $line =~ /$IDLStructure::interfaceParameterSelector/; | 
| -                    my $paramExtendedAttributes = (defined($1) ? $1 : " "); chop($paramExtendedAttributes); | 
| -                    my $paramType = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                    my $paramName = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); | 
| - | 
| -                    my $paramDataNode = new domSignature(); | 
| -                    $paramDataNode->name($paramName); | 
| -                    $paramDataNode->type($paramType); | 
| -                    $paramDataNode->extendedAttributes(parseExtendedAttributes($paramExtendedAttributes)); | 
| - | 
| -                    my $arrayRef = $newDataNode->parameters; | 
| -                    push(@$arrayRef, $paramDataNode); | 
| - | 
| -                    print "  |   |>  Param; TYPE \"$paramType\" NAME \"$paramName\"" . | 
| -                        dumpExtendedAttributes("\n  |              ", $paramDataNode->extendedAttributes) . "\n" unless $beQuiet; | 
| -                } | 
| - | 
| -                my $arrayRef = $dataNode->functions; | 
| -                push(@$arrayRef, $newDataNode); | 
| -            } elsif ($line =~ /^\s*const/) { | 
| -                $line =~ /$IDLStructure::constantSelector/; | 
| -                my $constType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $constName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); | 
| -                my $constValue = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); | 
| - | 
| -                my $newDataNode = new domConstant(); | 
| -                $newDataNode->name($constName); | 
| -                $newDataNode->type($constType); | 
| -                $newDataNode->value($constValue); | 
| - | 
| -                my $arrayRef = $dataNode->constants; | 
| -                push(@$arrayRef, $newDataNode); | 
| - | 
| -                print "  |   |>  Constant; TYPE \"$constType\" NAME \"$constName\" VALUE \"$constValue\"\n" unless $beQuiet; | 
| -            } | 
| -        } | 
| - | 
| -        print "  |----> Interface; NAME \"$interfaceName\"" . | 
| -            dumpExtendedAttributes("\n  |                 ", $dataNode->extendedAttributes) . "\n |-\n |\n" unless $beQuiet; | 
| -    } | 
| -} | 
| - | 
| -# Internal helper | 
| -sub DetermineParseMode | 
| -{ | 
| -    my $object = shift; | 
| -    my $line = shift; | 
| - | 
| -    my $mode = MODE_UNDEF; | 
| -    if ($_ =~ /module/) { | 
| -        $mode = MODE_MODULE; | 
| -    } elsif ($_ =~ /interface/) { | 
| -        $mode = MODE_INTERFACE; | 
| -    } elsif ($_ =~ /exception/) { | 
| -        $mode = MODE_EXCEPTION; | 
| -    } elsif ($_ =~ /alias/) { | 
| -        $mode = MODE_ALIAS; | 
| -    } | 
| - | 
| -    return $mode; | 
| -} | 
| - | 
| -# Internal helper | 
| -sub ProcessSection | 
| -{ | 
| -    my $object = shift; | 
| - | 
| -    if ($parseMode eq MODE_MODULE) { | 
| -        die ("Two modules in one file! Fatal error!\n") if ($document ne 0); | 
| -        $document = new idlDocument(); | 
| -        $object->ParseModule($document); | 
| -    } elsif ($parseMode eq MODE_INTERFACE) { | 
| -        my $node = new domClass(); | 
| -        $object->ParseInterface($node, "interface"); | 
| - | 
| -        die ("No module specified! Fatal Error!\n") if ($document eq 0); | 
| -        my $arrayRef = $document->classes; | 
| -        push(@$arrayRef, $node); | 
| -    } elsif($parseMode eq MODE_EXCEPTION) { | 
| -        my $node = new domClass(); | 
| -        $object->ParseInterface($node, "exception"); | 
| - | 
| -        die ("No module specified! Fatal Error!\n") if ($document eq 0); | 
| -        my $arrayRef = $document->classes; | 
| -        push(@$arrayRef, $node); | 
| -    } elsif($parseMode eq MODE_ALIAS) { | 
| -        print " |- Trying to parse alias...\n" unless $beQuiet; | 
| - | 
| -        my $line = join("", @temporaryContent); | 
| -        $line =~ /$IDLStructure::aliasSelector/; | 
| - | 
| -        my $interfaceName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); | 
| -        my $wrapperName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); | 
| - | 
| -        print "  |----> Alias; INTERFACE \"$interfaceName\" WRAPPER \"$wrapperName\"\n |-\n |\n" unless $beQuiet; | 
| - | 
| -        # FIXME: Check if alias is already in aliases | 
| -        my $aliases = $document->aliases; | 
| -        $aliases->{$interfaceName} = $wrapperName; | 
| -    } | 
| - | 
| -    @temporaryContent = ""; | 
| -} | 
| - | 
| -1; | 
|  |