From 963db49a8bf5fd372a722bba14f1c83f03be26dd Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 19 Nov 2010 13:01:39 +0100 Subject: [PATCH] Introduced a simple AST dumper for GLSL. --- src/libs/glsl/glsl-lib.pri | 4 +- src/libs/glsl/glslastdump.cpp | 64 ++++++++++++++++++++++++++++++++ src/libs/glsl/glslastdump.h | 57 ++++++++++++++++++++++++++++ src/libs/glsl/glslastvisitor.cpp | 6 +++ src/libs/glsl/glslastvisitor.h | 2 + 5 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 src/libs/glsl/glslastdump.cpp create mode 100644 src/libs/glsl/glslastdump.h diff --git a/src/libs/glsl/glsl-lib.pri b/src/libs/glsl/glsl-lib.pri index ead8cdd8e4e..c92e158e478 100644 --- a/src/libs/glsl/glsl-lib.pri +++ b/src/libs/glsl/glsl-lib.pri @@ -1,8 +1,8 @@ HEADERS += $$PWD/glsl.h $$PWD/glsllexer.h $$PWD/glslparser.h $$PWD/glslparsertable_p.h $$PWD/glslast.h \ - $$PWD/glslastvisitor.h $$PWD/glslengine.h $$PWD/glslmemorypool.h + $$PWD/glslastvisitor.h $$PWD/glslengine.h $$PWD/glslmemorypool.h glslastdump.h SOURCES += $$PWD/glslkeywords.cpp $$PWD/glslparser.cpp $$PWD/glslparsertable.cpp \ $$PWD/glsllexer.cpp $$PWD/glslast.cpp \ - $$PWD/glslastvisitor.cpp $$PWD/glslengine.cpp $$PWD/glslmemorypool.cpp + $$PWD/glslastvisitor.cpp $$PWD/glslengine.cpp $$PWD/glslmemorypool.cpp glslastdump.cpp OTHER_FILES = $$PWD/glsl.g \ $$PWD/specs/grammar.txt diff --git a/src/libs/glsl/glslastdump.cpp b/src/libs/glsl/glslastdump.cpp new file mode 100644 index 00000000000..b22ac1bead1 --- /dev/null +++ b/src/libs/glsl/glslastdump.cpp @@ -0,0 +1,64 @@ +/************************************************************************** +** +** 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 "glslastdump.h" +#include + +#ifdef Q_CC_GNU +# include +#endif + +using namespace GLSL; + +ASTDump::ASTDump(QTextStream &out) + : out(out), _depth(0) +{ +} + +void ASTDump::operator()(AST *ast) +{ + _depth = 0; + accept(ast); +} + +bool ASTDump::preVisit(AST *ast) +{ + const char *id = typeid(*ast).name(); +#ifdef Q_CC_GNU + id = abi::__cxa_demangle(id, 0, 0, 0); +#endif + out << QByteArray(_depth, ' ') << id << endl; + ++_depth; + return true; +} + +void ASTDump::postVisit(AST *) +{ + --_depth; +} diff --git a/src/libs/glsl/glslastdump.h b/src/libs/glsl/glslastdump.h new file mode 100644 index 00000000000..c1bc249de38 --- /dev/null +++ b/src/libs/glsl/glslastdump.h @@ -0,0 +1,57 @@ +/************************************************************************** +** +** 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. +** +**************************************************************************/ + +#ifndef GLSLASTDUMP_H +#define GLSLASTDUMP_H + +#include "glslastvisitor.h" + +QT_FORWARD_DECLARE_CLASS(QTextStream) + +namespace GLSL { + +class GLSL_EXPORT ASTDump: protected Visitor +{ +public: + ASTDump(QTextStream &out); + + void operator()(AST *ast); + +protected: + virtual bool preVisit(AST *); + virtual void postVisit(AST *); + +private: + QTextStream &out; + int _depth; +}; + +} // namespace GLSL + +#endif // GLSLASTDUMP_H diff --git a/src/libs/glsl/glslastvisitor.cpp b/src/libs/glsl/glslastvisitor.cpp index da22d0c299d..c0d5bbbcaa3 100644 --- a/src/libs/glsl/glslastvisitor.cpp +++ b/src/libs/glsl/glslastvisitor.cpp @@ -38,3 +38,9 @@ Visitor::Visitor() Visitor::~Visitor() { } + +void Visitor::accept(AST *ast) +{ + if (ast) + ast->accept(this); +} diff --git a/src/libs/glsl/glslastvisitor.h b/src/libs/glsl/glslastvisitor.h index 1214ce19207..2f4b74875e5 100644 --- a/src/libs/glsl/glslastvisitor.h +++ b/src/libs/glsl/glslastvisitor.h @@ -39,6 +39,8 @@ public: Visitor(); virtual ~Visitor(); + void accept(AST *ast); + virtual bool preVisit(AST *) { return true; } virtual void postVisit(AST *) {}