diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-08 12:12:58 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-03-08 12:14:51 +0100 |
commit | 0e1632567c1b91ae54d00dbaca2f22405ca72eff (patch) | |
tree | 68a06b616fc52a22043a9621849fa6e9a2c14251 /tests | |
parent | f12753a499b606534e3f84eb3dfac51f27943e72 (diff) | |
download | qt-creator-0e1632567c1b91ae54d00dbaca2f22405ca72eff.tar.gz |
Initial work on an AST dumper.
That will be pretty helpful to understand what's going wrong with
templates.
Diffstat (limited to 'tests')
-rwxr-xr-x | tests/manual/cplusplus-dump/c++ | 5 | ||||
-rw-r--r-- | tests/manual/cplusplus-dump/conf.c++ | 15 | ||||
-rw-r--r-- | tests/manual/cplusplus-dump/cplusplus-dump.pro | 19 | ||||
-rw-r--r-- | tests/manual/cplusplus-dump/main.cpp | 132 | ||||
-rw-r--r-- | tests/manual/cplusplus-dump/tests/templ01.cpp | 17 |
5 files changed, 188 insertions, 0 deletions
diff --git a/tests/manual/cplusplus-dump/c++ b/tests/manual/cplusplus-dump/c++ new file mode 100755 index 0000000000..a5908b79ff --- /dev/null +++ b/tests/manual/cplusplus-dump/c++ @@ -0,0 +1,5 @@ +#!/bin/sh +me=$(dirname $0) +${CPP-gcc} -U__BLOCKS__ -xc++ -E -include $me/conf.c++ $* > $me/file.i +$me/cplusplus0 $me/file.i + diff --git a/tests/manual/cplusplus-dump/conf.c++ b/tests/manual/cplusplus-dump/conf.c++ new file mode 100644 index 0000000000..69bafe0459 --- /dev/null +++ b/tests/manual/cplusplus-dump/conf.c++ @@ -0,0 +1,15 @@ +#define __extension__ +#define __context__ +#define __range__ +#define __asm(a...) +#define __asm__(a...) +#define restrict +#define __restrict +#define __restrict__ +// #define __weak +#define __builtin_va_arg(a,b) ((b)0) +#define __stdcall +#define __fastcall +#define __imag__ +#define __real__ +#define __complex__ diff --git a/tests/manual/cplusplus-dump/cplusplus-dump.pro b/tests/manual/cplusplus-dump/cplusplus-dump.pro new file mode 100644 index 0000000000..4964d9c5ea --- /dev/null +++ b/tests/manual/cplusplus-dump/cplusplus-dump.pro @@ -0,0 +1,19 @@ +QT = core gui +macx:CONFIG -= app_bundle +TARGET = cplusplus0 + +include(../../../src/libs/cplusplus/cplusplus-lib.pri) + +# Input +SOURCES += main.cpp + +unix { + debug:OBJECTS_DIR = $${OUT_PWD}/.obj/debug-shared + release:OBJECTS_DIR = $${OUT_PWD}/.obj/release-shared + + debug:MOC_DIR = $${OUT_PWD}/.moc/debug-shared + release:MOC_DIR = $${OUT_PWD}/.moc/release-shared + + RCC_DIR = $${OUT_PWD}/.rcc/ + UI_DIR = $${OUT_PWD}/.uic/ +} diff --git a/tests/manual/cplusplus-dump/main.cpp b/tests/manual/cplusplus-dump/main.cpp new file mode 100644 index 0000000000..dfd80b6b40 --- /dev/null +++ b/tests/manual/cplusplus-dump/main.cpp @@ -0,0 +1,132 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include <AST.h> +#include <ASTVisitor.h> +#include <ASTPatternBuilder.h> +#include <ASTMatcher.h> +#include <Control.h> +#include <Scope.h> +#include <Semantic.h> +#include <TranslationUnit.h> +#include <Literals.h> +#include <Symbols.h> +#include <Names.h> +#include <CoreTypes.h> +#include <CppDocument.h> + +#include <QFile> +#include <QList> +#include <QCoreApplication> +#include <QStringList> +#include <QFileInfo> +#include <QTime> +#include <QtDebug> + +#include <cstdio> +#include <cstdlib> +#include <iostream> +#include <cxxabi.h> + +using namespace CPlusPlus; + +class ASTDump: protected ASTVisitor +{ +public: + ASTDump(TranslationUnit *unit) + : ASTVisitor(unit) {} + + void operator()(AST *ast) { + std::cout << "digraph AST {" << std::endl; + accept(ast); + std::cout << "}" << std::endl; + } + +protected: + std::string name(AST *ast) const { + QByteArray name = abi::__cxa_demangle(typeid(*ast).name(), 0, 0, 0) + 11; + name.truncate(name.length() - 3); + name = QByteArray::number(_id.value(ast)) + ". " + name; + const char *x = spell(ast->firstToken()); + name += ' '; + name += x; + + name.prepend('"'); + name.append('"'); + + return std::string(name); + } + + virtual bool preVisit(AST *ast) { + static int count = 1; + _id[ast] = count++; + + if (! _stack.isEmpty()) + std::cout << name(_stack.last()) << " -> " << name(ast) << ";" << std::endl; + + _stack.append(ast); + + return true; + } + + virtual void postVisit(AST *ast) { + _stack.removeLast(); + } + +private: + QHash<AST *, int> _id; + QList<AST *> _stack; +}; + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + + QStringList files = app.arguments(); + files.removeFirst(); + + foreach (const QString &fileName, files) { + QFile file(fileName); + if (! file.open(QFile::ReadOnly)) + continue; + + const QByteArray source = file.readAll(); + file.close(); + + Document::Ptr doc = Document::create(fileName); + doc->control()->setDiagnosticClient(0); + doc->setSource(source); + doc->parse(); + + ASTDump dump(doc->translationUnit()); + dump(doc->translationUnit()->ast()); + } + + return EXIT_SUCCESS; +} diff --git a/tests/manual/cplusplus-dump/tests/templ01.cpp b/tests/manual/cplusplus-dump/tests/templ01.cpp new file mode 100644 index 0000000000..dcabffae59 --- /dev/null +++ b/tests/manual/cplusplus-dump/tests/templ01.cpp @@ -0,0 +1,17 @@ + +struct QString +{ + void append(char ch); +}; + +template <typename _Tp> struct QList { + const _Tp &at(int index); +}; + +struct QStringList: public QList<QString> {}; + +int main() +{ + QStringList l; + l.at(0).append('a'); +} |