Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
clangcodeparser.cpp File Reference

(e10af31c54cd7e75dcf089fad99681d1537a4152)

#include "clangcodeparser.h"
#include "cppcodeparser.h"
#include "access.h"
#include "classnode.h"
#include "config.h"
#include "doc.h"
#include "enumnode.h"
#include "functionnode.h"
#include "genustypes.h"
#include "inclusionpolicy.h"
#include "namespacenode.h"
#include "propertynode.h"
#include "qdocdatabase.h"
#include "typedefnode.h"
#include "variablenode.h"
#include "sourcefileparser.h"
#include "utilities.h"
#include <QtCore/qdebug.h>
#include <QtCore/qdir.h>
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qfile.h>
#include <QtCore/qregularexpression.h>
#include <QtCore/qscopedvaluerollback.h>
#include <QtCore/qtemporarydir.h>
#include <QtCore/qtextstream.h>
#include <QtCore/qvarlengtharray.h>
#include <clang-c/Index.h>
#include <clang/AST/Decl.h>
#include <clang/AST/DeclFriend.h>
#include <clang/AST/DeclTemplate.h>
#include <clang/AST/Expr.h>
#include <clang/AST/Type.h>
#include <clang/AST/TypeLoc.h>
#include <clang/Basic/SourceLocation.h>
#include <clang/Frontend/ASTUnit.h>
#include <clang/Lex/Lexer.h>
#include <llvm/Support/Casting.h>
#include "clang/AST/QualTypeNames.h"
#include "template_declaration.h"
#include <cstdio>
#include <optional>
Include dependency graph for clangcodeparser.cpp:

Go to the source code of this file.

Classes

struct  CompilationIndex
struct  TranslationUnit
struct  FileCacheEntry
 Returns the spelling in the file for a source range. More...
class  ClangVisitor

Functions

template<class T>
static QDebug operator<< (QDebug debug, const std::vector< T > &v)
static void printDiagnostics (const CXTranslationUnit &translationUnit)
static const clang::Decl * get_cursor_declaration (CXCursor cursor)
 Returns the underlying Decl that cursor represents.
static std::string get_fully_qualified_type_name (clang::QualType type, const clang::ASTContext &declaration_context)
 Returns a string representing the name of type as if it was referred to at the end of the translation unit that it was parsed from.
