| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** Contact:  Qt Software Information (qt-info@nokia.com) | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** Commercial Usage | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** 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. | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** 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.
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:17:16 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | ** If you are unsure which license is appropriate for your use, please | 
					
						
							|  |  |  | ** contact the sales department at qt-sales@nokia.com. | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-02-25 09:15:00 +01:00
										 |  |  | **************************************************************************/ | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "CppDocument.h"
 | 
					
						
							| 
									
										
										
										
											2009-06-03 16:16:20 +02:00
										 |  |  | #include "CppBindings.h"
 | 
					
						
							|  |  |  | #include "FastPreprocessor.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-09 15:25:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <Control.h>
 | 
					
						
							|  |  |  | #include <TranslationUnit.h>
 | 
					
						
							|  |  |  | #include <DiagnosticClient.h>
 | 
					
						
							|  |  |  | #include <Semantic.h>
 | 
					
						
							|  |  |  | #include <Literals.h>
 | 
					
						
							|  |  |  | #include <Symbols.h>
 | 
					
						
							|  |  |  | #include <AST.h>
 | 
					
						
							|  |  |  | #include <Scope.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | #include <QByteArray>
 | 
					
						
							|  |  |  | #include <QFile>
 | 
					
						
							|  |  |  | #include <QtDebug>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace CPlusPlus; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | class DocumentDiagnosticClient : public DiagnosticClient | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     enum { MAX_MESSAGE_COUNT = 10 }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     DocumentDiagnosticClient(Document *doc, QList<Document::DiagnosticMessage> *messages) | 
					
						
							|  |  |  |         : doc(doc), | 
					
						
							|  |  |  |           messages(messages) | 
					
						
							|  |  |  |     { } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void report(int level, | 
					
						
							|  |  |  |                         StringLiteral *fileId, | 
					
						
							|  |  |  |                         unsigned line, unsigned column, | 
					
						
							|  |  |  |                         const char *format, va_list ap) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (messages->count() == MAX_MESSAGE_COUNT) | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |         const QString fileName = QString::fromUtf8(fileId->chars(), fileId->size()); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |         if (fileName != doc->fileName()) | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |         QString message; | 
					
						
							|  |  |  |         message.vsprintf(format, ap); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |         Document::DiagnosticMessage m(convertLevel(level), doc->fileName(), | 
					
						
							|  |  |  |                                       line, column, message); | 
					
						
							|  |  |  |         messages->append(m); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |     static int convertLevel(int level) { | 
					
						
							|  |  |  |         switch (level) { | 
					
						
							|  |  |  |             case Warning: return Document::DiagnosticMessage::Warning; | 
					
						
							|  |  |  |             case Error:   return Document::DiagnosticMessage::Error; | 
					
						
							|  |  |  |             case Fatal:   return Document::DiagnosticMessage::Fatal; | 
					
						
							|  |  |  |             default:      return Document::DiagnosticMessage::Error; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  |     Document *doc; | 
					
						
							|  |  |  |     QList<Document::DiagnosticMessage> *messages; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | } // anonymous namespace
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Document::Document(const QString &fileName) | 
					
						
							|  |  |  |     : _fileName(fileName), | 
					
						
							|  |  |  |       _globalNamespace(0) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _control = new Control(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _control->setDiagnosticClient(new DocumentDiagnosticClient(this, &_diagnosticMessages)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const QByteArray localFileName = fileName.toUtf8(); | 
					
						
							|  |  |  |     StringLiteral *fileId = _control->findOrInsertFileName(localFileName.constData(), | 
					
						
							|  |  |  |                                                            localFileName.size()); | 
					
						
							|  |  |  |     _translationUnit = new TranslationUnit(_control, fileId); | 
					
						
							|  |  |  |     _translationUnit->setQtMocRunEnabled(true); | 
					
						
							| 
									
										
										
										
											2009-02-04 11:36:17 +01:00
										 |  |  |     _translationUnit->setObjCEnabled(true); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     (void) _control->switchTranslationUnit(_translationUnit); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Document::~Document() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     delete _translationUnit; | 
					
						
							|  |  |  |     delete _control->diagnosticClient(); | 
					
						
							|  |  |  |     delete _control; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Control *Document::control() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _control; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | QString Document::fileName() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _fileName; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | QStringList Document::includedFiles() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-10 17:21:01 +01:00
										 |  |  |     QStringList files; | 
					
						
							|  |  |  |     foreach (const Include &i, _includes) | 
					
						
							|  |  |  |         files.append(i.fileName()); | 
					
						
							|  |  |  |     files.removeDuplicates(); | 
					
						
							|  |  |  |     return files; | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 17:21:01 +01:00
										 |  |  | void Document::addIncludeFile(const QString &fileName, unsigned line) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-10 17:21:01 +01:00
										 |  |  |     _includes.append(Include(fileName, line)); | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 12:59:33 +01:00
										 |  |  | void Document::appendMacro(const Macro ¯o) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-08 12:59:33 +01:00
										 |  |  |     _definedMacros.append(macro); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-04 11:47:30 +01:00
										 |  |  | void Document::addMacroUse(const Macro ¯o, unsigned offset, unsigned length, | 
					
						
							|  |  |  |                            const QVector<MacroArgumentReference> &actuals) | 
					
						
							| 
									
										
										
										
											2008-12-04 12:05:04 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-04 11:47:30 +01:00
										 |  |  |     MacroUse use(macro, offset, offset + length); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     foreach (const MacroArgumentReference &actual, actuals) { | 
					
						
							|  |  |  |         const Block arg(actual.position(), actual.position() + actual.length()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         use.addArgument(arg); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _macroUses.append(use); | 
					
						
							| 
									
										
										
										
											2008-12-04 12:05:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | TranslationUnit *Document::translationUnit() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _translationUnit; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | bool Document::skipFunctionBody() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _translationUnit->skipFunctionBody(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Document::setSkipFunctionBody(bool skipFunctionBody) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     _translationUnit->setSkipFunctionBody(skipFunctionBody); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | unsigned Document::globalSymbolCount() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (! _globalNamespace) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return _globalNamespace->memberCount(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Symbol *Document::globalSymbolAt(unsigned index) const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _globalNamespace->memberAt(index); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Scope *Document::globalSymbols() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (! _globalNamespace) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return _globalNamespace->members(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Namespace *Document::globalNamespace() const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return _globalNamespace; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Symbol *Document::findSymbolAt(unsigned line, unsigned column) const | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     return findSymbolAt(line, column, globalSymbols()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Symbol *Document::findSymbolAt(unsigned line, unsigned column, Scope *scope) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Symbol *previousSymbol = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (unsigned i = 0; i < scope->symbolCount(); ++i) { | 
					
						
							|  |  |  |         Symbol *symbol = scope->symbolAt(i); | 
					
						
							|  |  |  |         if (symbol->line() > line) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         previousSymbol = symbol; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (previousSymbol) { | 
					
						
							|  |  |  |         if (ScopedSymbol *scoped = previousSymbol->asScopedSymbol()) { | 
					
						
							|  |  |  |             if (Symbol *member = findSymbolAt(line, column, scoped->members())) | 
					
						
							|  |  |  |                 return member; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return previousSymbol; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Document::Ptr Document::create(const QString &fileName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Document::Ptr doc(new Document(fileName)); | 
					
						
							|  |  |  |     return doc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Document::setSource(const QByteArray &source) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-24 11:04:52 +01:00
										 |  |  |     _source = source; | 
					
						
							|  |  |  |     _translationUnit->setSource(_source.constBegin(), _source.size()); | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Document::startSkippingBlocks(unsigned start) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     _skippedBlocks.append(Block(start, 0)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Document::stopSkippingBlocks(unsigned stop) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-10 22:56:04 +01:00
										 |  |  |     if (_skippedBlocks.isEmpty()) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |     unsigned start = _skippedBlocks.back().begin(); | 
					
						
							|  |  |  |     if (start > stop) | 
					
						
							|  |  |  |         _skippedBlocks.removeLast(); // Ignore this block, it's invalid.
 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         _skippedBlocks.back() = Block(start, stop); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-24 11:04:52 +01:00
										 |  |  | bool Document::isTokenized() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return _translationUnit->isTokenized(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Document::tokenize() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _translationUnit->tokenize(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool Document::isParsed() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return _translationUnit->isParsed(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-03 14:01:19 +01:00
										 |  |  | bool Document::parse(ParseMode mode) | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-03 14:01:19 +01:00
										 |  |  |     TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit; | 
					
						
							|  |  |  |     switch (mode) { | 
					
						
							|  |  |  |     case ParseTranlationUnit: | 
					
						
							|  |  |  |         m = TranslationUnit::ParseTranlationUnit; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case ParseDeclaration: | 
					
						
							|  |  |  |         m = TranslationUnit::ParseDeclaration; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case ParseExpression: | 
					
						
							|  |  |  |         m = TranslationUnit::ParseExpression; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-30 15:07:30 +02:00
										 |  |  |     case ParseDeclarator: | 
					
						
							|  |  |  |         m = TranslationUnit::ParseDeclarator; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-03 14:01:19 +01:00
										 |  |  |     case ParseStatement: | 
					
						
							|  |  |  |         m = TranslationUnit::ParseStatement; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return _translationUnit->parse(m); | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Document::check() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-10 15:43:17 +01:00
										 |  |  |     Q_ASSERT(!_globalNamespace); | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Semantic semantic(_control); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _globalNamespace = _control->newNamespace(0); | 
					
						
							|  |  |  |     Scope *globals = _globalNamespace->members(); | 
					
						
							| 
									
										
										
										
											2008-12-03 14:01:19 +01:00
										 |  |  |     if (! _translationUnit->ast()) | 
					
						
							|  |  |  |         return; // nothing to do.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (TranslationUnitAST *ast = _translationUnit->ast()->asTranslationUnit()) { | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  |         for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) { | 
					
						
							|  |  |  |             semantic.check(decl, globals); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-24 11:04:52 +01:00
										 |  |  | void Document::releaseSource() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     _source.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-02 12:01:29 +01:00
										 |  |  | void Document::releaseTranslationUnit() | 
					
						
							| 
									
										
										
										
											2008-12-02 14:09:21 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     _translationUnit->release(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-03-04 11:47:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | Snapshot::Snapshot() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Snapshot::~Snapshot() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Snapshot::insert(Document::Ptr doc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (doc) | 
					
						
							|  |  |  |         insert(doc->fileName(), doc); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-03 16:16:20 +02:00
										 |  |  | QByteArray Snapshot::preprocessedCode(const QByteArray &source, const QString &fileName) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     FastPreprocessor pp(*this); | 
					
						
							|  |  |  |     return pp.run(fileName, source); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Document::Ptr Snapshot::documentFromSource(const QByteArray &preprocessedCode, | 
					
						
							|  |  |  |                                            const QString &fileName) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (Document::Ptr thisDocument = value(fileName)) { | 
					
						
							|  |  |  |         FastPreprocessor pp(*this); | 
					
						
							|  |  |  |         Document::Ptr newDoc = Document::create(fileName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         newDoc->_includes = thisDocument->_includes; | 
					
						
							|  |  |  |         newDoc->_definedMacros = thisDocument->_definedMacros; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         newDoc->setSource(preprocessedCode); | 
					
						
							|  |  |  |         newDoc->parse(); | 
					
						
							|  |  |  |         return newDoc; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return Document::Ptr(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QSharedPointer<NamespaceBinding> Snapshot::globalNamespaceBinding(Document::Ptr doc) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return CPlusPlus::bind(doc, *this); | 
					
						
							|  |  |  | } |