1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
/*
SPDX-FileCopyrightText: 2008 David Nolden <david.nolden.kdevelop@art-master.de>
SPDX-License-Identifier: LGPL-2.0-only
*/
#include "specializationstore.h"
#include "declarationid.h"
#include "ducontext.h"
#include "declaration.h"
namespace KDevelop {
SpecializationStore::SpecializationStore()
{
}
SpecializationStore::~SpecializationStore()
{
}
SpecializationStore& SpecializationStore::self()
{
static SpecializationStore store;
return store;
}
void SpecializationStore::set(const DeclarationId& declaration,
const IndexedInstantiationInformation& specialization)
{
Q_ASSERT(specialization.index() >> 16);
m_specializations[declaration] = specialization;
}
IndexedInstantiationInformation SpecializationStore::get(const DeclarationId& declaration)
{
QHash<DeclarationId, IndexedInstantiationInformation>::const_iterator it = m_specializations.constFind(declaration);
if (it != m_specializations.constEnd())
return *it;
else
return IndexedInstantiationInformation();
}
void SpecializationStore::clear(const DeclarationId& declaration)
{
QHash<DeclarationId, IndexedInstantiationInformation>::iterator it = m_specializations.find(declaration);
if (it != m_specializations.end())
m_specializations.erase(it);
}
void SpecializationStore::clear()
{
m_specializations.clear();
}
Declaration* SpecializationStore::applySpecialization(Declaration* declaration, TopDUContext* source,
bool recursive)
{
if (!declaration)
return nullptr;
IndexedInstantiationInformation specialization = get(declaration->id());
if (specialization.index())
return declaration->specialize(specialization, source);
if (declaration->context() && recursive) {
//Find a parent that has a specialization, and specialize this with the info and required depth
int depth = 0;
DUContext* ctx = declaration->context();
IndexedInstantiationInformation specialization;
while (ctx && !specialization.index()) {
if (ctx->owner())
specialization = get(ctx->owner()->id());
++depth;
ctx = ctx->parentContext();
}
if (specialization.index())
return declaration->specialize(specialization, source, depth);
}
return declaration;
}
DUContext* SpecializationStore::applySpecialization(DUContext* context, TopDUContext* source,
bool recursive)
{
if (!context)
return nullptr;
if (Declaration* declaration = context->owner())
return applySpecialization(declaration, source, recursive)->internalContext();
if (context->parentContext() && recursive) {
//Find a parent that has a specialization, and specialize this with the info and required depth
int depth = 0;
DUContext* ctx = context->parentContext();
IndexedInstantiationInformation specialization;
while (ctx && !specialization.index()) {
if (ctx->owner())
specialization = get(ctx->owner()->id());
++depth;
ctx = ctx->parentContext();
}
if (specialization.index())
return context->specialize(specialization, source, depth);
}
return context;
}
}
|