static QString cleanAnonymousTypeName (const QString &typeName)
static std::string get_expression_as_string (const clang::Expr *expression, const clang::ASTContext &declaration_context)
static std::string get_default_value_initializer_as_string (const clang::TemplateTypeParmDecl *parameter)
static std::string get_default_value_initializer_as_string (const clang::NonTypeTemplateParmDecl *parameter)
static std::string get_default_value_initializer_as_string (const clang::TemplateTemplateParmDecl *parameter)
static std::string get_default_value_initializer_as_string (const clang::ParmVarDecl *parameter)
static std::string get_default_value_initializer_as_string (const clang::NamedDecl *declaration)
template<typename T>
bool visitChildrenLambda (CXCursor cursor, T &&lambda)
 Call clang_visitChildren on the given cursor with the lambda as a callback T can be any functor that is callable with a CXCursor parameter and returns a CXChildVisitResult (in other word compatible with function<CXChildVisitResult(CXCursor)>.
static QString fromCXString (CXString &&string)
 convert a CXString to a QString, and dispose the CXString
static RelaxedTemplateDeclaration get_template_declaration (const clang::TemplateDecl *template_declaration)
static Location fromCXSourceLocation (CXSourceLocation location)
 convert a CXSourceLocation to a qdoc Location
static Access fromCX_CXXAccessSpecifier (CX_CXXAccessSpecifier spec)
 convert a CX_CXXAccessSpecifier to Node::Access
static QString fromCache (const QByteArray &cache, unsigned int offset1, unsigned int offset2)
static QString readFile (CXFile cxFile, unsigned int offset1, unsigned int offset2)
static QString getSpelling (CXSourceRange range)
QString functionName (CXCursor cursor)
 Returns the function name from a given cursor representing a function declaration.
static QString reconstructQualifiedPathForCursor (CXCursor cur)
 Reconstruct the qualified path name of a function that is being overridden.
static std::optional< QStringclassNameFromParameterType (clang::QualType param_type)
static NodefindNodeForCursor (QDocDatabase *qdb, CXCursor cur)
 Find the node from the QDocDatabase qdb that corresponds to the declaration represented by the cursor cur, if it exists.
static void setOverridesForFunction (FunctionNode *fn, CXCursor cursor)
static void autoGenerateSmfDoc (FunctionNode *fn, const QString &className)
void getDefaultArgs (const QList< QByteArray > &defines, std::vector< const char * > &args)
 Load the default arguments and the defines into args.
static QList< QByteArrayincludePathsFromHeaders (const std::set< Config::HeaderFilePath > &allHeaders)
void getMoreArgs (const std::vector< QByteArray > &include_paths, const std::set< Config::HeaderFilePath > &all_headers, std::vector< const char * > &args)
 Load the include paths into moreArgs.
std::optional< PCHFilebuildPCH (QDocDatabase *qdb, QString module_header, const std::set< Config::HeaderFilePath > &all_headers, const std::vector< QByteArray > &include_paths, const QList< QByteArray > &defines, const InclusionPolicy &policy)
 Building the PCH must be possible when there are no .cpp files, so it is moved here to its own member function, and it is called after the list of header files is complete.
static float getUnpatchedVersion (QString t)

Variables

static const auto kClangDontDisplayDiagnostics = 0
static CXTranslationUnit_Flags flags_ = static_cast<CXTranslationUnit_Flags>(0)
constexpr const char fnDummyFileName [] = "/fn_dummyfile.cpp"
static const char * defaultArgs_ []

Function Documentation

◆ autoGenerateSmfDoc()

void autoGenerateSmfDoc ( FunctionNode * fn,
const QString & className )
static

Auto-generates documentation for explicitly defaulted or deleted special member functions that don't already have documentation.

Definition at line 861 of file clangcodeparser.cpp.

References Node< _Tp >::hasDoc(), FunctionNode::isCAssign(), FunctionNode::isCCtor(), FunctionNode::isCtor(), FunctionNode::isDeletedAsWritten(), FunctionNode::isDtor(), FunctionNode::isExplicitlyDefaulted(), FunctionNode::isMAssign(), FunctionNode::isMCtor(), FunctionNode::isSpecialMemberFunction(), Node< _Tp >::location(), Doc::markAutoGenerated(), FunctionNode::parameters(), and Node< _Tp >::setDoc().

Here is the call graph for this function:

◆ buildPCH()

std::optional< PCHFile > buildPCH ( QDocDatabase * qdb,
QString module_header,
const std::set< Config::HeaderFilePath > & all_headers,
const std::vector< QByteArray > & include_paths,
const QList< QByteArray > & defines,
const InclusionPolicy & policy )

Building the PCH must be possible when there are no .cpp files, so it is moved here to its own member function, and it is called after the list of header files is complete.

Definition at line 1843 of file clangcodeparser.cpp.

References flags_, kClangDontDisplayDiagnostics, printDiagnostics(), TranslationUnit::tu, and ClangVisitor::visitChildren().

Here is the call graph for this function:

◆ classNameFromParameterType()

std::optional< QString > classNameFromParameterType ( clang::QualType param_type)
static

Extract a class name from a Clang parameter type, stripping references, pointers, and qualifiers. Returns {std::nullopt} if the type doesn't represent a class.

Definition at line 602 of file clangcodeparser.cpp.

◆ cleanAnonymousTypeName()

QString cleanAnonymousTypeName ( const QString & typeName)
static

Definition at line 189 of file clangcodeparser.cpp.

◆ findNodeForCursor()

Node * findNodeForCursor ( QDocDatabase * qdb,
CXCursor cur )
static

Find the node from the QDocDatabase qdb that corresponds to the declaration represented by the cursor cur, if it exists.

Definition at line 639 of file clangcodeparser.cpp.

References findNodeForCursor(), fromCXSourceLocation(), get_cursor_declaration(), Node< _Tp >::isAggregate(), Node< _Tp >::isClassNode(), Node< _Tp >::isFunction(), Node< _Tp >::isNamespace(), Node< _Tp >::isTypedef(), Node< _Tp >::isVariable(), and QDocDatabase::primaryTreeRoot().

Referenced by findNodeForCursor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ fromCache()

QString fromCache ( const QByteArray & cache,
unsigned int offset1,
unsigned int offset2 )
inlinestatic

Definition at line 485 of file clangcodeparser.cpp.

◆ fromCX_CXXAccessSpecifier()

Access fromCX_CXXAccessSpecifier ( CX_CXXAccessSpecifier spec)
static

convert a CX_CXXAccessSpecifier to Node::Access

Definition at line 461 of file clangcodeparser.cpp.

References Private, Protected, and Public.

◆ fromCXSourceLocation()

Location fromCXSourceLocation ( CXSourceLocation location)
static

convert a CXSourceLocation to a qdoc Location

Definition at line 447 of file clangcodeparser.cpp.

References Location::setColumnNo(), and Location::setLineNo().

Referenced by findNodeForCursor(), and ClangCodeParser::parse_cpp_file().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ fromCXString()

QString fromCXString ( CXString && string)
static

convert a CXString to a QString, and dispose the CXString

Definition at line 359 of file clangcodeparser.cpp.

◆ functionName()

QString functionName ( CXCursor cursor)

Returns the function name from a given cursor representing a function declaration.

This is usually clang_getCursorSpelling, but not for the conversion function in which case it is a bit more complicated

Definition at line 536 of file clangcodeparser.cpp.

◆ get_cursor_declaration()

const clang::Decl * get_cursor_declaration ( CXCursor cursor)
static

Returns the underlying Decl that cursor represents.

This can be used to drop back down from a LibClang's CXCursor to the underlying C++ AST that Clang provides.

It should be used when LibClang does not expose certain functionalities that are available in the C++ AST.

The CXCursor should represent a declaration. Usages of this function on CXCursors that do not represent a declaration may produce undefined results.

Definition at line 142 of file clangcodeparser.cpp.

Referenced by findNodeForCursor().

Here is the caller graph for this function:

◆ get_default_value_initializer_as_string() [1/5]

std::string get_default_value_initializer_as_string ( const clang::NamedDecl * declaration)
static

Definition at line 321 of file clangcodeparser.cpp.

◆ get_default_value_initializer_as_string() [2/5]

std::string get_default_value_initializer_as_string ( const clang::NonTypeTemplateParmDecl * parameter)
static

Definition at line 259 of file clangcodeparser.cpp.

◆ get_default_value_initializer_as_string() [3/5]

std::string get_default_value_initializer_as_string ( const clang::ParmVarDecl * parameter)
static

Definition at line 303 of file clangcodeparser.cpp.

◆ get_default_value_initializer_as_string() [4/5]

std::string get_default_value_initializer_as_string ( const clang::TemplateTemplateParmDecl * parameter)
static

Definition at line 279 of file clangcodeparser.cpp.

◆ get_default_value_initializer_as_string() [5/5]

std::string get_default_value_initializer_as_string ( const clang::TemplateTypeParmDecl * parameter)
static

Definition at line 237 of file clangcodeparser.cpp.

◆ get_expression_as_string()

std::string get_expression_as_string ( const clang::Expr * expression,
const clang::ASTContext & declaration_context )
static

Definition at line 213 of file clangcodeparser.cpp.

◆ get_fully_qualified_type_name()

std::string get_fully_qualified_type_name ( clang::QualType type,
const clang::ASTContext & declaration_context )
static

Returns a string representing the name of type as if it was referred to at the end of the translation unit that it was parsed from.

For example, given the following code:

namespace foo {
template<typename T>
struct Bar {
using Baz = const T&;
void bam(Baz);
};
}
QString foo
[14]

Given a parsed translation unit and an AST node, say {decl}, representing the parameter declaration of the first argument of {bam}, calling {get_fully_qualified_name(decl->getType(), * decl->getASTContext())} would result in the string {foo::Bar<T>::Baz}.

This should generally be used every time the stringified representation of a type is acquired as part of parsing with Clang, so as to ensure a consistent behavior and output.

Definition at line 176 of file clangcodeparser.cpp.

References clang::TypeName::getFullyQualifiedName().

Here is the call graph for this function:

◆ get_template_declaration()

RelaxedTemplateDeclaration get_template_declaration ( const clang::TemplateDecl * template_declaration)
static

Definition at line 370 of file clangcodeparser.cpp.

◆ getDefaultArgs()

void getDefaultArgs ( const QList< QByteArray > & defines,
std::vector< const char * > & args )

Load the default arguments and the defines into args.

Clear args first.

Definition at line 1789 of file clangcodeparser.cpp.

References defaultArgs_.

◆ getMoreArgs()

void getMoreArgs ( const std::vector< QByteArray > & include_paths,
const std::set< Config::HeaderFilePath > & all_headers,
std::vector< const char * > & args )

Load the include paths into moreArgs.

If no include paths were provided, try to guess reasonable include paths.

Definition at line 1815 of file clangcodeparser.cpp.

◆ getSpelling()

QString getSpelling ( CXSourceRange range)
static

Definition at line 516 of file clangcodeparser.cpp.

◆ getUnpatchedVersion()

float getUnpatchedVersion ( QString t)
static

Definition at line 1984 of file clangcodeparser.cpp.

◆ includePathsFromHeaders()

QList< QByteArray > includePathsFromHeaders ( const std::set< Config::HeaderFilePath > & allHeaders)
static

Definition at line 1799 of file clangcodeparser.cpp.

◆ operator<<()

template<class T>
QDebug operator<< ( QDebug debug,
const std::vector< T > & v )
static

Definition at line 94 of file clangcodeparser.cpp.

◆ printDiagnostics()

void printDiagnostics ( const CXTranslationUnit & translationUnit)
static

Definition at line 111 of file clangcodeparser.cpp.

Referenced by buildPCH(), FnCommandParser::operator()(), and ClangCodeParser::parse_cpp_file().

Here is the caller graph for this function:

◆ readFile()

QString readFile ( CXFile cxFile,
unsigned int offset1,
unsigned int offset2 )
static

Definition at line 491 of file clangcodeparser.cpp.

◆ reconstructQualifiedPathForCursor()

QString reconstructQualifiedPathForCursor ( CXCursor cur)
static

Reconstruct the qualified path name of a function that is being overridden.

Definition at line 564 of file clangcodeparser.cpp.

◆ setOverridesForFunction()

void setOverridesForFunction ( FunctionNode * fn,
CXCursor cursor )
static

Definition at line 840 of file clangcodeparser.cpp.

References FunctionNode::setOverride().

Here is the call graph for this function:

◆ visitChildrenLambda()

template<typename T>
bool visitChildrenLambda ( CXCursor cursor,
T && lambda )

Call clang_visitChildren on the given cursor with the lambda as a callback T can be any functor that is callable with a CXCursor parameter and returns a CXChildVisitResult (in other word compatible with function<CXChildVisitResult(CXCursor)>.

Definition at line 347 of file clangcodeparser.cpp.

Variable Documentation

◆ defaultArgs_

const char * defaultArgs_
static
Initial value:
= {
"-std=c++20",
"-fPIC",
"-DQ_QDOC",
"-DQ_CLANG_QDOC",
"-DQT_DISABLE_DEPRECATED_UP_TO=0",
"-DQT_ANNOTATE_CLASS(type,...)=static_assert(sizeof(#__VA_ARGS__),#type);",
"-DQT_ANNOTATE_CLASS2(type,a1,a2)=static_assert(sizeof(#a1,#a2),#type);",
"-DQT_ANNOTATE_FUNCTION(a)=__attribute__((annotate(#a)))",
"-DQT_ANNOTATE_ACCESS_SPECIFIER(a)=__attribute__((annotate(#a)))",
"-Wno-constant-logical-operand",
"-Wno-macro-redefined",
"-Wno-nullability-completeness",
"-fvisibility=default",
"-ferror-limit=0",
"-xc++"
}

Definition at line 1763 of file clangcodeparser.cpp.

Referenced by getDefaultArgs().

◆ flags_

CXTranslationUnit_Flags flags_ = static_cast<CXTranslationUnit_Flags>(0)
static

Definition at line 88 of file clangcodeparser.cpp.

Referenced by buildPCH(), and ClangCodeParser::parse_cpp_file().

◆ fnDummyFileName

const char fnDummyFileName = "/fn_dummyfile.cpp"
constexpr

Definition at line 90 of file clangcodeparser.cpp.

Referenced by FnCommandParser::operator()().

◆ kClangDontDisplayDiagnostics

const auto kClangDontDisplayDiagnostics = 0
static