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 }