File indexing completed on 2024-05-12 04:38:03

0001 /*
0002     SPDX-FileCopyrightText: 2007 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "namespacealiasdeclaration.h"
0008 
0009 #include "ducontext.h"
0010 #include "duchainregister.h"
0011 #include "persistentsymboltable.h"
0012 
0013 namespace KDevelop {
0014 REGISTER_DUCHAIN_ITEM(NamespaceAliasDeclaration);
0015 
0016 NamespaceAliasDeclaration::NamespaceAliasDeclaration(const NamespaceAliasDeclaration& rhs)
0017     : Declaration(*new NamespaceAliasDeclarationData(*rhs.d_func()))
0018 {
0019 }
0020 
0021 NamespaceAliasDeclaration::NamespaceAliasDeclaration(const RangeInRevision& range, DUContext* context)
0022     : Declaration(*new NamespaceAliasDeclarationData, range)
0023 {
0024     d_func_dynamic()->setClassId(this);
0025     setKind(NamespaceAlias);
0026     if (context)
0027         setContext(context);
0028 }
0029 
0030 NamespaceAliasDeclaration::NamespaceAliasDeclaration(NamespaceAliasDeclarationData& data) : Declaration(data)
0031 {
0032 }
0033 
0034 QualifiedIdentifier NamespaceAliasDeclaration::importIdentifier() const
0035 {
0036     return d_func()->m_importIdentifier.identifier();
0037 }
0038 
0039 void NamespaceAliasDeclaration::setImportIdentifier(const QualifiedIdentifier& id)
0040 {
0041     Q_ASSERT(!id.explicitlyGlobal());
0042     d_func_dynamic()->m_importIdentifier = id;
0043 }
0044 
0045 NamespaceAliasDeclaration::~NamespaceAliasDeclaration()
0046 {
0047     if (persistentlyDestroying() && d_func()->m_inSymbolTable)
0048         unregisterAliasIdentifier();
0049 }
0050 
0051 void NamespaceAliasDeclaration::setInSymbolTable(bool inSymbolTable)
0052 {
0053     if (d_func()->m_inSymbolTable && !inSymbolTable) {
0054         unregisterAliasIdentifier();
0055     } else if (!d_func()->m_inSymbolTable && inSymbolTable) {
0056         registerAliasIdentifier();
0057     }
0058     KDevelop::Declaration::setInSymbolTable(inSymbolTable);
0059 }
0060 
0061 void NamespaceAliasDeclaration::unregisterAliasIdentifier()
0062 {
0063     if (indexedIdentifier() != globalIndexedImportIdentifier()) {
0064         QualifiedIdentifier aliasId = qualifiedIdentifier();
0065         aliasId.push(globalIndexedAliasIdentifier());
0066         KDevelop::PersistentSymbolTable::self().removeDeclaration(aliasId, this);
0067     }
0068 }
0069 
0070 void NamespaceAliasDeclaration::registerAliasIdentifier()
0071 {
0072     if (indexedIdentifier() != globalIndexedImportIdentifier()) {
0073         QualifiedIdentifier aliasId = qualifiedIdentifier();
0074         aliasId.push(globalIndexedAliasIdentifier());
0075         KDevelop::PersistentSymbolTable::self().addDeclaration(aliasId, this);
0076     }
0077 }
0078 
0079 Declaration* NamespaceAliasDeclaration::clonePrivate() const
0080 {
0081     return new NamespaceAliasDeclaration(*this);
0082 }
0083 
0084 void NamespaceAliasDeclaration::setAbstractType(AbstractType::Ptr type)
0085 {
0086     //A namespace-import does not have a type, so ignore any set type
0087     Q_UNUSED(type);
0088 }
0089 
0090 QString NamespaceAliasDeclaration::toString() const
0091 {
0092     DUCHAIN_D(NamespaceAliasDeclaration);
0093     if (indexedIdentifier() != globalIndexedImportIdentifier())
0094         return i18n("Import %1 as %2", d->m_importIdentifier.identifier().toString(), identifier().toString());
0095     else
0096         return i18n("Import %1", d->m_importIdentifier.identifier().toString());
0097 }
0098 }