• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdevelop API Reference
  • KDE Home
  • Contact Us
 

kdevplatform/language/duchain

  • sources
  • kfour-appscomplete
  • kdevelop
  • kdevplatform
  • language
  • duchain
classfunctiondeclaration.cpp
Go to the documentation of this file.
1 /* This is part of KDevelop
2  Copyright 2002-2005 Roberto Raggi <[email protected]>
3  Copyright 2006 Adam Treat <[email protected]>
4  Copyright 2006 Hamish Rodda <[email protected]>
5  Copyright 2007-2008 David Nolden <[email protected]>
6 
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Library General Public
9  License version 2 as published by the Free Software Foundation.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20  */
21 
22 #include "classfunctiondeclaration.h"
23 #include "ducontext.h"
24 #include "types/functiontype.h"
25 #include "duchainregister.h"
26 #include <debug.h>
27 
28 namespace KDevelop {
29 static Identifier& conversionIdentifier()
30 {
31  static Identifier conversionIdentifierObject(QStringLiteral("operator{...cast...}"));
32  return conversionIdentifierObject;
33 }
34 
35 REGISTER_DUCHAIN_ITEM(ClassFunctionDeclaration);
36 
37 ClassFunctionDeclaration::ClassFunctionDeclaration(const ClassFunctionDeclaration& rhs)
38  : ClassFunctionDeclarationBase(*new ClassFunctionDeclarationData(*rhs.d_func()))
39 {
40 }
41 
42 void ClassFunctionDeclaration::setAbstractType(AbstractType::Ptr type)
43 {
47  if (type && !dynamic_cast<FunctionType*>(type.data()) && type->whichType() != AbstractType::TypeAlias) {
48  qCWarning(LANGUAGE) << "WARNING: Non-function type assigned to function declaration. Type is: "
49  << type->toString() << "whichType:" << type->whichType()
50  << "Declaration is:" << toString()
51  << topContext()->url().str() << range().castToSimpleRange();
52  }
53  ClassMemberDeclaration::setAbstractType(type);
54 }
55 
56 DEFINE_LIST_MEMBER_HASH(ClassFunctionDeclarationData, m_defaultParameters, IndexedString)
57 
58 ClassFunctionDeclaration::ClassFunctionDeclaration(ClassFunctionDeclarationData& data) : ClassFunctionDeclarationBase(
59  data)
60 {
61 }
62 
63 ClassFunctionDeclaration::ClassFunctionDeclaration(const RangeInRevision& range, DUContext* context)
64  : ClassFunctionDeclarationBase(*new ClassFunctionDeclarationData, range)
65 {
66  d_func_dynamic()->setClassId(this);
67  if (context)
68  setContext(context);
69 }
70 
71 ClassFunctionDeclaration::ClassFunctionDeclaration(ClassFunctionDeclarationData& data, const RangeInRevision& range,
72  DUContext* context)
73  : ClassFunctionDeclarationBase(data, range)
74 {
75  if (context)
76  setContext(context);
77 }
78 
79 Declaration* ClassFunctionDeclaration::clonePrivate() const
80 {
81  return new ClassFunctionDeclaration(*this);
82 }
83 
84 ClassFunctionDeclaration::~ClassFunctionDeclaration()
85 {
86 }
87 
88 bool ClassFunctionDeclaration::isFunctionDeclaration() const
89 {
90  return true;
91 }
92 
93 QString ClassFunctionDeclaration::toString() const
94 {
95  if (!abstractType())
96  return ClassMemberDeclaration::toString();
97 
98  TypePtr<FunctionType> function = type<FunctionType>();
99  if (function) {
100  return QStringLiteral("%1 %2 %3").arg(function->partToString(FunctionType::SignatureReturn),
101  identifier().toString(),
102  function->partToString(FunctionType::SignatureArguments));
103  } else {
104  QString type = abstractType() ? abstractType()->toString() : QStringLiteral("<notype>");
105  qCDebug(LANGUAGE) << "A function has a bad type attached:" << type;
106  return i18n("invalid member-function %1 type %2", identifier().toString(), type);
107  }
108 }
109 
110 /*bool ClassFunctionDeclaration::isSimilar(KDevelop::CodeItem *other, bool strict ) const
111  {
112  if (!CppClassMemberType::isSimilar(other,strict))
113  return false;
114 
115  FunctionModelItem func = dynamic_cast<ClassFunctionDeclaration*>(other);
116 
117  if (isConstant() != func->isConstant())
118  return false;
119 
120  if (arguments().count() != func->arguments().count())
121  return false;
122 
123  for (int i=0; i<arguments().count(); ++i)
124  {
125  ArgumentModelItem arg1 = arguments().at(i);
126  ArgumentModelItem arg2 = arguments().at(i);
127 
128  if (arg1->type() != arg2->type())
129  return false;
130  }
131 
132  return true;
133  }*/
134 
135 uint setFlag(bool enable, uint flag, uint flags)
136 {
137  if (enable)
138  return flags | flag;
139  else
140  return flags & (~flag);
141 }
142 
143 bool ClassFunctionDeclaration::isAbstract() const
144 {
145  return d_func()->m_functionFlags & AbstractFunctionFlag;
146 }
147 
148 void ClassFunctionDeclaration::setIsAbstract(bool abstract)
149 {
150  d_func_dynamic()->m_functionFlags = ( ClassFunctionFlags )setFlag(abstract, AbstractFunctionFlag,
151  d_func()->m_functionFlags);
152 }
153 
154 bool ClassFunctionDeclaration::isFinal() const
155 {
156  return d_func()->m_functionFlags & FinalFunctionFlag;
157 }
158 
159 void ClassFunctionDeclaration::setIsFinal(bool final)
160 {
161  d_func_dynamic()->m_functionFlags = ( ClassFunctionFlags )setFlag(final, FinalFunctionFlag,
162  d_func()->m_functionFlags);
163 }
164 
165 bool ClassFunctionDeclaration::isSignal() const
166 {
167  return d_func()->m_functionFlags & FunctionSignalFlag;
168 }
169 
170 void ClassFunctionDeclaration::setIsSignal(bool isSignal)
171 {
172  d_func_dynamic()->m_functionFlags = ( ClassFunctionFlags )setFlag(isSignal, FunctionSignalFlag,
173  d_func()->m_functionFlags);
174 }
175 
176 bool ClassFunctionDeclaration::isSlot() const
177 {
178  return d_func()->m_functionFlags & FunctionSlotFlag;
179 }
180 
181 void ClassFunctionDeclaration::setIsSlot(bool isSlot)
182 {
183  d_func_dynamic()->m_functionFlags = ( ClassFunctionFlags )setFlag(isSlot, FunctionSlotFlag,
184  d_func()->m_functionFlags);
185 }
186 
187 bool ClassFunctionDeclaration::isConversionFunction() const
188 {
189  return identifier() == conversionIdentifier();
190 }
191 
192 bool ClassFunctionDeclaration::isConstructor() const
193 {
194  DUContext* ctx = context();
195  if (ctx && ctx->type() == DUContext::Class && ctx->localScopeIdentifier().top().nameEquals(identifier()))
196  return true;
197  return false;
198 }
199 
200 bool ClassFunctionDeclaration::isDestructor() const
201 {
202  DUContext* ctx = context();
203  QString id = identifier().toString();
204  return ctx && ctx->type() == DUContext::Class && id.startsWith(QLatin1Char('~')) &&
205  id.midRef(1) == ctx->localScopeIdentifier().top().toString();
206 }
207 
208 uint ClassFunctionDeclaration::additionalIdentity() const
209 {
210  if (abstractType())
211  return abstractType()->hash();
212  else
213  return 0;
214 }
215 
216 const IndexedString* ClassFunctionDeclaration::defaultParameters() const
217 {
218  return d_func()->m_defaultParameters();
219 }
220 
221 unsigned int ClassFunctionDeclaration::defaultParametersSize() const
222 {
223  return d_func()->m_defaultParametersSize();
224 }
225 
226 void ClassFunctionDeclaration::addDefaultParameter(const IndexedString& str)
227 {
228  d_func_dynamic()->m_defaultParametersList().append(str);
229 }
230 
231 void ClassFunctionDeclaration::clearDefaultParameters()
232 {
233  d_func_dynamic()->m_defaultParametersList().clear();
234 }
235 }
KDevelop::setFlag
uint setFlag(bool enable, uint flag, uint flags)
Definition: classfunctiondeclaration.cpp:135
KDevelop::ClassFunctionDeclaration::setIsAbstract
void setIsAbstract(bool)
Definition: classfunctiondeclaration.cpp:148
KDevelop::ClassFunctionDeclaration::isAbstract
bool isAbstract() const
Whether this function is abstract.
Definition: classfunctiondeclaration.cpp:143
KDevelop::ClassFunctionDeclaration::isConversionFunction
bool isConversionFunction() const
Definition: classfunctiondeclaration.cpp:187
DEFINE_LIST_MEMBER_HASH
#define DEFINE_LIST_MEMBER_HASH(container, member, type)
Definition: appendedlist.h:218
KDevelop::REGISTER_DUCHAIN_ITEM
REGISTER_DUCHAIN_ITEM(AliasDeclaration)
KDevelop::FunctionSlotFlag
Definition: classfunctiondeclaration.h:34
QExplicitlySharedDataPointer::data
T * data() const
KDevelop::FunctionType::SignatureArguments
When this is given, a string that represents the arguments like "(ARGTYPE1, ARGTYPE1,...
Definition: functiontype.h:45
KDevelop::ClassFunctionDeclaration::isDestructor
virtual bool isDestructor() const
Definition: classfunctiondeclaration.cpp:200
KDevelop::ClassFunctionDeclaration::defaultParameters
const IndexedString * defaultParameters() const override
Definition: classfunctiondeclaration.cpp:216
KDevelop::Declaration::toString
virtual QString toString() const
Determine this declaration as a string.
Definition: declaration.cpp:466
KDevelop::TypePtr< AbstractType >
KDevelop::ClassFunctionDeclaration
Definition: classfunctiondeclaration.h:74
KDevelop::Declaration
Represents a single declaration in a definition-use chain.
Definition: declaration.h:51
KDevelop::ClassFunctionDeclaration::additionalIdentity
uint additionalIdentity() const override
Definition: classfunctiondeclaration.cpp:208
KDevelop::QualifiedIdentifier::top
Identifier top() const
Definition: identifier.cpp:1084
KDevelop::ClassFunctionDeclaration::clonePrivate
Declaration * clonePrivate() const override
Definition: classfunctiondeclaration.cpp:79
QString
KDevelop::AbstractFunctionFlag
Definition: classfunctiondeclaration.h:35
KDevelop::ClassFunctionDeclaration::addDefaultParameter
void addDefaultParameter(const IndexedString &str) override
Definition: classfunctiondeclaration.cpp:226
KDevelop::ClassFunctionDeclaration::isFinal
bool isFinal() const
Whether this function is final.
Definition: classfunctiondeclaration.cpp:154
KDevelop::DUContext::localScopeIdentifier
QualifiedIdentifier localScopeIdentifier() const
Scope identifier, used to qualify the identifiers occurring in each context.
Definition: ducontext.cpp:1122
KDevelop::ClassFunctionDeclaration::setAbstractType
void setAbstractType(AbstractType::Ptr type) override
Definition: classfunctiondeclaration.cpp:42
KDevelop::FunctionSignalFlag
Definition: classfunctiondeclaration.h:33
KDevelop::ClassFunctionDeclaration::defaultParametersSize
unsigned int defaultParametersSize() const override
Definition: classfunctiondeclaration.cpp:221
KDevelop::Identifier
Represents a single unqualified identifier.
Definition: identifier.h:150
KDevelop::DUContext::Class
A context that declares class members.
Definition: ducontext.h:105
KDevelop::ClassFunctionDeclaration::~ClassFunctionDeclaration
~ClassFunctionDeclaration() override
Definition: classfunctiondeclaration.cpp:84
KDevelop::ClassFunctionDeclaration::toString
QString toString() const override
Definition: classfunctiondeclaration.cpp:93
KDevelop::FinalFunctionFlag
Definition: classfunctiondeclaration.h:36
KDevelop::Identifier::toString
QString toString(IdentifierStringFormattingOptions options=NoOptions) const
Definition: identifier.cpp:594
QLatin1Char
KDevelop::ClassFunctionDeclaration::setIsFinal
void setIsFinal(bool)
Definition: classfunctiondeclaration.cpp:159
KDevelop::ClassFunctionDeclaration::isConstructor
virtual bool isConstructor() const
Definition: classfunctiondeclaration.cpp:192
classfunctiondeclaration.h
KDevelop::ClassFunctionDeclaration::clearDefaultParameters
void clearDefaultParameters() override
Definition: classfunctiondeclaration.cpp:231
KDevelop
Definition: abstractfunctiondeclaration.cpp:27
KDevelop::ClassFunctionDeclaration::isSlot
bool isSlot() const
Whether this function is a slot, for example a C++ Qt slot.
Definition: classfunctiondeclaration.cpp:176
KDevelop::DUContext
A single context in source code, represented as a node in a directed acyclic graph.
Definition: ducontext.h:72
KDevelop::FunctionType::SignatureReturn
When this is given, only a string that represents the return-type is returned.
Definition: functiontype.h:44
KDevelop::AbstractType::TypeAlias
a type-alias type
Definition: abstracttype.h:225
ClassFunctionDeclarationBase
KDevelop::ClassFunctionDeclaration::isSignal
bool isSignal() const
Whether this function is a signal, for example a C++ Qt signal.
Definition: classfunctiondeclaration.cpp:165
functiontype.h
duchainregister.h
KDevelop::conversionIdentifier
static Identifier & conversionIdentifier()
Definition: classfunctiondeclaration.cpp:29
KDevelop::ClassFunctionDeclaration::ClassFunctionDeclaration
ClassFunctionDeclaration(const RangeInRevision &range, DUContext *context)
Definition: classfunctiondeclaration.cpp:63
KDevelop::DUContext::type
ContextType type() const
Definition: ducontext.cpp:1134
KDevelop::ClassFunctionDeclaration::setIsSignal
void setIsSignal(bool)
Definition: classfunctiondeclaration.cpp:170
ducontext.h
KDevelop::Declaration::setAbstractType
virtual void setAbstractType(AbstractType::Ptr type)
Set this declaration's type.
Definition: declaration.cpp:249
KDevelop::ClassFunctionDeclaration::isFunctionDeclaration
bool isFunctionDeclaration() const override
Definition: classfunctiondeclaration.cpp:88
KDevelop::ClassFunctionDeclaration::setIsSlot
void setIsSlot(bool)
Definition: classfunctiondeclaration.cpp:181
KDevelop::Identifier::nameEquals
bool nameEquals(const Identifier &rhs) const
Comparison ignoring the template-identifiers.
Definition: identifier.cpp:468
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Wed Mar 3 2021 00:37:28 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kdevplatform/language/duchain

Skip menu "kdevplatform/language/duchain"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdevelop API Reference

Skip menu "kdevelop API Reference"
  • kdevplatform
  •   debugger
  •   documentation
  •   interfaces
  •   language
  •     assistant
  •     backgroundparser
  •     checks
  •     classmodel
  •     codecompletion
  •     codegen
  •     duchain
  •     editor
  •     highlighting
  •     interfaces
  •     util
  •   outputview
  •   project
  •   serialization
  •   shell
  •   sublime
  •   tests
  •   util
  •   vcs

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal