File indexing completed on 2024-05-05 16:41:08

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 }