diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 3a280416d9b881631dac42e8486f7a9834a1ec0d..45ad1f569a5f6d1f3a190fdb76d4ce19a78accfe 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -138,19 +138,9 @@ void Document::addIncludeFile(const QString &fileName) _includedFiles.append(fileName); } -QByteArray Document::definedMacros() const +void Document::appendMacro(const Macro ¯o) { - return _definedMacros; -} - -void Document::appendMacro(const QByteArray ¯oName, const QByteArray &text) -{ - int index = macroName.indexOf('('); - if (index == -1) - _macroNames.insert(macroName); - else - _macroNames.insert(macroName.left(index)); - _definedMacros += text; + _definedMacros.append(macro); } void Document::addMacroUse(unsigned offset, unsigned length) @@ -251,11 +241,6 @@ void Document::stopSkippingBlocks(unsigned stop) _skippedBlocks.back() = Block(start, stop); } -QSet<QByteArray> Document::macroNames() const -{ - return _macroNames; -} - bool Document::parse(ParseMode mode) { TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit; diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index e952913a07b7d75e37648b7af0117e180845f4cb..d289c579e9c6fddc2d4c0a0fbd31247c47a77e01 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -36,6 +36,8 @@ #include <CPlusPlusForwardDeclarations.h> +#include "pp-macro.h" + #include <QByteArray> #include <QList> #include <QSet> @@ -45,6 +47,8 @@ namespace CPlusPlus { +class Macro; + class CPLUSPLUS_EXPORT Document { Document(const Document &other); @@ -63,10 +67,7 @@ public: QStringList includedFiles() const; void addIncludeFile(const QString &fileName); - QByteArray definedMacros() const; - QSet<QByteArray> macroNames() const; - - void appendMacro(const QByteArray ¯oName, const QByteArray &text); + void appendMacro(const Macro ¯o); void addMacroUse(unsigned offset, unsigned length); @@ -81,6 +82,9 @@ public: Scope *globalSymbols() const; // ### deprecate? Namespace *globalNamespace() const; + QList<Macro> definedMacros() const + { return _definedMacros; } + Symbol *findSymbolAt(unsigned line, unsigned column) const; void setSource(const QByteArray &source); @@ -191,8 +195,7 @@ private: TranslationUnit *_translationUnit; Namespace *_globalNamespace; QList<DiagnosticMessage> _diagnosticMessages; - QByteArray _definedMacros; - QSet<QByteArray> _macroNames; + QList<Macro> _definedMacros; QList<Block> _skippedBlocks; QList<Block> _macroUses; }; diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp index 7dd669365fc3ec8bf3be89b6cf5e7c8ca8210759..487c9f8a46969d1c28b2b6c1fe84cb2020f7ce7c 100644 --- a/src/libs/cplusplus/TypeOfExpression.cpp +++ b/src/libs/cplusplus/TypeOfExpression.cpp @@ -48,6 +48,7 @@ TypeOfExpression::TypeOfExpression(): void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents) { m_documents = documents; + m_lookupContext = LookupContext(); } QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression, diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h index ecdfac7b2907c1ea7563ed1ee3d54d36b95856de..cd7a23441fde133111e5f987951d0bcbb2bc51e2 100644 --- a/src/libs/cplusplus/TypeOfExpression.h +++ b/src/libs/cplusplus/TypeOfExpression.h @@ -54,6 +54,9 @@ public: /** * Sets the documents used to evaluate expressions. Should be set before * calling this functor. + * + * Also clears the lookup context, so can be used to make sure references + * to the documents previously used are removed. */ void setDocuments(const QMap<QString, Document::Ptr> &documents); diff --git a/src/libs/cplusplus/cplusplus.pro b/src/libs/cplusplus/cplusplus.pro index 1a2b5326623927b3854057c33d3874e51fff012b..49d78fda8b36d4def16fdfab74c3158cace20339 100644 --- a/src/libs/cplusplus/cplusplus.pro +++ b/src/libs/cplusplus/cplusplus.pro @@ -21,7 +21,16 @@ HEADERS += \ TypeOfExpression.h \ TypePrettyPrinter.h \ ResolveExpression.h \ - LookupContext.h + LookupContext.h \ + pp-cctype.h \ + pp-engine.h \ + pp-fwd.h \ + pp-macro-expander.h \ + pp-scanner.h \ + pp-client.h \ + pp-environment.h \ + pp-internal.h \ + pp-macro.h SOURCES += \ SimpleLexer.cpp \ @@ -35,6 +44,9 @@ SOURCES += \ TypeOfExpression.cpp \ TypePrettyPrinter.cpp \ ResolveExpression.cpp \ - LookupContext.cpp + LookupContext.cpp \ + pp-engine.cpp \ + pp-environment.cpp \ + pp-macro-expander.cpp RESOURCES += cplusplus.qrc diff --git a/src/plugins/cpptools/rpp/pp-cctype.h b/src/libs/cplusplus/pp-cctype.h similarity index 89% rename from src/plugins/cpptools/rpp/pp-cctype.h rename to src/libs/cplusplus/pp-cctype.h index 62b44f0bf4c4bae72080f836c0074a7e4fe56620..b7558ae5050a1a717b2dc3d1fe72b9b8c92a59dd 100644 --- a/src/plugins/cpptools/rpp/pp-cctype.h +++ b/src/libs/cplusplus/pp-cctype.h @@ -53,22 +53,24 @@ #ifndef PP_CCTYPE_H #define PP_CCTYPE_H +#include <CPlusPlusForwardDeclarations.h> + #include <cctype> -namespace rpp { +namespace CPlusPlus { -inline bool pp_isalpha (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isalpha (int __ch) { return std::isalpha ((unsigned char) __ch) != 0; } -inline bool pp_isalnum (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isalnum (int __ch) { return std::isalnum ((unsigned char) __ch) != 0; } -inline bool pp_isdigit (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isdigit (int __ch) { return std::isdigit ((unsigned char) __ch) != 0; } -inline bool pp_isspace (int __ch) +inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch) { return std::isspace ((unsigned char) __ch) != 0; } -} // namespace rpp +} // namespace CPlusPlus #endif // PP_CCTYPE_H diff --git a/src/plugins/cpptools/rpp/pp-client.h b/src/libs/cplusplus/pp-client.h similarity index 92% rename from src/plugins/cpptools/rpp/pp-client.h rename to src/libs/cplusplus/pp-client.h index 974004a6ce50ec85aeb2df035d63c686df19b444..2fc781f22f559a60cea8595cc7ab1c3690649b55 100644 --- a/src/plugins/cpptools/rpp/pp-client.h +++ b/src/libs/cplusplus/pp-client.h @@ -34,15 +34,17 @@ #ifndef PP_CLIENT_H #define PP_CLIENT_H +#include <CPlusPlusForwardDeclarations.h> + #include <QByteArray> #include <QString> #include <QFile> -namespace rpp { +namespace CPlusPlus { class Macro; -class Client +class CPLUSPLUS_EXPORT Client { Client(const Client &other); void operator=(const Client &other); @@ -60,7 +62,7 @@ public: virtual ~Client() { } - virtual void macroAdded(const QByteArray ¯oId, const QByteArray &text) = 0; + virtual void macroAdded(const Macro ¯o) = 0; virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature. virtual void startExpandingMacro(unsigned offset, @@ -74,6 +76,6 @@ public: virtual void stopSkippingBlocks(unsigned offset) = 0; }; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_CLIENT_H diff --git a/src/plugins/cpptools/rpp/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp similarity index 98% rename from src/plugins/cpptools/rpp/pp-engine.cpp rename to src/libs/cplusplus/pp-engine.cpp index 66e8957f355e5dc28c25c755b4d86e83d49f5a04..7bdc9b95d69106790cc8650b7abe7c4c632a426b 100644 --- a/src/plugins/cpptools/rpp/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -57,7 +57,6 @@ #include <QtDebug> #include <algorithm> -using namespace rpp; using namespace CPlusPlus; namespace { @@ -907,16 +906,8 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken) env.bind(macro); - QByteArray macroText; - macroText.reserve(64); - macroText += "#define "; - - macroText += macroId; - macroText += ' '; - macroText += macro.definition; - macroText += '\n'; - - client->macroAdded(macroId, macroText); + if (client) + client->macroAdded(macro); } void pp::processIf(TokenIterator firstToken, TokenIterator lastToken) @@ -1020,13 +1011,10 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken) if (tk->is(T_IDENTIFIER)) { const QByteArray macroName = tokenText(*tk); - env.remove(macroName); + const Macro *macro = env.remove(macroName); - QByteArray macroText; - macroText += "#undef "; - macroText += macroName; - macroText += '\n'; - client->macroAdded(macroName, macroText); + if (client && macro) + client->macroAdded(*macro); } } diff --git a/src/plugins/cpptools/rpp/pp-engine.h b/src/libs/cplusplus/pp-engine.h similarity index 98% rename from src/plugins/cpptools/rpp/pp-engine.h rename to src/libs/cplusplus/pp-engine.h index 13135f6a3102f45fab3fdbb5901c83fb1d75afc0..c909ffab3a72f7b26abf454c3f5c1b09f03af24c 100644 --- a/src/plugins/cpptools/rpp/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -62,7 +62,7 @@ namespace CPlusPlus { class Token; } -namespace rpp { +namespace CPlusPlus { struct Value { @@ -134,7 +134,7 @@ namespace rpp { #undef PP_DEFINE_BIN_OP }; - class pp + class CPLUSPLUS_EXPORT pp { Client *client; Environment &env; @@ -200,7 +200,7 @@ namespace rpp { Value evalExpression(TokenIterator firstToken, TokenIterator lastToken, - const QByteArray &source) const; + const QByteArray &source) const; QVector<CPlusPlus::Token> tokenize(const QByteArray &text) const; @@ -226,6 +226,6 @@ namespace rpp { bool isQtReservedWord(const QByteArray &name) const; }; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_ENGINE_H diff --git a/src/plugins/cpptools/rpp/pp-environment.cpp b/src/libs/cplusplus/pp-environment.cpp similarity index 98% rename from src/plugins/cpptools/rpp/pp-environment.cpp rename to src/libs/cplusplus/pp-environment.cpp index 85e432ae5b5ae49c70557cfd835b7db4eddc60d5..a1ade3b189a6b7a6e639aa0716ae5330c0f46bc9 100644 --- a/src/plugins/cpptools/rpp/pp-environment.cpp +++ b/src/libs/cplusplus/pp-environment.cpp @@ -54,7 +54,7 @@ #include "pp.h" #include <cstring> -using namespace rpp; +using namespace CPlusPlus; Environment::Environment () : currentLine(0), @@ -115,12 +115,12 @@ Macro *Environment::bind(const Macro &__macro) return m; } -void Environment::remove (const QByteArray &name) +Macro *Environment::remove (const QByteArray &name) { Macro macro; macro.name = name; macro.hidden = true; - bind(macro); + return bind(macro); } bool Environment::isBuiltinMacro(const QByteArray &s) const diff --git a/src/plugins/cpptools/rpp/pp-environment.h b/src/libs/cplusplus/pp-environment.h similarity index 94% rename from src/plugins/cpptools/rpp/pp-environment.h rename to src/libs/cplusplus/pp-environment.h index 5b97c492d799a07d79e20adbef1f74d937e63b73..e2a75d29b819f4990b649ac428e8bd928e30c83f 100644 --- a/src/plugins/cpptools/rpp/pp-environment.h +++ b/src/libs/cplusplus/pp-environment.h @@ -53,14 +53,16 @@ #ifndef PP_ENVIRONMENT_H #define PP_ENVIRONMENT_H +#include "CPlusPlusForwardDeclarations.h" + #include <QVector> #include <QByteArray> -namespace rpp { +namespace CPlusPlus { -struct Macro; +class Macro; -class Environment +class CPLUSPLUS_EXPORT Environment { public: Environment(); @@ -70,7 +72,7 @@ public: Macro *macroAt(unsigned index) const; Macro *bind(const Macro ¯o); - void remove(const QByteArray &name); + Macro *remove(const QByteArray &name); Macro *resolve(const QByteArray &name) const; bool isBuiltinMacro(const QByteArray &name) const; @@ -104,6 +106,6 @@ private: int _hash_count; }; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_ENVIRONMENT_H diff --git a/src/plugins/cpptools/rpp/pp-fwd.h b/src/libs/cplusplus/pp-fwd.h similarity index 100% rename from src/plugins/cpptools/rpp/pp-fwd.h rename to src/libs/cplusplus/pp-fwd.h diff --git a/src/plugins/cpptools/rpp/pp-internal.h b/src/libs/cplusplus/pp-internal.h similarity index 98% rename from src/plugins/cpptools/rpp/pp-internal.h rename to src/libs/cplusplus/pp-internal.h index 13bc7c17e84499f304976e46d94a7730605233b4..c11de37453a24fa960a123ecff8c749f76dfb43d 100644 --- a/src/plugins/cpptools/rpp/pp-internal.h +++ b/src/libs/cplusplus/pp-internal.h @@ -55,7 +55,7 @@ #include <QByteArray> -namespace rpp { +namespace CPlusPlus { namespace _PP_internal { inline bool comment_p (const char *__first, const char *__last) @@ -73,6 +73,6 @@ inline bool comment_p (const char *__first, const char *__last) } } // _PP_internal -} // namespace rpp +} // namespace CPlusPlus #endif // PP_INTERNAL_H diff --git a/src/plugins/cpptools/rpp/pp-macro-expander.cpp b/src/libs/cplusplus/pp-macro-expander.cpp similarity index 99% rename from src/plugins/cpptools/rpp/pp-macro-expander.cpp rename to src/libs/cplusplus/pp-macro-expander.cpp index 6b569eb132feea2bbde069809ca9e293666be378..9ae9702fe18fa21dcd240b0f6c4d59ee21fbf5aa 100644 --- a/src/plugins/cpptools/rpp/pp-macro-expander.cpp +++ b/src/libs/cplusplus/pp-macro-expander.cpp @@ -35,7 +35,7 @@ #include "pp-macro-expander.h" #include <QDateTime> -using namespace rpp; +using namespace CPlusPlus; MacroExpander::MacroExpander (Environment &env, pp_frame *frame) : env(env), frame(frame), diff --git a/src/plugins/cpptools/rpp/pp-macro-expander.h b/src/libs/cplusplus/pp-macro-expander.h similarity index 98% rename from src/plugins/cpptools/rpp/pp-macro-expander.h rename to src/libs/cplusplus/pp-macro-expander.h index dd11540c33629ac3c391112188d7445a821b6288..c2f636c1385fba0606f17b73dad40c0549f61448 100644 --- a/src/plugins/cpptools/rpp/pp-macro-expander.h +++ b/src/libs/cplusplus/pp-macro-expander.h @@ -53,7 +53,7 @@ #ifndef PP_MACRO_EXPANDER_H #define PP_MACRO_EXPANDER_H -namespace rpp { +namespace CPlusPlus { struct pp_frame { @@ -97,7 +97,7 @@ namespace rpp { int generated_lines; }; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_MACRO_EXPANDER_H diff --git a/src/plugins/cpptools/rpp/pp-macro.h b/src/libs/cplusplus/pp-macro.h similarity index 82% rename from src/plugins/cpptools/rpp/pp-macro.h rename to src/libs/cplusplus/pp-macro.h index a7bbe35e1d5995488ea78a0f9d86c0740271d040..494b7a4de7ff7df6a7567a88dd5367208848f921 100644 --- a/src/plugins/cpptools/rpp/pp-macro.h +++ b/src/libs/cplusplus/pp-macro.h @@ -53,43 +53,44 @@ #ifndef PP_MACRO_H #define PP_MACRO_H +#include <CPlusPlusForwardDeclarations.h> + #include <QByteArray> #include <QVector> -namespace rpp { +namespace CPlusPlus { + +class CPLUSPLUS_EXPORT Macro +{ +public: + QByteArray name; + QByteArray definition; + QVector<QByteArray> formals; + QByteArray fileName; + int line; + Macro *next; + unsigned hashcode; - struct Macro + union { - QByteArray name; - QByteArray definition; - QVector<QByteArray> formals; - QByteArray fileName; - int line; - int lines; - Macro *next; - unsigned hashcode; + unsigned state; - union + struct { - unsigned state; - - struct - { - unsigned hidden: 1; - unsigned function_like: 1; - unsigned variadics: 1; - }; + unsigned hidden: 1; + unsigned function_like: 1; + unsigned variadics: 1; }; + }; - inline Macro(): + inline Macro(): line(0), - lines(0), next(0), hashcode(0), state(0) - { } - }; + { } +}; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_MACRO_H diff --git a/src/plugins/cpptools/rpp/pp-scanner.h b/src/libs/cplusplus/pp-scanner.h similarity index 99% rename from src/plugins/cpptools/rpp/pp-scanner.h rename to src/libs/cplusplus/pp-scanner.h index 53fea70b52fd7fbaf4dd5219e0d610ec1ed0ffec..85b65403b0bdf750252d877029bc56ffce51bf7e 100644 --- a/src/plugins/cpptools/rpp/pp-scanner.h +++ b/src/libs/cplusplus/pp-scanner.h @@ -53,7 +53,7 @@ #ifndef PP_SCANNER_H #define PP_SCANNER_H -namespace rpp { +namespace CPlusPlus { struct pp_skip_blanks { @@ -373,7 +373,7 @@ struct pp_skip_argument } }; -} // namespace rpp +} // namespace CPlusPlus #endif // PP_SCANNER_H diff --git a/src/plugins/cpptools/rpp/pp.h b/src/libs/cplusplus/pp.h similarity index 100% rename from src/plugins/cpptools/rpp/pp.h rename to src/libs/cplusplus/pp.h diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 9c6c3947fa3768a28e9bd41d1e334317630f3fc0..5569c900f2b49dbbe8c269f49a888c4d3f6e4f12 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -34,6 +34,8 @@ #include "cmakeproject.h" #include "cmakeprojectconstants.h" #include "cmakeprojectnodes.h" +#include "cmakestep.h" +#include "makestep.h" #include <extensionsystem/pluginmanager.h> #include <cpptools/cppmodelmanagerinterface.h> @@ -188,7 +190,7 @@ QString CMakeProject::buildDirectory(const QString &buildConfiguration) const { Q_UNUSED(buildConfiguration) //TODO - return ""; + return QFileInfo(m_fileName).absolutePath(); } ProjectExplorer::BuildStepConfigWidget *CMakeProject::createConfigWidget() @@ -225,13 +227,29 @@ QStringList CMakeProject::files(FilesMode fileMode) const void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) { // TODO - Q_UNUSED(writer) + Q_UNUSED(writer); } void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) { // TODO - Q_UNUSED(reader) + Q_UNUSED(reader); + if (buildConfigurations().isEmpty()) { + // No build configuration, adding those + + // TODO do we want to create one build configuration per target? + // or how do we want to handle that? + + CMakeStep *cmakeStep = new CMakeStep(this); + MakeStep *makeStep = new MakeStep(this); + + insertBuildStep(0, cmakeStep); + insertBuildStep(1, makeStep); + + addBuildConfiguration("all"); + setActiveBuildConfiguration("all"); + } + // Restoring is fine } @@ -376,12 +394,36 @@ void CMakeCbpParser::parseBuild() void CMakeCbpParser::parseTarget() { + m_targetOutput.clear(); + m_targetType = false; while(!atEnd()) { readNext(); if (isEndElement()) { + if (m_targetType && !m_targetOutput.isEmpty()) { + qDebug()<<"found target "<<m_targetOutput; + m_targets.insert(m_targetOutput); + } return; } else if (name() == "Compiler") { parseCompiler(); + } else if (name() == "Option") { + parseTargetOption(); + } else if (isStartElement()) { + parseUnknownElement(); + } + } +} + +void CMakeCbpParser::parseTargetOption() +{ + if (attributes().hasAttribute("output")) + m_targetOutput = attributes().value("output").toString(); + else if (attributes().hasAttribute("type") && attributes().value("type") == "1") + m_targetType = true; + while(!atEnd()) { + readNext(); + if (isEndElement()) { + return; } else if (isStartElement()) { parseUnknownElement(); } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index c765c0d38387cbf0e3ce6f9dc47273ae22fcc869..a0c821ada5ebbe5e61267fa3f41824fdbac9d119 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -123,13 +123,18 @@ private: void parseProject(); void parseBuild(); void parseTarget(); + void parseTargetOption(); void parseCompiler(); void parseAdd(); void parseUnit(); void parseUnknownElement(); + QSet<QString> m_targets; QList<ProjectExplorer::FileNode *> m_fileList; QStringList m_includeFiles; + + QString m_targetOutput; + bool m_targetType; }; class CMakeFile : public Core::IFile diff --git a/src/plugins/cmakeprojectmanager/cmakestep.cpp b/src/plugins/cmakeprojectmanager/cmakestep.cpp index 523741c92ba9e16d838f4747f3dbcf8e1096eed5..0c267ca2c4cea394333b0a6bf4b1bb6d59fbbf47 100644 --- a/src/plugins/cmakeprojectmanager/cmakestep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakestep.cpp @@ -54,7 +54,7 @@ bool CMakeStep::init(const QString &buildConfiguration) setEnabled(buildConfiguration, true); setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration)); setCommand(buildConfiguration, "cmake"); // TODO give full path here? - setArguments(buildConfiguration, QStringList()); // TODO + setArguments(buildConfiguration, QStringList() << "-GUnix Makefiles"); // TODO setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration)); return AbstractProcessStep::init(buildConfiguration); } diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 7568d2c8877f0d06f0037d4db93bfc2327efa14c..d24f5a5f81d167f82836eff5e1f0af9f5bd72ae4 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -699,7 +699,9 @@ void CppCodeCompletion::addMacros(const LookupContext &context) continue; processed.insert(fn); if (Document::Ptr doc = context.document(fn)) { - macroNames += doc->macroNames(); + foreach (const Macro macro, doc->definedMacros()) { + macroNames.insert(macro.name); + } todo += doc->includedFiles(); } } @@ -1025,6 +1027,10 @@ bool CppCodeCompletion::partiallyComplete(const QList<TextEditor::CompletionItem void CppCodeCompletion::cleanup() { m_completions.clear(); + + // Set empty map in order to avoid referencing old versions of the documents + // until the next completion + typeOfExpression.setDocuments(QMap<QString, Document::Ptr>()); } int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 6be28d36252ccab76a06d5ada2dc600a2fbaf341..e8359da2b5b988b254f5d69cdb393993588af1a2 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -31,7 +31,7 @@ ** ***************************************************************************/ -#include "pp.h" +#include <cplusplus/pp.h> #include "cppmodelmanager.h" #include "cpphoverhandler.h" @@ -107,7 +107,7 @@ static const char pp_configuration[] = namespace CppTools { namespace Internal { -class CppPreprocessor: public rpp::Client +class CppPreprocessor: public CPlusPlus::Client { public: CppPreprocessor(QPointer<CppModelManager> modelManager); @@ -129,12 +129,11 @@ protected: void mergeEnvironment(CPlusPlus::Document::Ptr doc); void mergeEnvironment(CPlusPlus::Document::Ptr doc, QSet<QString> *processed); - virtual void macroAdded(const QByteArray ¯oName, - const QByteArray ¯oText); + virtual void macroAdded(const Macro ¯o); virtual void startExpandingMacro(unsigned offset, - const rpp::Macro ¯o, + const Macro ¯o, const QByteArray &originalText); - virtual void stopExpandingMacro(unsigned offset, const rpp::Macro ¯o); + virtual void stopExpandingMacro(unsigned offset, const Macro ¯o); virtual void startSkippingBlocks(unsigned offset); virtual void stopSkippingBlocks(unsigned offset); virtual void sourceNeeded(QString &fileName, IncludeType type); @@ -142,8 +141,8 @@ protected: private: QPointer<CppModelManager> m_modelManager; CppModelManager::DocumentTable m_documents; - rpp::Environment env; - rpp::pp m_proc; + Environment env; + pp m_proc; QStringList m_includePaths; QStringList m_systemIncludePaths; QMap<QString, QByteArray> m_workingCopy; @@ -295,16 +294,16 @@ QByteArray CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type) return QByteArray(); } -void CppPreprocessor::macroAdded(const QByteArray ¯oName, const QByteArray ¯oText) +void CppPreprocessor::macroAdded(const Macro ¯o) { if (! m_currentDoc) return; - m_currentDoc->appendMacro(macroName, macroText); + m_currentDoc->appendMacro(macro); } void CppPreprocessor::startExpandingMacro(unsigned offset, - const rpp::Macro &, + const Macro &, const QByteArray &originalText) { if (! m_currentDoc) @@ -314,7 +313,7 @@ void CppPreprocessor::startExpandingMacro(unsigned offset, m_currentDoc->addMacroUse(offset, originalText.length()); } -void CppPreprocessor::stopExpandingMacro(unsigned, const rpp::Macro &) +void CppPreprocessor::stopExpandingMacro(unsigned, const Macro &) { if (! m_currentDoc) return; @@ -340,14 +339,13 @@ void CppPreprocessor::mergeEnvironment(Document::Ptr doc, QSet<QString> *process processed->insert(fn); - foreach (QString includedFile, doc->includedFiles()) + foreach (QString includedFile, doc->includedFiles()) { mergeEnvironment(m_documents.value(includedFile), processed); + } - const QByteArray macros = doc->definedMacros(); - QByteArray localFileName = doc->fileName().toUtf8(); - - QByteArray dummy; - m_proc(localFileName, macros, &dummy); + foreach (const Macro macro, doc->definedMacros()) { + env.bind(macro); + } } void CppPreprocessor::startSkippingBlocks(unsigned offset) diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index 8a096900ebf699ba9f0712eafb670660ebffb113..92905e42ef9af7659dd58358a3fd7c7d50694b3d 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -10,7 +10,7 @@ unix:QMAKE_CXXFLAGS_DEBUG += -O3 INCLUDEPATH += . DEFINES += CPPTOOLS_LIBRARY CONFIG += help -include(rpp/rpp.pri)|error("Can't find RPP") + HEADERS += cpptools_global.h \ cppquickopenfilter.h \ cppclassesfilter.h \ diff --git a/src/plugins/cpptools/rpp/rpp.pri b/src/plugins/cpptools/rpp/rpp.pri deleted file mode 100644 index a79b0028a056faf793ac0b38a4e4bb048a74b15d..0000000000000000000000000000000000000000 --- a/src/plugins/cpptools/rpp/rpp.pri +++ /dev/null @@ -1,18 +0,0 @@ -DEPENDPATH += $$PWD -INCLUDEPATH += $$PWD - -HEADERS += $$PWD/pp-cctype.h \ - $$PWD/pp-engine.h \ - $$PWD/pp-environment.h \ - $$PWD/pp-internal.h \ - $$PWD/pp-macro-expander.h \ - $$PWD/pp-macro.h \ - $$PWD/pp-scanner.h \ - $$PWD/pp.h \ - $$PWD/pp-client.h - -SOURCES += $$PWD/pp-engine.cpp \ - $$PWD/pp-environment.cpp \ - $$PWD/pp-macro-expander.cpp - - diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp index 670d0d6d471e892f9e70b3752899d8463ecf3a8b..308449ab581d84738b2c2aff50ae885a6166c78a 100644 --- a/src/plugins/cpptools/searchsymbols.cpp +++ b/src/plugins/cpptools/searchsymbols.cpp @@ -194,7 +194,7 @@ QString SearchSymbols::symbolName(const Symbol *symbol) const void SearchSymbols::appendItem(const QString &name, const QString &info, ModelItemInfo::ItemType type, - const CPlusPlus::Symbol *symbol) + const Symbol *symbol) { const QIcon icon = icons.iconForSymbol(symbol); items.append(ModelItemInfo(name, info, type, diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index b95d5c19463d46a20a554fa4381b49ef178bf661..f67984f0da8621d9d718d7abaeb23e9720f2e370 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -605,7 +605,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin } } - connect(m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(sessionManager())); + connect(m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(showSessionManager())); connect(m_newAction, SIGNAL(triggered()), this, SLOT(newProject())); #if 0 connect(m_loadAction, SIGNAL(triggered()), this, SLOT(loadAction())); @@ -765,10 +765,10 @@ void ProjectExplorerPlugin::newProject() updateActions(); } -void ProjectExplorerPlugin::sessionManager() +void ProjectExplorerPlugin::showSessionManager() { if (debug) - qDebug() << "ProjectExplorerPlugin::newSession"; + qDebug() << "ProjectExplorerPlugin::showSessionManager"; if (m_session->isDefaultVirgin()) { // do not save new virgin default sessions diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 6a7f4beb83119b92c5756cd744430a9c720b2b9c..97eb684bb4993faed9c2edf54a894b074778cd08 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -143,7 +143,7 @@ private slots: void unloadProject(); void clearSession(); void newProject(); - void sessionManager(); + void showSessionManager(); void populateBuildConfigurationMenu(); void buildConfigurationMenuTriggered(QAction *); void populateRunConfigurationMenu(); diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index 876b8294a377c0ca72f49d88e2823ca8309acd2c..71057473046d4abb52f43ad766f79762ead2681a 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -709,7 +709,7 @@ void SessionManager::editDependencies() dlg.exec(); } -QList<Project *> SessionManager::projects() const +const QList<Project *> &SessionManager::projects() const { return m_file->m_projects; } @@ -839,26 +839,26 @@ Project *SessionManager::projectForFile(const QString &fileName) const if (debug) qDebug() << "SessionManager::projectForFile(" << fileName << ")"; - Project *project = 0; + const QList<Project *> &projectList = projects(); - QList<Project *> projectList = projects(); + // Check current project first + Project *currentProject = ProjectExplorerPlugin::instance()->currentProject(); + if (currentProject && projectContainsFile(currentProject, fileName)) + return currentProject; - // Always check current project first - if (Project *currentProject = ProjectExplorerPlugin::instance()->currentProject()) { - projectList.removeOne(currentProject); - projectList.insert(0, currentProject); - } + foreach (Project *p, projectList) + if (p != currentProject && projectContainsFile(p, fileName)) + return p; - foreach (Project *p, projectList) { - if (!m_projectFileCache.contains(p)) { - m_projectFileCache.insert(p, p->files(Project::AllFiles)); - } - if (m_projectFileCache.value(p).contains(fileName)) { - project = p; - break; - } - } - return project; + return 0; +} + +bool SessionManager::projectContainsFile(Project *p, const QString &fileName) const +{ + if (!m_projectFileCache.contains(p)) + m_projectFileCache.insert(p, p->files(Project::AllFiles)); + + return m_projectFileCache.value(p).contains(fileName); } void SessionManager::setEditorCodec(Core::IEditor *editor, const QString &fileName) diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index fcf98a23ded2e6386535f181091efd19298e407c..d07316f07a459757782f9ce2bf5e173d0518becf 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -137,7 +137,7 @@ public: Core::IFile *file() const; Project *startupProject() const; - QList<Project *> projects() const; + const QList<Project *> &projects() const; bool isDefaultVirgin() const; bool isDefaultSession(const QString &session) const; @@ -182,6 +182,7 @@ private: bool loadImpl(const QString &fileName); bool createImpl(const QString &fileName); QString sessionNameToFileName(const QString &session); + bool projectContainsFile(Project *p, const QString &fileName) const; bool recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const; QStringList dependencies(const QString &proName) const; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index b67535212e755eea1f8704e5b059c4b8a66a53cb..b3950ab63b721581430b0f31d14712bd3a13cae5 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -474,6 +474,9 @@ void Qt4Project::updateCodeModel() } } + // Add mkspec directory + allIncludePaths.append(qtVersion(activeBuildConfiguration())->mkspecPath()); + QStringList files; files += m_projectFiles->files[HeaderType]; files += m_projectFiles->generatedFiles[HeaderType]; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 012e05b858ad0faaa6ba42eb20766121aa89c978..421aa3b77aeeb1c0163144cd632b972fda917bf7 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -728,6 +728,12 @@ QString QtVersion::mkspec() const return m_mkspec; } +QString QtVersion::mkspecPath() const +{ + updateMkSpec(); + return m_mkspecFullPath; +} + QHash<QString,QString> QtVersion::versionInfo() const { updateVersionInfo(); @@ -1023,25 +1029,25 @@ void QtVersion::updateMkSpec() const //qDebug()<<"Finding mkspec for"<<path(); QString mkspec; - QFile f(path() + "/.qmake.cache"); - if (f.exists() && f.open(QIODevice::ReadOnly)) { - while(!f.atEnd()) { - QByteArray line = f.readLine(); - if(line.startsWith("QMAKESPEC")) { - const QList<QByteArray> &temp = line.split('='); - if(temp.size() == 2) { - mkspec = temp.at(1).trimmed(); - if (mkspec.startsWith("$$QT_BUILD_TREE/mkspecs/")) - mkspec = mkspec.mid(QString("$$QT_BUILD_TREE/mkspecs/").length()); - else if (mkspec.startsWith("$$QT_BUILD_TREE\\mkspecs\\")) - mkspec = mkspec.mid(QString("$$QT_BUILD_TREE\\mkspecs\\").length()); - mkspec = QDir::fromNativeSeparators(mkspec); - } - break; - } - } - f.close(); - } else { +// QFile f(path() + "/.qmake.cache"); +// if (f.exists() && f.open(QIODevice::ReadOnly)) { +// while(!f.atEnd()) { +// QByteArray line = f.readLine(); +// if(line.startsWith("QMAKESPEC")) { +// const QList<QByteArray> &temp = line.split('='); +// if(temp.size() == 2) { +// mkspec = temp.at(1).trimmed(); +// if (mkspec.startsWith("$$QT_BUILD_TREE/mkspecs/")) +// mkspec = mkspec.mid(QString("$$QT_BUILD_TREE/mkspecs/").length()); +// else if (mkspec.startsWith("$$QT_BUILD_TREE\\mkspecs\\")) +// mkspec = mkspec.mid(QString("$$QT_BUILD_TREE\\mkspecs\\").length()); +// mkspec = QDir::fromNativeSeparators(mkspec); +// } +// break; +// } +// } +// f.close(); +// } else { // no .qmake.cache so look at the default mkspec QString mkspecPath = versionInfo().value("QMAKE_MKSPECS"); if (mkspecPath.isEmpty()) @@ -1096,8 +1102,9 @@ void QtVersion::updateMkSpec() const mkspec = f2.symLinkTarget(); } #endif - } +// } + m_mkspecFullPath = mkspec; int index = mkspec.lastIndexOf('/'); if(index == -1) index = mkspec.lastIndexOf('\\'); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 5810cfa1c2d81bfab5a17776b78336b4a77e457e..a8ca95708959d48710b91491fab86e39617c8880 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -67,6 +67,7 @@ public: QString path() const; QString sourcePath() const; QString mkspec() const; + QString mkspecPath() const; QString makeCommand() const; QString qmakeCommand() const; // Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information @@ -107,6 +108,7 @@ private: QString m_path; QString m_sourcePath; mutable QString m_mkspec; // updated lazily + mutable QString m_mkspecFullPath; QString m_mingwDirectory; QString m_prependPath; QString m_msvcVersion;