From c33a5f38ae85484d1330a9057db58224e228babd Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 7 Oct 2009 13:56:59 +0200 Subject: Removed the MacroResolver Unfortunately, the MacroResolver does not scale and we get pretty bad performances when parsing big projects. (cherry picked from commit 77aa3064783d64cc7d028772a59f13e5f0cd4780) --- src/libs/cplusplus/FastPreprocessor.cpp | 49 ---------------------- src/libs/cplusplus/FastPreprocessor.h | 16 ------- src/plugins/cppeditor/cppeditor.cpp | 4 -- src/plugins/cpptools/cppfindreferences.cpp | 8 +--- .../cplusplus/CPlusPlusForwardDeclarations.h | 1 - src/shared/cplusplus/Control.cpp | 15 +------ src/shared/cplusplus/Control.h | 15 ------- src/shared/cplusplus/Parser.cpp | 12 ------ src/shared/cplusplus/Parser.h | 2 - 9 files changed, 3 insertions(+), 119 deletions(-) diff --git a/src/libs/cplusplus/FastPreprocessor.cpp b/src/libs/cplusplus/FastPreprocessor.cpp index 4a4c10d732..b61f61cee7 100644 --- a/src/libs/cplusplus/FastPreprocessor.cpp +++ b/src/libs/cplusplus/FastPreprocessor.cpp @@ -34,55 +34,6 @@ using namespace CPlusPlus; -FastMacroResolver::FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot) - : _unit(unit), _snapshot(snapshot) -{ - const QString fileName = QString::fromUtf8(unit->fileName(), unit->fileNameLength()); - - QSet processed; - updateCache(fileName, &processed); -} - -bool FastMacroResolver::isMacro(TranslationUnit *unit, unsigned tokenIndex) const -{ - if (unit != _unit){ - qWarning() << Q_FUNC_INFO << "unexpected translation unit:" << unit->fileName(); - return false; - } - - const Token &tk = unit->tokenAt(tokenIndex); - if (tk.isNot(T_IDENTIFIER)) - return false; - - Identifier *id = tk.identifier; - const QByteArray macroName = QByteArray::fromRawData(id->chars(), id->size()); - return _cachedMacros.contains(macroName); -} - -void FastMacroResolver::updateCache(const QString &fileName, QSet *processed) -{ - if (processed->contains(fileName)) - return; - - processed->insert(fileName); - - if (Document::Ptr doc = _snapshot.value(fileName)) { - const QList definedMacros = doc->definedMacros(); - - for (int i = definedMacros.size() - 1; i != -1; --i) { - const Macro ¯o = definedMacros.at(i); - - if (macro.isHidden()) - _cachedMacros.remove(macro.name()); - else - _cachedMacros.insert(macro.name()); - } - - foreach (const Document::Include &incl, doc->includes()) - updateCache(incl.fileName(), processed); - } -} - FastPreprocessor::FastPreprocessor(const Snapshot &snapshot) : _snapshot(snapshot), _preproc(this, &_env) diff --git a/src/libs/cplusplus/FastPreprocessor.h b/src/libs/cplusplus/FastPreprocessor.h index 83d1bb257f..ebbc8d1752 100644 --- a/src/libs/cplusplus/FastPreprocessor.h +++ b/src/libs/cplusplus/FastPreprocessor.h @@ -41,22 +41,6 @@ namespace CPlusPlus { -class CPLUSPLUS_EXPORT FastMacroResolver: public MacroResolver -{ -public: - FastMacroResolver(TranslationUnit *unit, const Snapshot &snapshot); - - virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const; - -private: - void updateCache(const QString &fileName, QSet *processed); - -private: - TranslationUnit *_unit; - Snapshot _snapshot; - QSet _cachedMacros; -}; - class CPLUSPLUS_EXPORT FastPreprocessor: public Client { Environment _env; diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index d048f6dee9..13228855f9 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -2090,11 +2090,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) snapshot = source.snapshot; doc = source.snapshot.documentFromSource(preprocessedCode, source.fileName); - - FastMacroResolver fastMacroResolver(doc->translationUnit(), snapshot); - doc->control()->setMacroResolver(&fastMacroResolver); doc->check(); - doc->control()->setMacroResolver(0); } Control *control = doc->control(); diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 6d9b9f8d0e..26f9a18696 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -531,13 +531,7 @@ static void find_helper(QFutureInterface &future, if (Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size())) { QTime tm; tm.start(); - TranslationUnit *unit = doc->translationUnit(); - Control *control = doc->control(); - - FastMacroResolver fastMacroResolver(unit, snapshot); - control->setMacroResolver(&fastMacroResolver); doc->parse(); - control->setMacroResolver(0); //qDebug() << "***" << unit->fileName() << "parsed in:" << tm.elapsed(); @@ -548,6 +542,8 @@ static void find_helper(QFutureInterface &future, tm.start(); Process process(doc, snapshot, &future); + + TranslationUnit *unit = doc->translationUnit(); process(symbol, id, unit->ast()); //qDebug() << "***" << unit->fileName() << "processed in:" << tm.elapsed(); diff --git a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h index 2467d4c56b..b060f11dfa 100644 --- a/src/shared/cplusplus/CPlusPlusForwardDeclarations.h +++ b/src/shared/cplusplus/CPlusPlusForwardDeclarations.h @@ -83,7 +83,6 @@ class Semantic; class Control; class MemoryPool; class DiagnosticClient; -class MacroResolver; class Identifier; class Literal; diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index 6338d99fd2..30c5552bbe 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -59,11 +59,6 @@ CPLUSPLUS_BEGIN_NAMESPACE -MacroResolver::MacroResolver() -{ } - -MacroResolver::~MacroResolver() -{ } template static void delete_map_entries(_Iterator first, _Iterator last) @@ -93,8 +88,7 @@ public: Data(Control *control) : control(control), translationUnit(0), - diagnosticClient(0), - macroResolver(0) + diagnosticClient(0) { } ~Data() @@ -539,7 +533,6 @@ public: Control *control; TranslationUnit *translationUnit; DiagnosticClient *diagnosticClient; - MacroResolver *macroResolver; LiteralTable identifiers; LiteralTable stringLiterals; LiteralTable numericLiterals; @@ -602,12 +595,6 @@ TranslationUnit *Control::switchTranslationUnit(TranslationUnit *unit) return previousTranslationUnit; } -MacroResolver *Control::macroResolver() const -{ return d->macroResolver; } - -void Control::setMacroResolver(MacroResolver *macroResolver) -{ d->macroResolver = macroResolver; } - DiagnosticClient *Control::diagnosticClient() const { return d->diagnosticClient; } diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index 060be182b6..9a41629fea 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -55,18 +55,6 @@ CPLUSPLUS_BEGIN_HEADER CPLUSPLUS_BEGIN_NAMESPACE -class CPLUSPLUS_EXPORT MacroResolver -{ - MacroResolver(const MacroResolver &other); - void operator = (const MacroResolver &other); - -public: - MacroResolver(); - virtual ~MacroResolver(); - - virtual bool isMacro(TranslationUnit *unit, unsigned tokenIndex) const = 0; -}; - class CPLUSPLUS_EXPORT Control { public: @@ -76,9 +64,6 @@ public: TranslationUnit *translationUnit() const; TranslationUnit *switchTranslationUnit(TranslationUnit *unit); - MacroResolver *macroResolver() const; - void setMacroResolver(MacroResolver *macroResolver); - DiagnosticClient *diagnosticClient() const; void setDiagnosticClient(DiagnosticClient *diagnosticClient); diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index d335b5ebff..958d740a58 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -244,14 +244,6 @@ void Parser::match(int kind, unsigned *token) } } -bool Parser::isMacro(unsigned tokenIndex) const -{ - if (MacroResolver *r = _control->macroResolver()) - return r->isMacro(_translationUnit, tokenIndex); - - return false; -} - bool Parser::parseClassOrNamespaceName(NameAST *&node) { if (LA() == T_IDENTIFIER) { @@ -2561,10 +2553,6 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierAST *&node) bool Parser::parseSimpleDeclaration(DeclarationAST *&node, bool acceptStructDeclarator) { - if (LA() == T_IDENTIFIER && isMacro(cursor())) { - // printf("***** found macro reference `%s'\n", tok().identifier->chars()); - } - unsigned qt_invokable_token = 0; if (acceptStructDeclarator && (LA() == T_Q_SIGNAL || LA() == T_Q_SLOT)) qt_invokable_token = consumeToken(); diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 1bd6700f53..2f274e93ab 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -286,8 +286,6 @@ private: inline void rewind(unsigned cursor) { _tokenIndex = cursor; } - bool isMacro(unsigned tokenIndex) const; - private: TranslationUnit *_translationUnit; Control *_control; -- cgit v1.2.3