File indexing completed on 2024-05-19 12:19:13
0001 /* 0002 SPDX-FileCopyrightText: 2008 Milian Wolff <mail@milianw.de> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "classdeclaration.h" 0008 0009 #include <language/duchain/duchainregister.h> 0010 #include <completioncodemodel.h> 0011 0012 #include "helper.h" 0013 0014 namespace Php { 0015 REGISTER_DUCHAIN_ITEM(ClassDeclaration); 0016 0017 ClassDeclaration::ClassDeclaration(const ClassDeclaration& rhs) 0018 : KDevelop::ClassDeclaration(*new ClassDeclarationData(*rhs.d_func())) 0019 { 0020 } 0021 0022 ClassDeclaration::ClassDeclaration(const KDevelop::RangeInRevision& range, KDevelop::DUContext* context) 0023 : KDevelop::ClassDeclaration(*new ClassDeclarationData, range, context) 0024 { 0025 d_func_dynamic()->setClassId(this); 0026 if (context) { 0027 setContext(context); 0028 } 0029 } 0030 0031 ClassDeclaration::ClassDeclaration(ClassDeclarationData& data) 0032 : KDevelop::ClassDeclaration(data) 0033 { 0034 } 0035 0036 ClassDeclaration::ClassDeclaration(ClassDeclarationData& data, const KDevelop::RangeInRevision& range, KDevelop::DUContext* context) 0037 : KDevelop::ClassDeclaration(data, range, context) 0038 { 0039 } 0040 0041 ClassDeclaration::~ClassDeclaration() 0042 { 0043 } 0044 0045 KDevelop::Declaration* ClassDeclaration::clonePrivate() const 0046 { 0047 return new ClassDeclaration(*this); 0048 } 0049 0050 KDevelop::IndexedString ClassDeclaration::prettyName() const 0051 { 0052 return d_func()->prettyName; 0053 } 0054 0055 void ClassDeclaration::setPrettyName( const KDevelop::IndexedString& name ) 0056 { 0057 d_func_dynamic()->prettyName = name; 0058 } 0059 0060 QString ClassDeclaration::toString() const 0061 { 0062 QString ret; 0063 switch ( classModifier() ) { 0064 case ClassDeclarationData::None: 0065 //nothing 0066 break; 0067 case ClassDeclarationData::Abstract: 0068 ret += QLatin1String("abstract "); 0069 break; 0070 case ClassDeclarationData::Final: 0071 ret += QLatin1String("final "); 0072 break; 0073 } 0074 switch ( classType() ) { 0075 case ClassDeclarationData::Class: 0076 ret += QLatin1String("class "); 0077 break; 0078 case ClassDeclarationData::Interface: 0079 ret += QLatin1String("interface "); 0080 break; 0081 case ClassDeclarationData::Trait: 0082 ret += QLatin1String("trait "); 0083 break; 0084 case ClassDeclarationData::Union: 0085 ret += QLatin1String("union "); 0086 break; 0087 case ClassDeclarationData::Struct: 0088 ret += QLatin1String("struct "); 0089 break; 0090 } 0091 return ret + prettyName().str(); 0092 } 0093 0094 void ClassDeclaration::updateCompletionCodeModelItem() 0095 { 0096 if (d_func()->prettyName.isEmpty()) { 0097 return; 0098 } 0099 if (d_func()->m_inSymbolTable) { 0100 CompletionCodeModelItem::Kind flags = CompletionCodeModelItem::Unknown; 0101 static const KDevelop::QualifiedIdentifier exceptionQId(QStringLiteral("exception")); 0102 if (qualifiedIdentifier() == exceptionQId) { 0103 flags = (CompletionCodeModelItem::Kind)(flags | CompletionCodeModelItem::Exception); 0104 } else { 0105 static KDevelop::DUChainPointer<ClassDeclaration> exceptionDecl; 0106 if (!exceptionDecl) { 0107 QList<Declaration*> decs = context()->topContext()->findDeclarations(exceptionQId); 0108 Q_ASSERT(decs.count()); 0109 exceptionDecl = dynamic_cast<ClassDeclaration*>(decs.first()); 0110 Q_ASSERT(exceptionDecl); 0111 } 0112 if (equalQualifiedIdentifier(exceptionDecl.data()) 0113 || isPublicBaseClass(exceptionDecl.data(), context()->topContext()) 0114 ) { 0115 flags = (CompletionCodeModelItem::Kind)(flags | CompletionCodeModelItem::Exception); 0116 } 0117 } 0118 CompletionCodeModel::self().addItem(url(), qualifiedIdentifier(), d_func_dynamic()->prettyName, flags); 0119 } else { 0120 CompletionCodeModel::self().removeItem(url(), qualifiedIdentifier()); 0121 } 0122 } 0123 0124 }