forked from qt-creator/qt-creator
Some code to simplify the debugging of ASTs.
This commit is contained in:
@@ -63,6 +63,8 @@
|
|||||||
#include <Names.h>
|
#include <Names.h>
|
||||||
#include <NameVisitor.h>
|
#include <NameVisitor.h>
|
||||||
#include <TypeVisitor.h>
|
#include <TypeVisitor.h>
|
||||||
|
#include <ASTVisitor.h>
|
||||||
|
#include <PrettyPrinter.h>
|
||||||
#include <Lexer.h>
|
#include <Lexer.h>
|
||||||
#include <Token.h>
|
#include <Token.h>
|
||||||
|
|
||||||
@@ -70,11 +72,55 @@
|
|||||||
#include <QtCore/QMutexLocker>
|
#include <QtCore/QMutexLocker>
|
||||||
#include <QtCore/QTime>
|
#include <QtCore/QTime>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
using namespace CppTools;
|
using namespace CppTools;
|
||||||
using namespace CppTools::Internal;
|
using namespace CppTools::Internal;
|
||||||
using namespace CPlusPlus;
|
using namespace CPlusPlus;
|
||||||
|
|
||||||
|
#if defined(QTCREATOR_WITH_DUMP_AST) && defined(Q_CC_GNU)
|
||||||
|
|
||||||
|
#include <cxxabi.h>
|
||||||
|
|
||||||
|
class DumpAST: protected ASTVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int depth;
|
||||||
|
|
||||||
|
DumpAST(Control *control)
|
||||||
|
: ASTVisitor(control), depth(0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void operator()(AST *ast)
|
||||||
|
{ accept(ast); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool preVisit(AST *ast)
|
||||||
|
{
|
||||||
|
std::ostringstream s;
|
||||||
|
PrettyPrinter pp(control(), s);
|
||||||
|
pp(ast);
|
||||||
|
QString code = QString::fromStdString(s.str());
|
||||||
|
code.replace('\n', ' ');
|
||||||
|
code.replace(QRegExp("\\s+"), " ");
|
||||||
|
|
||||||
|
const char *name = abi::__cxa_demangle(typeid(*ast).name(), 0, 0, 0) + 11;
|
||||||
|
|
||||||
|
QByteArray ind(depth, ' ');
|
||||||
|
ind += name;
|
||||||
|
|
||||||
|
printf("%-40s %s\n", ind.constData(), qPrintable(code));
|
||||||
|
++depth;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void postVisit(AST *)
|
||||||
|
{ --depth; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif QTCREATOR_WITH_DUMP_AST
|
||||||
|
|
||||||
static const char pp_configuration_file[] = "<configuration>";
|
static const char pp_configuration_file[] = "<configuration>";
|
||||||
|
|
||||||
static const char pp_configuration[] =
|
static const char pp_configuration[] =
|
||||||
@@ -413,6 +459,12 @@ void CppPreprocessor::sourceNeeded(QString &fileName, IncludeType type,
|
|||||||
|
|
||||||
m_currentDoc->setSource(preprocessedCode);
|
m_currentDoc->setSource(preprocessedCode);
|
||||||
m_currentDoc->parse();
|
m_currentDoc->parse();
|
||||||
|
|
||||||
|
#if defined(QTCREATOR_WITH_DUMP_AST) && defined(Q_CC_GNU)
|
||||||
|
DumpAST dump(m_currentDoc->control());
|
||||||
|
dump(m_currentDoc->translationUnit()->ast());
|
||||||
|
#endif
|
||||||
|
|
||||||
m_currentDoc->check();
|
m_currentDoc->check();
|
||||||
m_currentDoc->releaseTranslationUnit(); // release the AST and the token stream.
|
m_currentDoc->releaseTranslationUnit(); // release the AST and the token stream.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user