File indexing completed on 2024-05-19 04:41:36
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 }