Reject "too similar" service constructors
Change-Id: Ie81e9994084b5a2f44a436c764318ea6e5049faf
This commit is contained in:
parent
aeee571501
commit
60f8d808c2
@ -118,6 +118,8 @@ struct SourceProviderType {
|
||||
|
||||
OUString getName() const;
|
||||
|
||||
bool equals(SourceProviderType const & other) const;
|
||||
|
||||
Type type;
|
||||
OUString name; // TYPE_ENUM ... TYPE_PARAMETER
|
||||
SourceProviderEntity const * entity;
|
||||
|
@ -2205,13 +2205,32 @@ singleInterfaceBasedServiceDefn:
|
||||
dynamic_cast<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad *>(
|
||||
ent->pad.get());
|
||||
assert(pad != 0);
|
||||
if (!$7) {
|
||||
std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor> ctors;
|
||||
if ($7) {
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator
|
||||
i(pad->constructors.begin());
|
||||
i != pad->constructors.end(); ++i)
|
||||
{
|
||||
std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter> parms;
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator
|
||||
j(i->parameters.begin());
|
||||
j != i->parameters.end(); ++j)
|
||||
{
|
||||
parms.push_back(
|
||||
unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter(
|
||||
j->name, j->type.getName(), j->rest));
|
||||
}
|
||||
ctors.push_back(
|
||||
unoidl::SingleInterfaceBasedServiceEntity::Constructor(
|
||||
i->name, parms, i->exceptions, i->annotations));
|
||||
}
|
||||
} else {
|
||||
assert(pad->constructors.empty());
|
||||
pad->constructors.push_back(
|
||||
ctors.push_back(
|
||||
unoidl::SingleInterfaceBasedServiceEntity::Constructor());
|
||||
}
|
||||
ent->entity = new unoidl::SingleInterfaceBasedServiceEntity(
|
||||
pad->isPublished(), pad->base, pad->constructors, annotations($1));
|
||||
pad->isPublished(), pad->base, ctors, annotations($1));
|
||||
ent->pad.clear();
|
||||
clearCurrentName(data);
|
||||
}
|
||||
@ -2235,7 +2254,7 @@ ctor:
|
||||
rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>
|
||||
pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>(
|
||||
data));
|
||||
for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>::iterator
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator
|
||||
i(pad->constructors.begin());
|
||||
i != pad->constructors.end(); ++i)
|
||||
{
|
||||
@ -2249,22 +2268,49 @@ ctor:
|
||||
}
|
||||
}
|
||||
pad->constructors.push_back(
|
||||
unoidl::SingleInterfaceBasedServiceEntity::Constructor(
|
||||
id, std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter>(),
|
||||
std::vector<OUString>(), annotations($1)));
|
||||
unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor(
|
||||
id, annotations($1)));
|
||||
}
|
||||
'(' ctorParams_opt ')' exceptionSpec_opt ';'
|
||||
{
|
||||
unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner);
|
||||
rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>
|
||||
pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>(
|
||||
data));
|
||||
assert(!pad->constructors.empty());
|
||||
if ($7 != 0) {
|
||||
unoidl::detail::SourceProviderScannerData * data
|
||||
= yyget_extra(yyscanner);
|
||||
rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>
|
||||
pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>(
|
||||
data));
|
||||
assert(!pad->constructors.empty());
|
||||
pad->constructors.back().exceptions = *$7;
|
||||
delete $7;
|
||||
}
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator
|
||||
i(pad->constructors.begin());
|
||||
i != pad->constructors.end() - 1; ++i)
|
||||
{
|
||||
if (i->parameters.size()
|
||||
== pad->constructors.back().parameters.size())
|
||||
{
|
||||
bool same = true;
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator
|
||||
j(i->parameters.begin()),
|
||||
k(pad->constructors.back().parameters.begin());
|
||||
j != i->parameters.end(); ++j, ++k)
|
||||
{
|
||||
if (!j->type.equals(k->type) || j->rest != k->rest) {
|
||||
same = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (same) {
|
||||
error(
|
||||
@2, yyscanner,
|
||||
("single-interface--based service " + data->currentName
|
||||
+ " constructor " + pad->constructors.back().name
|
||||
+ " has similar paramete list to constructor "
|
||||
+ i->name));
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
@ -2338,7 +2384,7 @@ ctorParam:
|
||||
+ " rest parameter must be last parameter"));
|
||||
YYERROR;
|
||||
}
|
||||
for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter>::iterator
|
||||
for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator
|
||||
i(pad->constructors.back().parameters.begin());
|
||||
i != pad->constructors.back().parameters.end(); ++i)
|
||||
{
|
||||
@ -2353,8 +2399,8 @@ ctorParam:
|
||||
}
|
||||
}
|
||||
pad->constructors.back().parameters.push_back(
|
||||
unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter(
|
||||
id, t.getName(), $5));
|
||||
unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter(
|
||||
id, t, $5));
|
||||
}
|
||||
;
|
||||
|
||||
@ -3682,6 +3728,23 @@ OUString SourceProviderType::getName() const {
|
||||
}
|
||||
}
|
||||
|
||||
bool SourceProviderType::equals(SourceProviderType const & other) const {
|
||||
if (type != other.type || name != other.name
|
||||
|| subtypes.size() != other.subtypes.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (std::vector<SourceProviderType>::const_iterator
|
||||
i(subtypes.begin()), j(other.subtypes.begin());
|
||||
i != subtypes.end(); ++i, ++j)
|
||||
{
|
||||
if (!i->equals(*j)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool parse(OUString const & uri, SourceProviderScannerData * data) {
|
||||
assert(data != 0);
|
||||
oslFileHandle handle;
|
||||
|
@ -156,14 +156,43 @@ class SourceProviderSingleInterfaceBasedServiceEntityPad:
|
||||
public SourceProviderEntityPad
|
||||
{
|
||||
public:
|
||||
struct Constructor {
|
||||
struct Parameter {
|
||||
Parameter(
|
||||
rtl::OUString const & theName,
|
||||
SourceProviderType const & theType, bool theRest):
|
||||
name(theName), type(theType), rest(theRest)
|
||||
{}
|
||||
|
||||
rtl::OUString name;
|
||||
|
||||
SourceProviderType type;
|
||||
|
||||
bool rest;
|
||||
};
|
||||
|
||||
Constructor(
|
||||
rtl::OUString const & theName,
|
||||
std::vector< rtl::OUString > const & theAnnotations):
|
||||
name(theName), annotations(theAnnotations)
|
||||
{}
|
||||
|
||||
rtl::OUString const name;
|
||||
|
||||
std::vector< Parameter > parameters;
|
||||
|
||||
std::vector< rtl::OUString > exceptions;
|
||||
|
||||
std::vector< rtl::OUString > const annotations;
|
||||
};
|
||||
|
||||
explicit SourceProviderSingleInterfaceBasedServiceEntityPad(
|
||||
bool published, OUString const & theBase):
|
||||
SourceProviderEntityPad(published), base(theBase)
|
||||
{}
|
||||
|
||||
OUString const base;
|
||||
std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>
|
||||
constructors;
|
||||
std::vector<Constructor> constructors;
|
||||
|
||||
private:
|
||||
virtual ~SourceProviderSingleInterfaceBasedServiceEntityPad() throw () {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user