CPlusPlus: Do not ignore namespaces

... when comparing type names. For instance, this is relevant when
deciding whether to offer the "Apply signature changes" refactoring
action.
Add fallback code for function lookups, which was relying on the relaxed
semantics for parameter types.

Fixes: QTCREATORBUG-9856
Change-Id: I2001b77034ff15e96a23e3359d19654d0f43f60b
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2020-07-16 15:09:34 +02:00
parent 9026dd0033
commit 3b14051db5
3 changed files with 27 additions and 15 deletions

View File

@@ -154,19 +154,7 @@ bool Matcher::match(const NamedType *type, const NamedType *otherType)
{
if (type == otherType)
return true;
const Name *name = type->name();
if (const QualifiedNameId *q = name->asQualifiedNameId())
name = q->name();
const Name *otherName = otherType->name();
if (const QualifiedNameId *q = otherName->asQualifiedNameId())
otherName = q->name();
if (! Matcher::match(name, otherName, this))
return false;
return true;
return Matcher::match(type->name(), otherType->name(), this);
}
bool Matcher::match(const Function *type, const Function *otherType)

View File

@@ -339,6 +339,28 @@ bool Function::isSignatureEqualTo(const Function *other, Matcher *matcher) const
else if (! Matcher::match(unqualifiedName(), other->unqualifiedName(), matcher))
return false;
class FallbackMatcher : public Matcher
{
public:
explicit FallbackMatcher(Matcher *baseMatcher) : m_baseMatcher(baseMatcher) {}
private:
bool match(const NamedType *type, const NamedType *otherType) override
{
if (type == otherType)
return true;
const Name *name = type->name();
if (const QualifiedNameId *q = name->asQualifiedNameId())
name = q->name();
const Name *otherName = otherType->name();
if (const QualifiedNameId *q = otherName->asQualifiedNameId())
otherName = q->name();
return Matcher::match(name, otherName, m_baseMatcher);
}
Matcher * const m_baseMatcher;
} fallbackMatcher(matcher);
const int argc = argumentCount();
if (argc != other->argumentCount())
return false;
@@ -359,6 +381,8 @@ bool Function::isSignatureEqualTo(const Function *other, Matcher *matcher) const
if (lType.match(rType))
continue;
}
if (l->type().match(r->type(), &fallbackMatcher))
continue;
return false;
}
}