C++: improve support for anonymous classes

Fix:
* highlighting
* find usages
* follow symbol
* code completion

Task-number: QTCREATORBUG-6497
Task-number: QTCREATORBUG-8963
Task-number: QTCREATORBUG-3610
Task-number: QTCREATORBUG-7579

Change-Id: I3dcaf1c515d0199c3e6bee72284fbb40064686ee
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
Przemyslaw Gorszkowski
2013-04-10 23:30:18 +02:00
committed by Erik Verbruggen
parent a2b2857b44
commit 080bf4ecb8
27 changed files with 341 additions and 7 deletions

View File

@@ -101,6 +101,14 @@ template <> struct Compare<ArrayType>
}
};
template <> struct Compare<AnonymousNameId>
{
bool operator()(const AnonymousNameId &name, const AnonymousNameId &otherName) const
{
return name.classTokenIndex() < otherName.classTokenIndex();
}
};
template <> struct Compare<DestructorNameId>
{
bool operator()(const DestructorNameId &name, const DestructorNameId &otherName) const
@@ -219,6 +227,11 @@ public:
delete_array_entries(symbols);
}
const AnonymousNameId *findOrInsertAnonymousNameId(unsigned classTokenIndex)
{
return anonymousNameIds.intern(AnonymousNameId(classTokenIndex));
}
template <typename _Iterator>
const TemplateNameId *findOrInsertTemplateNameId(const Identifier *id, bool isSpecialization,
_Iterator first, _Iterator last)
@@ -475,6 +488,7 @@ public:
// ### replace std::map with lookup tables. ASAP!
// names
Table<AnonymousNameId> anonymousNameIds;
Table<DestructorNameId> destructorNameIds;
Table<OperatorNameId> operatorNameIds;
Table<ConversionNameId> conversionNameIds;
@@ -550,6 +564,9 @@ DiagnosticClient *Control::diagnosticClient() const
void Control::setDiagnosticClient(DiagnosticClient *diagnosticClient)
{ d->diagnosticClient = diagnosticClient; }
const AnonymousNameId *Control::anonymousNameId(unsigned classTokenIndex)
{ return d->findOrInsertAnonymousNameId(classTokenIndex); }
const OperatorNameId *Control::findOperatorNameId(OperatorNameId::Kind operatorId) const
{
Table<OperatorNameId>::const_iterator i = d->operatorNameIds.find(operatorId);