File indexing completed on 2024-05-19 15:46:17

0001 /*
0002     SPDX-FileCopyrightText: 2006 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "qmakedriver.h"
0008 
0009 #include <QTextStream>
0010 #include <QTextCodec>
0011 #include <QFile>
0012 
0013 #include <debug.h>
0014 #include "qmakeparser.h"
0015 #include "qmakeast.h"
0016 
0017 #include "qmakedebugvisitor.h"
0018 #include "buildastvisitor.h"
0019 
0020 #include "ast.h"
0021 
0022 #define ifDebug(x)
0023 
0024 namespace QMake {
0025 
0026 Driver::Driver()
0027 {
0028 }
0029 
0030 bool Driver::readFile(const QString& filename, const char* codec)
0031 {
0032     QFile f(filename);
0033     if (!f.open(QIODevice::ReadOnly)) {
0034         qCWarning(KDEV_QMAKE) << "Couldn't open project file:" << filename;
0035         return false;
0036     }
0037     QTextStream s(&f);
0038     if (codec)
0039         s.setCodec(QTextCodec::codecForName(codec));
0040     m_content = s.readAll();
0041     return true;
0042 }
0043 void Driver::setContent(const QString& content)
0044 {
0045     m_content = content;
0046 }
0047 void Driver::setDebug(bool debug)
0048 {
0049     m_debug = debug;
0050 }
0051 bool Driver::parse(ProjectAST** qmast)
0052 {
0053     KDevPG::TokenStream tokenStream;
0054     KDevPG::MemoryPool memory_pool;
0055 
0056     Parser qmakeparser;
0057     qmakeparser.setTokenStream(&tokenStream);
0058     qmakeparser.setMemoryPool(&memory_pool);
0059     qmakeparser.setDebug(m_debug);
0060 
0061     qmakeparser.tokenize(m_content);
0062     ProjectAst* ast = nullptr;
0063     bool matched = qmakeparser.parseProject(&ast);
0064     if (matched) {
0065         ifDebug(qCDebug(KDEV_QMAKE) << "Successfully parsed";) if (m_debug)
0066         {
0067             DebugVisitor d(&qmakeparser);
0068             d.visitProject(ast);
0069         }
0070         if (*qmast)
0071             delete *qmast;
0072         *qmast = new ProjectAST();
0073         BuildASTVisitor d(&qmakeparser, *qmast);
0074         d.visitProject(ast);
0075         ifDebug(qCDebug(KDEV_QMAKE) << "Found" << (*qmast)->statements.count() << "Statements";)
0076     } else {
0077         ast = nullptr;
0078         qCDebug(KDEV_QMAKE) << "Couldn't parse content";
0079     }
0080     return matched;
0081 }
0082 }