idlc/CustomTarget_parser_test.mk | 20 idlc/test/parser/attribute.tests | 6 idlc/test/parser/constant.tests | 14 idlc/test/parser/polystruct.tests | 5 idlc/test/parser/published.tests | 43 + offapi/com/sun/star/form/FormController.idl | 7 offapi/com/sun/star/sheet/ExternalReference.idl | 24 - offapi/com/sun/star/sheet/SpreadsheetDocument.idl | 13 offapi/type_reference/offapi.idl | 4 solenv/bin/exectest.pl | 11 unoidl/source/sourceprovider-parser.y | 483 +++++++++++++++++----- unoidl/source/sourceprovider-scanner.hxx | 8 12 files changed, 493 insertions(+), 145 deletions(-)
New commits: commit 9ec37c37b080ac26fde8e0370af44b6858858731 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 18:27:43 2013 +0100 Fix unoidl sourceprovider polystruct argument checks Change-Id: Ib7ee3188b87b9b4216214b65347e34970e1b92a5 (cherry picked from commit bd21de41e30e47f7d1c2ff6d4bdcc4a7f0e72103) diff --git a/idlc/test/parser/polystruct.tests b/idlc/test/parser/polystruct.tests index 129f567..89b0817 100644 --- a/idlc/test/parser/polystruct.tests +++ b/idlc/test/parser/polystruct.tests @@ -133,6 +133,11 @@ struct Struct1<T> { long member; }; struct Struct2 { Struct1<Struct2> member; }; +EXPECT SUCCESS "polystruct.tests 25a": +struct Struct<T> { long member; }; +interface X { [attribute] Struct<X> member; }; + + EXPECT FAILURE "polystruct.tests 26": struct Struct1<T> { long member; }; struct Struct2<T> { long member; }; diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index ec81083..e377ac4 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -802,6 +802,7 @@ Found findEntity( } } + bool checkTypeArgument( YYLTYPE location, yyscan_t yyscanner, unoidl::detail::SourceProviderType const & type) @@ -817,11 +818,33 @@ bool checkTypeArgument( location, yyscanner, "bad instantiated polymorphic struct type argument"); return false; + case unoidl::detail::SourceProviderType::TYPE_SEQUENCE: + return checkTypeArgument(location, yyscanner, type.subtypes.front()); default: return true; } } +bool checkInstantiatedPolymorphicStructTypeArgument( + unoidl::detail::SourceProviderType const & type, OUString const & name) +{ + if (type.type + == unoidl::detail::SourceProviderType::TYPE_INSTANTIATED_POLYMORPHIC_STRUCT) + { + for (std::vector<unoidl::detail::SourceProviderType>::const_iterator i( + type.subtypes.begin()); + i != type.subtypes.end(); ++i) + { + if (checkInstantiatedPolymorphicStructTypeArgument(*i, name) + || i->getName() == name) // no need to worry about typedef + { + return true; + } + } + } + return false; +} + std::vector<OUString> annotations(bool deprecated) { std::vector<OUString> ann; if (deprecated) { @@ -1161,16 +1184,7 @@ typeParameters: pad(getCurrentPad<unoidl::detail::SourceProviderPolymorphicStructTypeTemplateEntityPad>( data)); OUString id(convertName($3)); - if (nameHasSameIdentifierAs(data->currentName, id)) { - error( - @3, yyscanner, - ("polymorphic struct type template " + data->currentName - + " type parameter " + id - + " has same unqualified identifer as the type itself")); - YYERROR; - } - if (std::find( - pad->typeParameters.begin(), pad->typeParameters.end(), id) + if (std::find(pad->typeParameters.begin(), pad->typeParameters.end(), id) != pad->typeParameters.end()) { error( @@ -1189,14 +1203,6 @@ typeParameters: pad(getCurrentPad<unoidl::detail::SourceProviderPolymorphicStructTypeTemplateEntityPad>( data)); OUString id(convertName($1)); - if (nameHasSameIdentifierAs(data->currentName, id)) { - error( - @1, yyscanner, - ("polymorphic struct type template " + data->currentName - + " type parameter " + id - + " has same unqualified identifer as the type itself")); - YYERROR; - } assert(pad->typeParameters.empty()); pad->typeParameters.push_back(id); } @@ -1288,13 +1294,25 @@ structMember: default: break; } - if (t.getName() == data->currentName) { // no need to worry about typedefs + if (t.type != unoidl::detail::SourceProviderType::TYPE_PARAMETER + && t.getName() == data->currentName) // no need to worry about typedef + { error( @2, yyscanner, ("struct/exception type " + data->currentName + " direct member " + id + " has same type as the type itself")); YYERROR; } + if (checkInstantiatedPolymorphicStructTypeArgument(t, data->currentName)) + { + error( + @2, yyscanner, + ("struct/exception type " + data->currentName + " direct member " + + id + + (" has instantiated polymorphic struct type that uses the type" + " itself as an argument"))); + YYERROR; + } if (nameHasSameIdentifierAs(data->currentName, id)) { error( @3, yyscanner, @@ -1382,17 +1400,6 @@ structMember: p2 = dynamic_cast<unoidl::detail::SourceProviderPolymorphicStructTypeTemplateEntityPad *>( ent->pad.get()); if (p2 != 0) { - if (std::find( - p2->typeParameters.begin(), p2->typeParameters.end(), id) - != p2->typeParameters.end()) - { - error( - @3, yyscanner, - ("polymorphic struct type template " + data->currentName - + " direct member " + id - + " has same identifier as a type parameter")); - YYERROR; - } for (std::vector<unoidl::PolymorphicStructTypeTemplateEntity::Member>::iterator i( p2->members.begin()); i != p2->members.end(); ++i) commit bde3b4bb2681f2a1fce423fc600a398940bcf25a Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 17:49:09 2013 +0100 Fix unoidl sourceprovider typedef check Change-Id: I7faa689c803f83687cfcc39dc7c4fd145584e849 (cherry picked from commit add28638db1bf367751c98631624c6dd7adc6c22) diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index 7b9e224..ec81083 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -1882,20 +1882,20 @@ typedefDefn: unoidl::detail::SourceProviderType t(*$4); delete $4; OUString name(convertToFullName(data, $5)); - // There is no good reason to forbid typedefs to VOID and to instantiated - // polymorphic struct types, but some old client code of registry data - // expects this typedef restriction (like the assert(false) default in - // handleTypedef in codemaker/source/javamaker/javatype.cxx), so forbid - // them for now: + // There is no good reason to forbid typedefs to VOID, to instantiated + // polymorphic struct types, and to exception types, but some old client + // code of registry data expects this typedef restriction (like the + // assert(false) default in handleTypedef in + // codemaker/source/javamaker/javatype.cxx), so forbid them for now: switch (t.type) { case unoidl::detail::SourceProviderType::TYPE_VOID: + case unoidl::detail::SourceProviderType::TYPE_EXCEPTION: case unoidl::detail::SourceProviderType::TYPE_INSTANTIATED_POLYMORPHIC_STRUCT: error(@4, yyscanner, "bad typedef type"); YYERROR; break; case unoidl::detail::SourceProviderType::TYPE_ENUM: case unoidl::detail::SourceProviderType::TYPE_PLAIN_STRUCT: - case unoidl::detail::SourceProviderType::TYPE_EXCEPTION: case unoidl::detail::SourceProviderType::TYPE_INTERFACE: if ($2) { bool unpub = false; commit 9a9dd2ddda6b78bee822644e0eeec2e51709df30 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 17:28:08 2013 +0100 Fix unoidl sourceprovider recursive struct/exception member check Change-Id: Icd156745da10011611590b6b62cd0ec2df2b1266 (cherry picked from commit 39831b1d17abd360b1d50c8820f09cfd095be337) diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index 9d1c97a..7b9e224 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -1288,10 +1288,17 @@ structMember: default: break; } - if (nameHasSameIdentifierAs(data->currentName, id)) { + if (t.getName() == data->currentName) { // no need to worry about typedefs error( @2, yyscanner, ("struct/exception type " + data->currentName + " direct member " + + id + " has same type as the type itself")); + YYERROR; + } + if (nameHasSameIdentifierAs(data->currentName, id)) { + error( + @3, yyscanner, + ("struct/exception type " + data->currentName + " direct member " + id + " has same unqualified identifer as the type itself")); YYERROR; } commit ab029caf9e24df5a3a51e5ed93cec7539240778c Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 17:06:18 2013 +0100 Fix unoidl sourceprovider "published" checks Change-Id: I93b9fcc2b20ed7a7c160a9ef3294b6e578678f53 (cherry picked from commit 87dc22287604a702b584cd8a9272870421b8b6d1) diff --git a/idlc/test/parser/published.tests b/idlc/test/parser/published.tests index e19a0f0..f81ef6b 100644 --- a/idlc/test/parser/published.tests +++ b/idlc/test/parser/published.tests @@ -636,3 +636,46 @@ singleton S: I1; EXPECT SUCCESS "published.tests 118": published interface I1 {}; published singleton S: I1; + + +EXPECT FAILURE "published.tests 119": +interface I1 {}; +published interface I2 { [optional] interface I1; }; + + +EXPECT FAILURE "published.tests 120": +service S1 {}; +published service S2 { [optional] service S1; }; + + +EXPECT SUCCESS "published.tests 121": +interface I {}; +published service S { [optional] interface I; }; + + +EXPECT FAILURE "published.tests 122": +interface I {}; +published service S { [optional, property] I p; }; + + +EXPECT FAILURE "published.tests 123": +interface I {}; +published service S { [optional, property] sequence<I> p; }; + + +EXPECT FAILURE "published.tests 124": +struct P<T> { T m; }; +interface I {}; +published service S { [optional, property] P<I> p; }; + + +EXPECT FAILURE "published.tests 125": +published struct P<T> { T m; }; +interface I {}; +published service S { [optional, property] P<I> p; }; + + +EXPECT FAILURE "published.tests 126": +struct P<T> { T m; }; +published interface I {}; +published service S { [optional, property] P<I> p; }; diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index 8f813c3..9d1c97a 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -134,10 +134,10 @@ void convertToCurrentName( assert(!data->currentName.isEmpty()); } -void clearCurrentName(unoidl::detail::SourceProviderScannerData * data) { +void clearCurrentState(unoidl::detail::SourceProviderScannerData * data) { assert(data != 0); - assert(!data->currentName.isEmpty()); data->currentName = ""; + data->publishedContext = false; } unoidl::detail::SourceProviderEntity * getCurrentEntity( @@ -339,6 +339,16 @@ Found findEntity( // fall through case unoidl::detail::SourceProviderEntity::KIND_EXTERNAL: if (e->entity->getSort() == unoidl::Entity::SORT_TYPEDEF) { + if (data->publishedContext + && !static_cast<unoidl::TypedefEntity *>( + e->entity.get())->isPublished()) + { + error( + location, yyscanner, + ("type " + *name + " based on unpublished typedef " + + n + " used in published context")); + return FOUND_ERROR; + } OUString t( static_cast<unoidl::TypedefEntity *>(e->entity.get()) ->getType()); @@ -461,6 +471,7 @@ Found findEntity( } break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: argT = unoidl::detail::SourceProviderType::TYPE_INTERFACE; break; case unoidl::detail::SourceProviderEntity::KIND_MODULE: @@ -532,6 +543,7 @@ Found findEntity( } break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: if (resolveInterfaceDefinitions) { rtl::Reference<unoidl::Entity> ent( data->manager->findEntity(n)); @@ -702,6 +714,7 @@ Found findEntity( } break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: t = unoidl::detail::SourceProviderType( unoidl::detail::SourceProviderType::TYPE_INTERFACE, n, e); @@ -761,6 +774,7 @@ Found findEntity( } // fall through case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: error( location, yyscanner, ("bad type " + *name @@ -941,6 +955,7 @@ enumDefn: deprecated_opt published_opt TOK_ENUM identifier { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -965,7 +980,7 @@ enumDefn: ent->entity = new unoidl::EnumTypeEntity( pad->isPublished(), pad->members, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -1043,6 +1058,7 @@ plainStructDefn: deprecated_opt published_opt TOK_STRUCT identifier singleInheritance_opt { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); OUString baseName; rtl::Reference<unoidl::PlainStructTypeEntity> baseEnt; @@ -1066,6 +1082,13 @@ plainStructDefn: } baseEnt = static_cast<unoidl::PlainStructTypeEntity *>( p->entity.get()); + if ($2 && !baseEnt->isPublished()) { + error( + @5, yyscanner, + ("published plain struct type " + data->currentName + " base " + + baseName + " is unpublished")); + YYERROR; + } } if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -1091,7 +1114,7 @@ plainStructDefn: ent->entity = new unoidl::PlainStructTypeEntity( pad->isPublished(), pad->baseName, pad->members, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -1099,6 +1122,7 @@ polymorphicStructTemplateDefn: deprecated_opt published_opt TOK_STRUCT identifier '<' { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -1125,7 +1149,7 @@ polymorphicStructTemplateDefn: pad->isPublished(), pad->typeParameters, pad->members, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -1182,6 +1206,7 @@ exceptionDefn: deprecated_opt published_opt TOK_EXCEPTION identifier singleInheritance_opt { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); OUString baseName; rtl::Reference<unoidl::ExceptionTypeEntity> baseEnt; @@ -1204,6 +1229,13 @@ exceptionDefn: } baseEnt = static_cast<unoidl::ExceptionTypeEntity *>( p->entity.get()); + if ($2 && !baseEnt->isPublished()) { + error( + @5, yyscanner, + ("published exception type " + data->currentName + " base " + + baseName + " is unpublished")); + YYERROR; + } } if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -1228,7 +1260,7 @@ exceptionDefn: ent->entity = new unoidl::ExceptionTypeEntity( pad->isPublished(), pad->baseName, pad->members, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -1458,6 +1490,7 @@ interfaceDefn: deprecated_opt published_opt TOK_INTERFACE identifier singleInheritance_opt { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); OUString baseName; rtl::Reference<unoidl::InterfaceTypeEntity> baseEnt; @@ -1480,15 +1513,36 @@ interfaceDefn: YYERROR; } baseEnt = static_cast<unoidl::InterfaceTypeEntity *>(p->entity.get()); + if ($2 && !baseEnt->isPublished()) { + error( + @5, yyscanner, + ("published interface type " + data->currentName + + " direct base " + baseName + " is unpublished")); + YYERROR; + } } std::map<OUString, unoidl::detail::SourceProviderEntity>::iterator i( data->entities.find(data->currentName)); - if (i != data->entities.end() - && (i->second.kind - != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)) - { - error(@4, yyscanner, "multiple entities named " + data->currentName); - YYERROR; + if (i != data->entities.end()) { + switch (i->second.kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + if (!$2) { + error( + @4, yyscanner, + ("unpublished interface type " + data->currentName + + " has been declared published")); + YYERROR; + } + break; + default: + error( + @4, yyscanner, + "multiple entities named " + data->currentName); + YYERROR; + break; + } } data->entities[data->currentName] = unoidl::detail::SourceProviderEntity( new unoidl::detail::SourceProviderInterfaceTypeEntityPad( @@ -1547,7 +1601,7 @@ interfaceDefn: pad->isPublished(), mbases, obases, pad->attributes, pad->methods, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -1596,6 +1650,16 @@ interfaceBase: + " does not resolve to an existing interface type")); YYERROR; } + if (data->publishedContext + && !(static_cast<unoidl::InterfaceTypeEntity *>(p->entity.get()) + ->isPublished())) + { + error( + @4, yyscanner, + ("published interface type " + data->currentName + " direct base " + + name + " is unpublished")); + YYERROR; + } //TODO: check uniqueness (incl. that opt base != XInterface) (opt ? pad->optionalBases : pad->mandatoryBases).push_back( unoidl::detail::SourceProviderInterfaceTypeEntityPad::Base( @@ -1807,8 +1871,10 @@ typedefDefn: deprecated_opt published_opt TOK_TYPEDEF type identifier ';' { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; unoidl::detail::SourceProviderType t(*$4); delete $4; + OUString name(convertToFullName(data, $5)); // There is no good reason to forbid typedefs to VOID and to instantiated // polymorphic struct types, but some old client code of registry data // expects this typedef restriction (like the assert(false) default in @@ -1819,12 +1885,43 @@ typedefDefn: case unoidl::detail::SourceProviderType::TYPE_INSTANTIATED_POLYMORPHIC_STRUCT: error(@4, yyscanner, "bad typedef type"); YYERROR; + break; + case unoidl::detail::SourceProviderType::TYPE_ENUM: + case unoidl::detail::SourceProviderType::TYPE_PLAIN_STRUCT: + case unoidl::detail::SourceProviderType::TYPE_EXCEPTION: + case unoidl::detail::SourceProviderType::TYPE_INTERFACE: + if ($2) { + bool unpub = false; + switch (t.entity->kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + unpub = true; + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + break; + case unoidl::detail::SourceProviderEntity::KIND_MODULE: + assert(false); // this cannot happen + default: + assert(t.entity->entity.is() || t.entity->pad.is()); + unpub + = !(t.entity->entity.is() + ? static_cast<unoidl::PublishableEntity *>( + t.entity->entity.get())->isPublished() + : t.entity->pad->isPublished()); + break; + } + if (unpub) { + error( + @4, yyscanner, + "published typedef " + name + " type is unpublished"); + YYERROR; + } + } + break; case unoidl::detail::SourceProviderType::TYPE_PARAMETER: assert(false); // this cannot happen default: break; } - OUString name(convertToFullName(data, $5)); if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( name, @@ -1837,6 +1934,7 @@ typedefDefn: error(@5, yyscanner, "multiple entities named " + name); YYERROR; } + clearCurrentState(data); } ; @@ -1844,6 +1942,7 @@ constantGroupDefn: deprecated_opt published_opt TOK_CONSTANTS identifier { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -1868,7 +1967,7 @@ constantGroupDefn: ent->entity = new unoidl::ConstantGroupEntity( pad->isPublished(), pad->members, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -2163,25 +2262,51 @@ singleInterfaceBasedServiceDefn: deprecated_opt published_opt TOK_SERVICE identifier singleInheritance { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); OUString base(convertName($5)); unoidl::detail::SourceProviderEntity const * p; if (findEntity(@5, yyscanner, data, false, &base, &p, 0) == FOUND_ERROR) { YYERROR; } - if (p == 0 - || ((p->kind - != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL) - && (!p->entity.is() - || (p->entity->getSort() - != unoidl::Entity::SORT_INTERFACE_TYPE)))) - { + bool ifcBase = false; + bool pubBase = false; + if (p != 0) { + switch (p->kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + ifcBase = true; + pubBase = false; + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + ifcBase = true; + pubBase = true; + break; + default: + if (p->entity.is() + && (p->entity->getSort() + == unoidl::Entity::SORT_INTERFACE_TYPE)) + { + ifcBase = true; + pubBase = static_cast<unoidl::InterfaceTypeEntity *>( + p->entity.get())->isPublished(); + } + break; + } + } + if (!ifcBase) { error( @5, yyscanner, ("single-interface--based service " + data->currentName + " base " + base + " does not resolve to an interface type")); YYERROR; } + if ($2 && !pubBase) { + error( + @5, yyscanner, + ("published single-interface--based service " + data->currentName + + " base " + base + " is unpublished")); + YYERROR; + } if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( data->currentName, @@ -2229,7 +2354,7 @@ singleInterfaceBasedServiceDefn: ent->entity = new unoidl::SingleInterfaceBasedServiceEntity( pad->isPublished(), pad->base, ctors, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -2409,6 +2534,7 @@ accumulationBasedServiceDefn: deprecated_opt published_opt TOK_SERVICE identifier { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; convertToCurrentName(data, $4); if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( @@ -2436,7 +2562,7 @@ accumulationBasedServiceDefn: pad->directOptionalBaseInterfaces, pad->directProperties, annotations($1)); ent->pad.clear(); - clearCurrentName(data); + clearCurrentState(data); } ; @@ -2481,6 +2607,16 @@ serviceBase: + " does not resolve to an accumulation-based service")); YYERROR; } + if (data->publishedContext + && !static_cast<unoidl::AccumulationBasedServiceEntity *>( + p->entity.get())->isPublished()) + { + error( + @4, yyscanner, + ("published accumulation-based service " + data->currentName + + " direct base service " + name + " is unpublished")); + YYERROR; + } //TODO: check uniqueness (opt ? pad->directOptionalBaseServices : pad->directMandatoryBaseServices) .push_back(unoidl::AnnotatedReference(name, annotations($1))); @@ -2506,13 +2642,31 @@ serviceInterfaceBase: if (findEntity(@4, yyscanner, data, false, &name, &p, 0) == FOUND_ERROR) { YYERROR; } - if (p == 0 - || ((p->kind - != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL) - && (!p->entity.is() - || (p->entity->getSort() - != unoidl::Entity::SORT_INTERFACE_TYPE)))) - { + bool ifcBase = false; + bool pubBase = false; + if (p != 0) { + switch (p->kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + ifcBase = true; + pubBase = false; + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + ifcBase = true; + pubBase = true; + break; + default: + if (p->entity.is() + && (p->entity->getSort() + == unoidl::Entity::SORT_INTERFACE_TYPE)) + { + ifcBase = true; + pubBase = static_cast<unoidl::InterfaceTypeEntity *>( + p->entity.get())->isPublished(); + } + break; + } + } + if (!ifcBase) { error( @4, yyscanner, ("accumulation-based service " + data->currentName @@ -2520,6 +2674,13 @@ serviceInterfaceBase: + " does not resolve to an interface type")); YYERROR; } + if (data->publishedContext && !opt && !pubBase) { + error( + @5, yyscanner, + ("published accumulation-based service " + data->currentName + + " direct base interface " + name + " is unpublished")); + YYERROR; + } //TODO: check uniqueness (opt ? pad->directOptionalBaseInterfaces @@ -2615,25 +2776,51 @@ interfaceBasedSingletonDefn: deprecated_opt published_opt TOK_SINGLETON identifier singleInheritance ';' { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; OUString name(convertToFullName(data, $4)); OUString base(convertName($5)); unoidl::detail::SourceProviderEntity const * p; if (findEntity(@5, yyscanner, data, false, &base, &p, 0) == FOUND_ERROR) { YYERROR; } - if (p == 0 - || ((p->kind - != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL) - && (!p->entity.is() - || (p->entity->getSort() - != unoidl::Entity::SORT_INTERFACE_TYPE)))) - { + bool ifcBase = false; + bool pubBase = false; + if (p != 0) { + switch (p->kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + ifcBase = true; + pubBase = false; + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + ifcBase = true; + pubBase = true; + break; + default: + if (p->entity.is() + && (p->entity->getSort() + == unoidl::Entity::SORT_INTERFACE_TYPE)) + { + ifcBase = true; + pubBase = static_cast<unoidl::InterfaceTypeEntity *>( + p->entity.get())->isPublished(); + } + break; + } + } + if (!ifcBase) { error( @5, yyscanner, ("interface-based singleton " + name + " base " + base + " does not resolve to an interface type")); YYERROR; } + if ($2 && !pubBase) { + error( + @5, yyscanner, + ("published interface-based singleton " + name + " base " + base + + " is unpublished")); + YYERROR; + } if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( name, @@ -2646,6 +2833,7 @@ interfaceBasedSingletonDefn: error(@4, yyscanner, "multiple entities named " + name); YYERROR; } + clearCurrentState(data); } ; @@ -2654,6 +2842,7 @@ serviceBasedSingletonDefn: '}' ';' { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; OUString name(convertToFullName(data, $4)); OUString base(convertName($7)); unoidl::detail::SourceProviderEntity const * p; @@ -2671,6 +2860,16 @@ serviceBasedSingletonDefn: + " does not resolve to an accumulation-based service")); YYERROR; } + if ($2 + && !static_cast<unoidl::AccumulationBasedServiceEntity *>( + p->entity.get())->isPublished()) + { + error( + @7, yyscanner, + ("published service-based singleton " + name + " base " + base + + " is unpublished")); + YYERROR; + } if (!data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( name, @@ -2683,6 +2882,7 @@ serviceBasedSingletonDefn: error(@4, yyscanner, "multiple entities named " + name); YYERROR; } + clearCurrentState(data); } ; @@ -2722,6 +2922,16 @@ exceptions: ("exception " + name + " does not resolve to an exception type")); YYERROR; } + if (data->publishedContext + && !(static_cast<unoidl::ExceptionTypeEntity *>(p->entity.get()) + ->isPublished())) + { + delete $1; /* see commented-out %destructor above */ + error( + @3, yyscanner, + ("unpublished exception " + name + " used in published context")); + YYERROR; + } if (std::find($1->begin(), $1->end(), name) != $1->end()) { delete $1; /* see commented-out %destructor above */ error( @@ -2748,6 +2958,15 @@ exceptions: ("exception " + name + " does not resolve to an exception type")); YYERROR; } + if (data->publishedContext + && !(static_cast<unoidl::ExceptionTypeEntity *>(p->entity.get()) + ->isPublished())) + { + error( + @1, yyscanner, + ("unpublished exception " + name + " used in published context")); + YYERROR; + } $$ = new std::vector<OUString>; $$->push_back(name); } ; @@ -2756,27 +2975,49 @@ interfaceDecl: deprecated_opt/*ignored*/ published_opt TOK_INTERFACE identifier ';' { unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + data->publishedContext = $2; OUString name(convertToFullName(data, $4)); std::pair<std::map<OUString, unoidl::detail::SourceProviderEntity>::iterator, bool> p( data->entities.insert( std::map<OUString, unoidl::detail::SourceProviderEntity>::value_type( name, unoidl::detail::SourceProviderEntity( - unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)))); - if (!p.second - && (p.first->second.kind - != unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)) - { - assert(p.first->second.entity.is()); - if (p.first->second.entity->getSort() - != unoidl::Entity::SORT_INTERFACE_TYPE) - { - error( - @4, yyscanner, - "multiple entities named " + data->currentName); - YYERROR; + $2 + ? unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL + : unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL)))); + if (!p.second) { + switch (p.first->second.kind) { + case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + if ($2) { + p.first->second.kind + = unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL; + } + break; + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: + break; + default: + assert(p.first->second.entity.is()); + if (p.first->second.entity->getSort() + != unoidl::Entity::SORT_INTERFACE_TYPE) + { + error( + @4, yyscanner, + "multiple entities named " + data->currentName); + YYERROR; + } + if ($2 + && !static_cast<unoidl::InterfaceTypeEntity *>( + p.first->second.entity.get())->isPublished()) + { + error( + @4, yyscanner, + ("published interface type declaration " + + data->currentName + " has been defined unpublished")); + YYERROR; + } } } + clearCurrentState(data); } ; @@ -3185,6 +3426,7 @@ primaryExpr: unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); unoidl::ConstantValue v(false); // dummy value bool found = false; + bool unpub = false; sal_Int32 i = name.lastIndexOf('.'); if (i == -1) { rtl::Reference<unoidl::detail::SourceProviderEntityPad> pad( @@ -3248,6 +3490,9 @@ primaryExpr: if (j->name == id) { v = j->value; found = true; + unpub + = !static_cast<unoidl::ConstantGroupEntity *>( + ent->entity.get())->isPublished(); break; } } @@ -3265,6 +3510,7 @@ primaryExpr: if (j->name == id) { v = j->value; found = true; + unpub = !ent->pad->isPublished(); break; } } @@ -3280,6 +3526,12 @@ primaryExpr: " enum member"))); YYERROR; } + if (data->publishedContext && unpub) { + error( + @1, yyscanner, + "unpublished value " + name + " used in published context"); + YYERROR; + } switch (v.type) { case unoidl::ConstantValue::TYPE_BOOLEAN: $$ = unoidl::detail::SourceProviderExpr::Bool(v.booleanValue); @@ -3470,6 +3722,13 @@ type: switch (ent->kind) { case unoidl::detail::SourceProviderEntity::KIND_LOCAL: if (ent->pad.is()) { + if (data->publishedContext && !ent->pad->isPublished()) { + error( + @1, yyscanner, + ("unpublished entity " + name + + " used in published context")); + YYERROR; + } if (dynamic_cast<unoidl::detail::SourceProviderEnumTypeEntityPad *>( ent->pad.get()) != 0) @@ -3518,6 +3777,17 @@ type: assert(ent->entity.is()); // fall through case unoidl::detail::SourceProviderEntity::KIND_EXTERNAL: + if (data->publishedContext + && ent->entity->getSort() != unoidl::Entity::SORT_MODULE + && !static_cast<unoidl::PublishableEntity *>( + ent->entity.get())->isPublished()) + { + error( + @1, yyscanner, + ("unpublished entity " + name + + " used in published context")); + YYERROR; + } switch (ent->entity->getSort()) { case unoidl::Entity::SORT_ENUM_TYPE: $$ = new unoidl::detail::SourceProviderType( @@ -3558,6 +3828,15 @@ type: } break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + if (data->publishedContext) { + error( + @1, yyscanner, + ("unpublished entity " + name + + " used in published context")); + YYERROR; + } + // fall through + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: $$ = new unoidl::detail::SourceProviderType( unoidl::detail::SourceProviderType::TYPE_INTERFACE, name, ent); @@ -3612,23 +3891,29 @@ type: if (ent->entity->getSort() == unoidl::Entity::SORT_POLYMORPHIC_STRUCT_TYPE_TEMPLATE) { - if (args.size() - != (static_cast< - unoidl::PolymorphicStructTypeTemplateEntity *>( - ent->entity.get())-> - getTypeParameters().size())) - { + rtl::Reference<unoidl::PolymorphicStructTypeTemplateEntity> e( + static_cast<unoidl::PolymorphicStructTypeTemplateEntity *>( + ent->entity.get())); + if (args.size() != e->getTypeParameters().size()) { error( @1, yyscanner, ("bad number of polymorphic struct type template " + name + " type arguments")); YYERROR; } + if (data->publishedContext && !e->isPublished()) { + error( + @1, yyscanner, + ("unpublished polymorphic struct type template " + name + + " used in published context")); + YYERROR; + } $$ = new unoidl::detail::SourceProviderType(name, ent, args); ok = true; } break; case unoidl::detail::SourceProviderEntity::KIND_INTERFACE_DECL: + case unoidl::detail::SourceProviderEntity::KIND_PUBLISHED_INTERFACE_DECL: break; case unoidl::detail::SourceProviderEntity::KIND_MODULE: assert(false); // this cannot happen diff --git a/unoidl/source/sourceprovider-scanner.hxx b/unoidl/source/sourceprovider-scanner.hxx index c1959a7..5edd984 100644 --- a/unoidl/source/sourceprovider-scanner.hxx +++ b/unoidl/source/sourceprovider-scanner.hxx @@ -218,7 +218,10 @@ private: }; struct SourceProviderEntity { - enum Kind { KIND_EXTERNAL, KIND_LOCAL, KIND_INTERFACE_DECL, KIND_MODULE }; + enum Kind { + KIND_EXTERNAL, KIND_LOCAL, KIND_INTERFACE_DECL, + KIND_PUBLISHED_INTERFACE_DECL, KIND_MODULE + }; explicit SourceProviderEntity( Kind theKind, rtl::Reference<unoidl::Entity> const & externalEntity): @@ -248,7 +251,7 @@ struct SourceProviderScannerData { manager(theManager), sourcePosition(), sourceEnd(), // avoid false warnings about uninitialized members - errorLine(0) + errorLine(0), publishedContext(false) { assert(manager.is()); } void setSource(void const * address, sal_uInt64 size) { @@ -267,6 +270,7 @@ struct SourceProviderScannerData { std::map<OUString, SourceProviderEntity> entities; std::vector<OUString> modules; OUString currentName; + bool publishedContext; }; bool parse(OUString const & uri, SourceProviderScannerData * data); commit 759a9281e0eefcfb35a26fe4c18661bfb8f7e858 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 16:57:31 2013 +0100 Published FormController cannot reference unpublished XFormOperations ...and the hack to locally introduce a bogus pupblished forward declaration of XFormOperations with which this has been worked around in cf5c36912390b2f6018f57f79085ab1fa88a08d6 "INTEGRATION: CWS dba23b: work around idlc limitation, which does not allow to refer unpublished interfaces as optional entities in published services" no longer works in offapi/type_reference/offapi.idl. So given FormController is a (deprecated, even) old-style service (i.e., little more than glorified commentary), the best fix probably is to demote the problematic optional property to a comment. Change-Id: Ia38483c817dc1762ba73315abcd4f9f063db3093 (cherry picked from commit 75144495ee77a41e5a94d9e21b7f6aaf16a80b4f) diff --git a/offapi/com/sun/star/form/FormController.idl b/offapi/com/sun/star/form/FormController.idl index 137bd6e..c49dc71 100644 --- a/offapi/com/sun/star/form/FormController.idl +++ b/offapi/com/sun/star/form/FormController.idl @@ -40,18 +40,13 @@ module com { module sun { module star { module form { -module runtime { - published interface XFormOperations; -}; - - /** is superseded by com::sun::star::form::runtime::FormController. @deprecated */ published service FormController { [optional] service FormControllerDispatcher; - [optional, property] ::com::sun::star::form::runtime::XFormOperations FormOperations; + // [optional, property] ::com::sun::star::form::runtime::XFormOperations FormOperations; is not published /** is used for notifying the (de)activation of the controller. */ diff --git a/offapi/type_reference/offapi.idl b/offapi/type_reference/offapi.idl index 509fe6b..a474f59 100644 --- a/offapi/type_reference/offapi.idl +++ b/offapi/type_reference/offapi.idl @@ -6493,9 +6493,6 @@ module com { }; }; module form { - module runtime { - interface XFormOperations; - }; /** @deprecated */ published service FormController { [optional] service ::com::sun::star::form::FormControllerDispatcher; interface ::com::sun::star::form::XFormController; @@ -6508,7 +6505,6 @@ module com { interface ::com::sun::star::sdb::XSQLErrorBroadcaster; interface ::com::sun::star::sdb::XRowSetApproveBroadcaster; interface ::com::sun::star::form::XDatabaseParameterBroadcaster; - [property, optional] ::com::sun::star::form::runtime::XFormOperations FormOperations; }; published enum FormSubmitEncoding { URL = 0, commit 95b0c45034f9899e1cbfbdd7619014c9fd6eeab3 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 15:55:17 2013 +0100 Modern UNOIDL parsers ignore preproc lines, so replace #if 0 with comment Change-Id: If46e98f54b916c312193ef7d931e120c53d047c0 (cherry picked from commit 71af2d5885eba0b82e6e0f3938bf08a9346776ff) diff --git a/offapi/com/sun/star/sheet/ExternalReference.idl b/offapi/com/sun/star/sheet/ExternalReference.idl index 17b7ded..ea22257 100644 --- a/offapi/com/sun/star/sheet/ExternalReference.idl +++ b/offapi/com/sun/star/sheet/ExternalReference.idl @@ -46,20 +46,16 @@ struct ExternalReference */ long Index; -#if 0 - - /** Name of the sheet that the external reference points to. - - <p>In case of a cell range reference that spans across multiple - sheets, this is the name of the first sheet in that range.</p> - - <p>Note that an external range name ignores this value at the moment, - but <i>it may make use of this data in the future when Calc supports a - sheet-specific range name.</i></p> - */ - string SheetName; -#endif - +// /** Name of the sheet that the external reference points to. +// +// <p>In case of a cell range reference that spans across multiple +// sheets, this is the name of the first sheet in that range.</p> +// +// <p>Note that an external range name ignores this value at the moment, +// but <i>it may make use of this data in the future when Calc supports a +// sheet-specific range name.</i></p> +// */ +// string SheetName; /** Reference data. diff --git a/offapi/com/sun/star/sheet/SpreadsheetDocument.idl b/offapi/com/sun/star/sheet/SpreadsheetDocument.idl index eb4581c..a72a127 100644 --- a/offapi/com/sun/star/sheet/SpreadsheetDocument.idl +++ b/offapi/com/sun/star/sheet/SpreadsheetDocument.idl @@ -177,14 +177,11 @@ published service SpreadsheetDocument [readonly, property] com::sun::star::container::XNameAccess DDELinks; -#if 0 - /** contains the collection of external document links in the document. - - @since OOo 3.1 - */ - [optional, readonly, property] com::sun::star::sheet::XExternalDocLinks ExternalDocLinks; -#endif - +// /** contains the collection of external document links in the document. +// +// @since OOo 3.1 +// */ +// [optional, readonly, property] com::sun::star::sheet::XExternalDocLinks ExternalDocLinks; }; commit 232e9f5355516ca657fd11508df49a48c9212086 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 10:28:12 2013 +0100 constant.tests idlc/unoidl diffs: * byte only accepts singed literal values < 128 now Change-Id: If557b5212e349fe115948f72b5558fee338db659 (cherry picked from commit 2abcff25137c7c9af007554c97a4512319ec2e4d) diff --git a/idlc/test/parser/constant.tests b/idlc/test/parser/constant.tests index 505a8c2..49183d4 100644 --- a/idlc/test/parser/constant.tests +++ b/idlc/test/parser/constant.tests @@ -79,9 +79,9 @@ constants C { const byte C1 = -128; const byte C2 = -0200; const byte C3 = -0x80; - const byte C4 = 255; - const byte C5 = 0377; - const byte C6 = 0xFF; + const byte C4 = 127; + const byte C5 = 0177; + const byte C6 = 0x7F; const short C7 = -32768; const short C8 = -0100000; const short C9 = -0x8000; @@ -118,6 +118,14 @@ constants C { }; +EXPECT NEW-FAILURE "constant.tests 8a": +constants C { + const byte C4 = 255; + const byte C5 = 0377; + const byte C6 = 0xFF; +}; + + EXPECT FAILURE "constant.tests 9": constants C { const byte C1 = -129; }; commit 77820de0f5c47d73eb4a2aa71c78f0ee8177e14e Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 10:26:19 2013 +0100 attributes.tests idlc/unoidl diffs: * global exception names no longer clash with local names * repeating the same exception in a raises spec is caught now Change-Id: I388aae4de59bddc1c69bf4c263297d0b92b47106 (cherry picked from commit 61c092497ebbc22f1ce92e185f9fb66353bb9172) diff --git a/idlc/test/parser/attribute.tests b/idlc/test/parser/attribute.tests index bc6753f..46f9c1a 100644 --- a/idlc/test/parser/attribute.tests +++ b/idlc/test/parser/attribute.tests @@ -92,7 +92,7 @@ interface I1 { }; -EXPECT FAILURE "attribute.tests 9": +EXPECT OLD-FAILURE "attribute.tests 9": exception E1 {}; interface I1 { void E1(); @@ -102,7 +102,7 @@ interface I1 { }; -EXPECT FAILURE "attribute.tests 10": +EXPECT OLD-FAILURE "attribute.tests 10": exception E1 {}; interface I1 { [attribute] long E1 { @@ -111,7 +111,7 @@ interface I1 { }; -EXPECT SUCCESS "attribute.tests 11": +EXPECT NEW-FAILURE "attribute.tests 11": exception E1 {}; interface I1 { [attribute] long a { commit fcf4a5b8b009a96903d8133f79081b276cc56ccb Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Nov 22 10:23:33 2013 +0100 Add exectest.pl OLD-/NEW-FAILURE for deliberate idlc/unoidl diffs Change-Id: I653522d8ebaac3329f368c102d14041c6b49d41d (cherry picked from commit c5bb39d64d26398e9ebf8f973059a887c271052f) diff --git a/idlc/CustomTarget_parser_test.mk b/idlc/CustomTarget_parser_test.mk index acb3a8f..84b01d9 100644 --- a/idlc/CustomTarget_parser_test.mk +++ b/idlc/CustomTarget_parser_test.mk @@ -28,52 +28,52 @@ $(call gb_CustomTarget_get_target,idlc/parser_test) : \ $(call gb_Helper_abbreviate_dirs,( \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/attribute.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/constant.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/constructor.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/interfaceinheritance.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/methodoverload.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/oldstyle.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/polystruct.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/published.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/struct.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/typedef.tests \ - $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl 0 \ $(call gb_Executable_get_command,idlc) \ -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {}) \ > $@.log 2>&1 || (cat $@.log && false)) diff --git a/solenv/bin/exectest.pl b/solenv/bin/exectest.pl index bd9b5f3..248cd7b 100644 --- a/solenv/bin/exectest.pl +++ b/solenv/bin/exectest.pl @@ -23,18 +23,21 @@ sub encode($) return $arg } -$#ARGV >= 2 - or die "Usage: $0 <input file> <temp file> <command> <arguments...>"; +$#ARGV >= 3 + or die "Usage: $0 <input file> <temp file> <new?> <command> <arguments...>"; open INPUT, '<', $ARGV[0] or die "cannot open $ARGV[0]: $!"; shift @ARGV; $temp = $ARGV[0]; shift @ARGV; +$new = $ARGV[0]; +shift @ARGV; $failed = 0; $open = 0; while (1) { $eof = eof INPUT; $in = <INPUT> unless $eof; - if ($eof || $in =~ /^EXPECT (SUCCESS|FAILURE) "([^"]*)"?:\n$/) + if ($eof + || $in =~ /^EXPECT (SUCCESS|FAILURE|NEW-FAILURE|OLD-FAILURE) "([^"]*)"?:\n$/) { if ($open) { @@ -86,6 +89,8 @@ while (1) { } last if $eof; $expect = $1; + $expect = ($new ? 'FAILURE' : 'SUCCESS') if $expect eq 'NEW-FAILURE'; + $expect = ($new ? 'SUCCESS' : 'FAILURE') if $expect eq 'OLD-FAILURE'; $title = $2; open OUTPUT, '>', $temp or die "cannot open $temp: $!"; $open = 1; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits