| OLD | NEW |
| 1 # | 1 # |
| 2 # KDOM IDL parser | 2 # KDOM IDL parser |
| 3 # | 3 # |
| 4 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> | 4 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> |
| 5 # | 5 # |
| 6 # This library is free software; you can redistribute it and/or | 6 # This library is free software; you can redistribute it and/or |
| 7 # modify it under the terms of the GNU Library General Public | 7 # modify it under the terms of the GNU Library General Public |
| 8 # License as published by the Free Software Foundation; either | 8 # License as published by the Free Software Foundation; either |
| 9 # version 2 of the License, or (at your option) any later version. | 9 # version 2 of the License, or (at your option) any later version. |
| 10 # | 10 # |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 # Used to represent 'interface' blocks | 43 # Used to represent 'interface' blocks |
| 44 struct( domInterface => { | 44 struct( domInterface => { |
| 45 name => '$', # Class identifier | 45 name => '$', # Class identifier |
| 46 parents => '@', # List of strings | 46 parents => '@', # List of strings |
| 47 constants => '@', # List of 'domConstant' | 47 constants => '@', # List of 'domConstant' |
| 48 functions => '@', # List of 'domFunction' | 48 functions => '@', # List of 'domFunction' |
| 49 attributes => '@', # List of 'domAttribute' | 49 attributes => '@', # List of 'domAttribute' |
| 50 extendedAttributes => '$', # Extended attributes | 50 extendedAttributes => '$', # Extended attributes |
| 51 constructors => '@', # Constructors, list of 'domFunction' | 51 constructors => '@', # Constructors, list of 'domFunction' |
| 52 customConstructors => '@', # Custom constructors, list of 'domFunction' |
| 52 isException => '$', # Used for exception interfaces | 53 isException => '$', # Used for exception interfaces |
| 53 }); | 54 }); |
| 54 | 55 |
| 55 # Used to represent domInterface contents (name of method, signature) | 56 # Used to represent domInterface contents (name of method, signature) |
| 56 struct( domFunction => { | 57 struct( domFunction => { |
| 57 isStatic => '$', | 58 isStatic => '$', |
| 58 signature => '$', # Return type/Object name/extended attributes | 59 signature => '$', # Return type/Object name/extended attributes |
| 59 parameters => '@', # List of 'domSignature' | 60 parameters => '@', # List of 'domSignature' |
| 60 }); | 61 }); |
| 61 | 62 |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 foreach my $constant (@{$definition->constants}) { | 367 foreach my $constant (@{$definition->constants}) { |
| 367 if (exists $typedefs{$constant->type}) { | 368 if (exists $typedefs{$constant->type}) { |
| 368 my $typedef = $typedefs{$constant->type}; | 369 my $typedef = $typedefs{$constant->type}; |
| 369 $self->assertNoExtendedAttributesInTypedef($constant->type,
__LINE__); | 370 $self->assertNoExtendedAttributesInTypedef($constant->type,
__LINE__); |
| 370 $constant->type($typedef->type); | 371 $constant->type($typedef->type); |
| 371 } | 372 } |
| 372 } | 373 } |
| 373 foreach my $attribute (@{$definition->attributes}) { | 374 foreach my $attribute (@{$definition->attributes}) { |
| 374 $self->applyTypedefsForSignature($attribute->signature); | 375 $self->applyTypedefsForSignature($attribute->signature); |
| 375 } | 376 } |
| 376 foreach my $function (@{$definition->functions}, @{$definition->cons
tructors}) { | 377 foreach my $function (@{$definition->functions}, @{$definition->cons
tructors}, @{$definition->customConstructors}) { |
| 377 $self->applyTypedefsForSignature($function->signature); | 378 $self->applyTypedefsForSignature($function->signature); |
| 378 foreach my $signature (@{$function->parameters}) { | 379 foreach my $signature (@{$function->parameters}) { |
| 379 $self->applyTypedefsForSignature($signature); | 380 $self->applyTypedefsForSignature($signature); |
| 380 } | 381 } |
| 381 } | 382 } |
| 382 } | 383 } |
| 383 } | 384 } |
| 384 } | 385 } |
| 385 | 386 |
| 386 sub applyTypedefsForSignature | 387 sub applyTypedefsForSignature |
| (...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1131 $self->assertTokenValue($self->getToken(), "attribute", __LINE__); | 1132 $self->assertTokenValue($self->getToken(), "attribute", __LINE__); |
| 1132 $newDataNode->signature(domSignature->new()); | 1133 $newDataNode->signature(domSignature->new()); |
| 1133 my $type = $self->parseType(); | 1134 my $type = $self->parseType(); |
| 1134 $newDataNode->signature->isNullable(typeHasNullableSuffix($type)); | 1135 $newDataNode->signature->isNullable(typeHasNullableSuffix($type)); |
| 1135 # Remove all "?" in the type declaration, e.g. "double?" -> "double". | 1136 # Remove all "?" in the type declaration, e.g. "double?" -> "double". |
| 1136 $newDataNode->signature->type(typeRemoveNullableSuffix($type)); | 1137 $newDataNode->signature->type(typeRemoveNullableSuffix($type)); |
| 1137 my $token = $self->getToken(); | 1138 my $token = $self->getToken(); |
| 1138 $self->assertTokenType($token, IdentifierToken); | 1139 $self->assertTokenType($token, IdentifierToken); |
| 1139 $newDataNode->signature->name($token->value()); | 1140 $newDataNode->signature->name($token->value()); |
| 1140 $self->assertTokenValue($self->getToken(), ";", __LINE__); | 1141 $self->assertTokenValue($self->getToken(), ";", __LINE__); |
| 1142 # CustomConstructor may also be used on attributes. |
| 1143 if (defined $extendedAttributeList->{"CustomConstructors"}) { |
| 1144 delete $extendedAttributeList->{"CustomConstructors"}; |
| 1145 $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING"; |
| 1146 } |
| 1141 $newDataNode->signature->extendedAttributes($extendedAttributeList); | 1147 $newDataNode->signature->extendedAttributes($extendedAttributeList); |
| 1142 return $newDataNode; | 1148 return $newDataNode; |
| 1143 } | 1149 } |
| 1144 $self->assertUnexpectedToken($next->value(), __LINE__); | 1150 $self->assertUnexpectedToken($next->value(), __LINE__); |
| 1145 } | 1151 } |
| 1146 | 1152 |
| 1147 sub parseInherit | 1153 sub parseInherit |
| 1148 { | 1154 { |
| 1149 my $self = shift; | 1155 my $self = shift; |
| 1150 my $next = $self->nextToken(); | 1156 my $next = $self->nextToken(); |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1490 my $attr = shift; | 1496 my $attr = shift; |
| 1491 | 1497 |
| 1492 for my $key (keys %{$attr}) { | 1498 for my $key (keys %{$attr}) { |
| 1493 if ($key eq "Constructor") { | 1499 if ($key eq "Constructor") { |
| 1494 push(@{$extendedAttributeList->{"Constructors"}}, $attr->{$key}); | 1500 push(@{$extendedAttributeList->{"Constructors"}}, $attr->{$key}); |
| 1495 } elsif ($key eq "Constructors") { | 1501 } elsif ($key eq "Constructors") { |
| 1496 my @constructors = @{$attr->{$key}}; | 1502 my @constructors = @{$attr->{$key}}; |
| 1497 foreach my $constructor (@constructors) { | 1503 foreach my $constructor (@constructors) { |
| 1498 push(@{$extendedAttributeList->{"Constructors"}}, $constructor); | 1504 push(@{$extendedAttributeList->{"Constructors"}}, $constructor); |
| 1499 } | 1505 } |
| 1506 } elsif ($key eq "CustomConstructor") { |
| 1507 push(@{$extendedAttributeList->{"CustomConstructors"}}, $attr->{$key
}); |
| 1508 } elsif ($key eq "CustomConstructors") { |
| 1509 my @customConstructors = @{$attr->{$key}}; |
| 1510 foreach my $customConstructor (@customConstructors) { |
| 1511 push(@{$extendedAttributeList->{"CustomConstructors"}}, $customC
onstructor); |
| 1512 } |
| 1500 } else { | 1513 } else { |
| 1501 $extendedAttributeList->{$key} = $attr->{$key}; | 1514 $extendedAttributeList->{$key} = $attr->{$key}; |
| 1502 } | 1515 } |
| 1503 } | 1516 } |
| 1504 } | 1517 } |
| 1505 | 1518 |
| 1506 sub parseExtendedAttributeList | 1519 sub parseExtendedAttributeList |
| 1507 { | 1520 { |
| 1508 my $self = shift; | 1521 my $self = shift; |
| 1509 my $next = $self->nextToken(); | 1522 my $next = $self->nextToken(); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1576 $attrs->{$name} = $self->parseArgumentList(); | 1589 $attrs->{$name} = $self->parseArgumentList(); |
| 1577 $self->assertTokenValue($self->getToken(), ")", __LINE__); | 1590 $self->assertTokenValue($self->getToken(), ")", __LINE__); |
| 1578 return $attrs; | 1591 return $attrs; |
| 1579 } | 1592 } |
| 1580 if ($next->value() eq "=") { | 1593 if ($next->value() eq "=") { |
| 1581 $self->assertTokenValue($self->getToken(), "=", __LINE__); | 1594 $self->assertTokenValue($self->getToken(), "=", __LINE__); |
| 1582 $attrs->{$name} = $self->parseExtendedAttributeRest2(); | 1595 $attrs->{$name} = $self->parseExtendedAttributeRest2(); |
| 1583 return $attrs; | 1596 return $attrs; |
| 1584 } | 1597 } |
| 1585 | 1598 |
| 1586 if ($name eq "Constructor") { | 1599 if ($name eq "Constructor" || $name eq "CustomConstructor") { |
| 1587 $attrs->{$name} = []; | 1600 $attrs->{$name} = []; |
| 1588 } else { | 1601 } else { |
| 1589 $attrs->{$name} = "VALUE_IS_MISSING"; | 1602 $attrs->{$name} = "VALUE_IS_MISSING"; |
| 1590 } | 1603 } |
| 1591 return $attrs; | 1604 return $attrs; |
| 1592 } | 1605 } |
| 1593 | 1606 |
| 1594 sub parseExtendedAttributeRest2 | 1607 sub parseExtendedAttributeRest2 |
| 1595 { | 1608 { |
| 1596 my $self = shift; | 1609 my $self = shift; |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2171 $newDataNode->signature(domSignature->new()); | 2184 $newDataNode->signature(domSignature->new()); |
| 2172 $newDataNode->signature->name("NamedConstructor"); | 2185 $newDataNode->signature->name("NamedConstructor"); |
| 2173 $newDataNode->signature->extendedAttributes($extendedAttributeList); | 2186 $newDataNode->signature->extendedAttributes($extendedAttributeList); |
| 2174 my %attributes = %{$extendedAttributeList->{"NamedConstructor"}}; | 2187 my %attributes = %{$extendedAttributeList->{"NamedConstructor"}}; |
| 2175 my @attributeKeys = keys (%attributes); | 2188 my @attributeKeys = keys (%attributes); |
| 2176 my $constructorName = $attributeKeys[0]; | 2189 my $constructorName = $attributeKeys[0]; |
| 2177 push(@{$newDataNode->parameters}, @{$attributes{$constructorName}}); | 2190 push(@{$newDataNode->parameters}, @{$attributes{$constructorName}}); |
| 2178 $extendedAttributeList->{"NamedConstructor"} = $constructorName; | 2191 $extendedAttributeList->{"NamedConstructor"} = $constructorName; |
| 2179 push(@{$interface->constructors}, $newDataNode); | 2192 push(@{$interface->constructors}, $newDataNode); |
| 2180 } | 2193 } |
| 2194 if (defined $extendedAttributeList->{"CustomConstructors"}) { |
| 2195 my @customConstructorParams = @{$extendedAttributeList->{"CustomConstruc
tors"}}; |
| 2196 my $index = (@customConstructorParams == 1) ? 0 : 1; |
| 2197 foreach my $param (@customConstructorParams) { |
| 2198 my $customConstructor = domFunction->new(); |
| 2199 $customConstructor->signature(domSignature->new()); |
| 2200 $customConstructor->signature->name("CustomConstructor"); |
| 2201 $customConstructor->signature->extendedAttributes($extendedAttribute
List); |
| 2202 $customConstructor->parameters($param); |
| 2203 $customConstructor->{overloadedIndex} = $index++; |
| 2204 push(@{$interface->customConstructors}, $customConstructor); |
| 2205 } |
| 2206 delete $extendedAttributeList->{"CustomConstructors"}; |
| 2207 $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING"; |
| 2208 } |
| 2181 $interface->extendedAttributes($extendedAttributeList); | 2209 $interface->extendedAttributes($extendedAttributeList); |
| 2182 } | 2210 } |
| 2183 | 2211 |
| 2184 1; | 2212 1; |
| OLD | NEW |