| Index: Source/bindings/scripts/SemanticAnalyzer.pm
|
| diff --git a/Source/bindings/scripts/SemanticAnalyzer.pm b/Source/bindings/scripts/SemanticAnalyzer.pm
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..0755e950461ac068d0e7bad3492948f3bf59614f
|
| --- /dev/null
|
| +++ b/Source/bindings/scripts/SemanticAnalyzer.pm
|
| @@ -0,0 +1,118 @@
|
| +# Copyright (C) 2013 Google Inc. All rights reserved.
|
| +#
|
| +# Redistribution and use in source and binary forms, with or without
|
| +# modification, are permitted provided that the following conditions are
|
| +# met:
|
| +#
|
| +# * Redistributions of source code must retain the above copyright
|
| +# notice, this list of conditions and the following disclaimer.
|
| +# * Redistributions in binary form must reproduce the above
|
| +# copyright notice, this list of conditions and the following disclaimer
|
| +# in the documentation and/or other materials provided with the
|
| +# distribution.
|
| +# * Neither the name of Google Inc. nor the names of its
|
| +# contributors may be used to endorse or promote products derived from
|
| +# this software without specific prior written permission.
|
| +#
|
| +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +package SemanticAnalyzer;
|
| +
|
| +sub new
|
| +{
|
| + my $class = shift;
|
| + my $idlAttributesFile = shift;
|
| +
|
| + $idlAttributes = {};
|
| + open FH, "<", $idlAttributesFile or die "Couldn't open $idlAttributesFile: $!";
|
| + while (my $line = <FH>) {
|
| + chomp $line;
|
| + next if $line =~ /^\s*#/;
|
| + next if $line =~ /^\s*$/;
|
| +
|
| + if ($line =~ /^\s*([^=\s]*)\s*=?\s*(.*)/) {
|
| + my $name = $1;
|
| + $idlAttributes{$name} = {};
|
| + if ($2) {
|
| + foreach my $rightValue (split /\|/, $2) {
|
| + $rightValue =~ s/^\s*|\s*$//g;
|
| + $rightValue = "VALUE_IS_MISSING" unless $rightValue;
|
| + $idlAttributes{$name}{$rightValue} = 1;
|
| + }
|
| + } else {
|
| + $idlAttributes{$name}{"VALUE_IS_MISSING"} = 1;
|
| + }
|
| + } else {
|
| + die "The format of " . basename($idlAttributesFile) . " is wrong: line $.\n";
|
| + }
|
| + }
|
| + close FH;
|
| +
|
| + my $reference = { };
|
| + bless($reference, $class);
|
| + return $reference;
|
| +}
|
| +
|
| +sub checkIDLAttributes
|
| +{
|
| + my $object = shift;
|
| + my $document = shift;
|
| + my $idlFile = shift;
|
| +
|
| + foreach my $interface (@{$document->interfaces}) {
|
| + $object->checkIfIDLAttributesExists($idlAttributes, $interface->extendedAttributes, $idlFile);
|
| +
|
| + foreach my $attribute (@{$interface->attributes}) {
|
| + $object->checkIfIDLAttributesExists($idlAttributes, $attribute->signature->extendedAttributes, $idlFile);
|
| + }
|
| +
|
| + foreach my $function (@{$interface->functions}) {
|
| + $object->checkIfIDLAttributesExists($idlAttributes, $function->signature->extendedAttributes, $idlFile);
|
| + foreach my $parameter (@{$function->parameters}) {
|
| + $object->checkIfIDLAttributesExists($idlAttributes, $parameter->extendedAttributes, $idlFile);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +sub checkIfIDLAttributesExists
|
| +{
|
| + my $object = shift;
|
| + my $extendedAttributes = shift;
|
| + my $idlFile = shift;
|
| +
|
| + my $error;
|
| + OUTER: for my $name (keys %$extendedAttributes) {
|
| + if (!exists $object->idlAttributes->{$name}) {
|
| + # if (!exists $idlAttributes->{$name}) {
|
| + $error = "Unknown IDL attribute [$name] is found at $idlFile.";
|
| + last OUTER;
|
| + }
|
| + if ($object->idlAttributes->{$name}{"*"}) {
|
| + next;
|
| + }
|
| + for my $rightValue (split /\s*\|\s*/, $extendedAttributes->{$name}) {
|
| + if (!exists $object->idlAttributes->{$name}{$rightValue}) {
|
| + $error = "Unknown IDL attribute [$name=" . $extendedAttributes->{$name} . "] is found at $idlFile.";
|
| + last OUTER;
|
| + }
|
| + }
|
| + }
|
| + if ($error) {
|
| + die "IDL ATTRIBUTE CHECKER ERROR: $error
|
| +If you want to add a new IDL attribute, you need to add it to bindings/scripts/IDLAttributes.txt and add explanations to the Blink IDL document (http://chromium.org/blink/webidl).
|
| +";
|
| + }
|
| +}
|
| +
|
| +1;
|
|
|