31 #include <QTextStream>
36 DefaultSourceProvider() {}
38 virtual QString
contents(
const QString& fileName)
43 if(f.open(QIODevice::ReadOnly)){
51 virtual bool isModified(
const QString& fileName)
58 DefaultSourceProvider(
const DefaultSourceProvider& source);
59 void operator = (
const DefaultSourceProvider& source);
64 : depresolv(false), lexer(0)
66 m_sourceProvider =
new DefaultSourceProvider();
72 delete(m_sourceProvider);
77 return m_sourceProvider;
83 delete(m_sourceProvider);
89 m_dependences.clear();
90 m_macroManager.reset();
92 m_includePaths.clear();
94 QMapIterator<QString, TranslationUnitAST*> it(m_parsedUnits);
99 m_parsedUnits.clear();
102 void Driver::MacroManager::reset()
107 void Driver::MacroManager::removeAllMacrosInFile(
const QString& fileName)
110 MacroMap::iterator l_it = m_macros.begin();
111 while(l_it != m_macros.end()){
112 if(l_it->second.fileName() == fileName)
113 m_macros.erase(l_it);
121 QMap<QString, TranslationUnitAST*>::Iterator it = m_parsedUnits.find(fileName);
123 m_parsedUnits[ fileName] = 0;
129 QMap<QString, TranslationUnitAST*>::ConstIterator it = m_parsedUnits.find(fileName);
130 return it != m_parsedUnits.end() ? *it : 0;
135 QFileInfo fileInfo(dep.first);
136 QString fn = fileInfo.absoluteFilePath();
139 findOrInsertDependenceList(fileName).insert(fn, dep);
143 QString file = findIncludeFile(dep);
144 findOrInsertDependenceList(fileName).insert(file, dep);
146 if (m_parsedUnits.find(file) != m_parsedUnits.end())
149 if (!QFile::exists(file)) {
150 Problem p(
"Could not find include file " + dep.first,
156 QString cfn = m_currentFileName;
159 m_currentFileName = cfn;
163 void Driver::MacroManager::addMacro(
const Macro & macro)
165 m_macros.insert(MacroMap::value_type(macro.
name(), macro));
170 findOrInsertProblemList(fileName).append(problem);
173 QMap< QString, Dependence >& Driver::findOrInsertDependenceList(
const QString & fileName)
175 QMap<QString, QMap<QString, Dependence> >::Iterator it = m_dependences.find(fileName);
176 if(it != m_dependences.end())
179 QMap<QString, Dependence> l;
180 m_dependences.insert(fileName, l);
181 return m_dependences[ fileName ];
186 QMap<QString, QList<Problem> >::Iterator it = m_problems.find(fileName);
187 if(it != m_problems.end())
191 m_problems.insert(fileName, l);
192 return m_problems[ fileName ];
197 QMap<QString, QMap<QString, Dependence> >::ConstIterator it = m_dependences.find(fileName);
198 if(it != m_dependences.end())
200 return QMap<QString, Dependence>();
203 Driver::MacroMap
const& Driver::MacroManager::macros()
const
208 QMap<QString, QList<Problem> >::ConstIterator it = m_problems.find(fileName);
209 if(it != m_problems.end())
216 QFileInfo fileInfo(fileName);
217 QString absoluteFilePath = fileInfo.absoluteFilePath();
219 QMap<QString, TranslationUnitAST*>::Iterator it = m_parsedUnits.find(absoluteFilePath);
221 if(force && it != m_parsedUnits.end()){
223 }
else if(it != m_parsedUnits.end() && *it != 0){
228 m_dependences.remove(fileName);
229 m_problems.remove(fileName);
231 m_currentFileName = fileName;
241 Parser parser(
this, &lex);
246 m_parsedUnits.insert(fileName, translationUnit.release());
250 m_currentFileName.clear();
260 lexer->
addSkipWord(
"__STL_BEGIN_RELOPS_NAMESPACE");
292 lexer->
addSkipWord(
"__attribute_format_strfmon__");
385 void Driver::MacroManager::removeMacro(
const QString& macroName)
387 m_macros.erase(macroName);
392 if(!path.trimmed().isEmpty())
393 m_includePaths << path;
396 QString Driver::findIncludeFile(
const Dependence& dep)
const
398 QString fileName = dep.first;
402 QFileInfo fileInfo(QFileInfo(path, fileName));
403 if (fileInfo.exists() && fileInfo.isFile())
404 return fileInfo.absoluteFilePath();
408 QStringList::ConstIterator end(m_includePaths.end());
409 for (QStringList::ConstIterator it(m_includePaths.begin()); it != end; ++it) {
410 QFileInfo fileInfo(*it, fileName);
411 if (fileInfo.exists() && fileInfo.isFile())
412 return fileInfo.absoluteFilePath();
Position currentPosition() const
void setSourceProvider(SourceProvider *sourceProvider)
virtual bool parseFile(const QString &fileName, bool onlyPreProcesss=false, bool force=false)
virtual void setupLexer(Lexer *lexer)
virtual QString contents(const QString &fileName)=0
QMap< QString, Dependence > dependences(const QString &fileName) const
SourceProvider * sourceProvider()
virtual void setupParser(Parser *parser)
void addSkipWord(const QString &word, SkipType skipType=SkipWord, const QString &str=QString())
TranslationUnitAST::Node takeTranslationUnit(const QString &fileName)
virtual void setupPreProcessor()
virtual void fileParsed(const QString &fileName)
QString currentFileName() const
virtual void setResolveDependencesEnabled(bool enabled)
TranslationUnitAST * translationUnit(const QString &fileName) const
QList< Problem > problems(const QString &fileName) const
QString const & name() const
virtual bool isModified(const QString &fileName)=0
virtual void addDependence(const QString &fileName, const Dependence &dep)
bool setSource(const QString &source, const QString &p_filename)
virtual void addIncludePath(const QString &path)
bool parseTranslationUnit(TranslationUnitAST::Node &node)
AUTO_PTR< TranslationUnitAST > Node
QPair< QString, int > Dependence
virtual void addMacro(const Macro ¯o)
virtual void addProblem(const QString &fileName, const Problem &problem)