/*************************************************************************** * Copyright (C) 2005 by Alexander Dymo * * adymo@kdevelop.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include #include "qmakedriver.h" #include "qmakeastvisitor.h" #include #include #include #include static const KCmdLineOptions options[] = { {"silent", "Enable Parser debug output", 0}, {"!debug", "Disable output of the generated AST", 0}, {"!+files", "QMake project files", 0} }; class PrintAST : QMake::ASTVisitor { public: PrintAST() : QMake::ASTVisitor() { indent = 0; } virtual void processProject( QMake::ProjectAST* p ) { QMake::ASTVisitor::processProject(p); } private: virtual void enterRealProject( QMake::ProjectAST* p ) { kdDebug(9024) << getIndent() << "--------- Entering Project: " << replaceWs(p->fileName()) << "| LineEnding:" << p->lineEnding() << " --------------" << endl; indent += 4; QMake::ASTVisitor::enterRealProject(p); } virtual void leaveRealProject( QMake::ProjectAST* p ) { indent -= 4; kdDebug(9024) << getIndent() << "--------- Leaving Project: " << replaceWs(p->fileName()) << " --------------" << endl; QMake::ASTVisitor::leaveRealProject(p); } virtual void enterScope( QMake::ProjectAST* p ) { kdDebug(9024) << getIndent() << "--------- Entering Scope: " << replaceWs(p->scopedID) << " --------------" << endl; indent += 4; QMake::ASTVisitor::enterScope(p); } virtual void leaveScope( QMake::ProjectAST* p ) { indent -= 4; kdDebug(9024) << getIndent() << "--------- Leaving Scope: " << replaceWs(p->scopedID) << " --------------" << endl; QMake::ASTVisitor::leaveScope(p); } virtual void enterFunctionScope( QMake::ProjectAST* p ) { kdDebug(9024) << getIndent() << "--------- Entering FunctionScope: " << replaceWs(p->scopedID) << "(" << replaceWs(p->args) << ")"<< " --------------" << endl; indent += 4; QMake::ASTVisitor::enterFunctionScope(p); } virtual void leaveFunctionScope( QMake::ProjectAST* p ) { indent -= 4; kdDebug(9024) << getIndent() << "--------- Leaving FunctionScope: " << replaceWs(p->scopedID) << "(" << replaceWs(p->args) << ")"<< " --------------" << endl; QMake::ASTVisitor::leaveFunctionScope(p); } QString replaceWs(QString s) { return s.replace("\n", "%nl").replace("\t", "%tab").replace(" ", "%spc"); } virtual void processAssignment( QMake::AssignmentAST* a) { kdDebug(9024) << getIndent() << "Assignment(" << replaceWs(a->indent) << "):" << replaceWs(a->scopedID) << " " << replaceWs(a->op) << " " << replaceWs(a->values.join("|")) << endl; QMake::ASTVisitor::processAssignment(a); } virtual void processNewLine( QMake::NewLineAST* n) { kdDebug(9024) << getIndent() << "Newline " << endl; QMake::ASTVisitor::processNewLine(n); } virtual void processComment( QMake::CommentAST* a) { kdDebug(9024) << getIndent() << "Comment: " << replaceWs(a->comment) << endl; QMake::ASTVisitor::processComment(a); } virtual void processInclude( QMake::IncludeAST* a) { kdDebug(9024) << getIndent() << "Include: " << replaceWs(a->projectName) << endl; QMake::ASTVisitor::processInclude(a); } QString getIndent() { QString ind; for( int i = 0 ; i < indent ; i++) ind += " "; return ind; } int indent; }; int main(int argc, char *argv[]) { KCmdLineArgs::init( argc, argv, "QMake Parser", "qmake-parser", "Parse QMake project files", "1.0.0"); KCmdLineArgs::addCmdLineOptions(options); KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if( args->count() < 1 ) { KCmdLineArgs::usage(0); } int debug = 0; bool silent = false; if( args->isSet("silent") ) silent = true; if( args->isSet("debug") ) debug = 1; for( int i = 0 ; i < args->count() ; i++ ) { QMake::ProjectAST *projectAST; int ret = QMake::Driver::parseFile(args->url(i).path(), &projectAST, debug); PrintAST pa; if ( ret == 0 ) if ( !silent ) { pa.processProject(projectAST); QString profile; projectAST->writeBack(profile); kdDebug(9024) << "QMake file written back:\n" << profile << endl; } return ret; } return 0; }