diff options
-rw-r--r-- | src/lib/corelib/loader/itemreader.cpp | 4 | ||||
-rw-r--r-- | src/lib/corelib/loader/itemreader.h | 14 | ||||
-rw-r--r-- | src/lib/corelib/loader/itemreaderastvisitor.cpp | 6 | ||||
-rw-r--r-- | src/lib/corelib/loader/itemreadervisitorstate.cpp | 20 | ||||
-rw-r--r-- | src/lib/corelib/loader/itemreadervisitorstate.h | 17 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/lsp/MyProduct.qbs | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/lsp/lsp.qbs | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 3 |
8 files changed, 42 insertions, 25 deletions
diff --git a/src/lib/corelib/loader/itemreader.cpp b/src/lib/corelib/loader/itemreader.cpp index 0638d1af5..bccd14fe9 100644 --- a/src/lib/corelib/loader/itemreader.cpp +++ b/src/lib/corelib/loader/itemreader.cpp @@ -73,9 +73,7 @@ ItemReader::ItemReader(LoaderState &loaderState) : m_loaderState(loaderState) {} void ItemReader::init() { - m_visitorState = std::make_unique<ItemReaderVisitorState>( - m_loaderState.topLevelProject().itemReaderCache(), m_loaderState.logger()); - m_visitorState->setDeprecationWarningMode(m_loaderState.parameters().deprecationWarningMode()); + m_visitorState = std::make_unique<ItemReaderVisitorState>(m_loaderState); m_projectFilePath = m_loaderState.parameters().projectFilePath(); setSearchPaths(m_loaderState.parameters().searchPaths()); m_elapsedTime = m_loaderState.parameters().logElapsedTime() ? 0 : -1; diff --git a/src/lib/corelib/loader/itemreader.h b/src/lib/corelib/loader/itemreader.h index e444db16c..0fdb57bbe 100644 --- a/src/lib/corelib/loader/itemreader.h +++ b/src/lib/corelib/loader/itemreader.h @@ -40,22 +40,17 @@ #ifndef QBS_ITEMREADER_H #define QBS_ITEMREADER_H -#include <logging/logger.h> -#include <tools/deprecationwarningmode.h> -#include <tools/set.h> +#include <tools/codelocation.h> #include <QtCore/qstringlist.h> #include <memory> -namespace qbs { -class SetupProjectParameters; -namespace Internal { -class Evaluator; +namespace qbs::Internal { class Item; -class ItemPool; class ItemReaderVisitorState; class LoaderState; +class Logger; /* * Reads a qbs file and creates a tree of Item objects. @@ -115,7 +110,6 @@ private: size_t m_oldSize{0}; }; -} // namespace Internal -} // namespace qbs +} // namespace qbs::Internal #endif // QBS_ITEMREADER_H diff --git a/src/lib/corelib/loader/itemreaderastvisitor.cpp b/src/lib/corelib/loader/itemreaderastvisitor.cpp index be73b9727..9a6beeea5 100644 --- a/src/lib/corelib/loader/itemreaderastvisitor.cpp +++ b/src/lib/corelib/loader/itemreaderastvisitor.cpp @@ -126,6 +126,12 @@ bool ItemReaderASTVisitor::visit(AST::UiObjectDefinition *ast) m_visitorState.setMostDerivingItem(nullptr); QBS_CHECK(baseItem->type() <= ItemType::LastActualItem); itemType = baseItem->type(); + const AST::SourceLocation startLoc = ast->qualifiedTypeNameId->firstSourceLocation(); + const AST::SourceLocation endLoc = ast->qualifiedTypeNameId->lastSourceLocation(); + const CodeRange sourceRange( + CodePosition(startLoc.startLine, startLoc.startColumn), + CodePosition(endLoc.startLine, endLoc.startColumn + endLoc.length)); + m_visitorState.addCodeLink(m_file->filePath(), sourceRange, baseItem->location()); } else { if (fullTypeName.size() > 1) { throw ErrorInfo(Tr::tr("Invalid item '%1'. Did you mean to set a module property?") diff --git a/src/lib/corelib/loader/itemreadervisitorstate.cpp b/src/lib/corelib/loader/itemreadervisitorstate.cpp index 6ea23c021..c9193e74b 100644 --- a/src/lib/corelib/loader/itemreadervisitorstate.cpp +++ b/src/lib/corelib/loader/itemreadervisitorstate.cpp @@ -48,6 +48,7 @@ #include <parser/qmljslexer_p.h> #include <parser/qmljsparser_p.h> #include <tools/error.h> +#include <tools/setupprojectparameters.h> #include <tools/stringconstants.h> #include <QtCore/qdiriterator.h> @@ -58,10 +59,11 @@ namespace qbs { namespace Internal { -ItemReaderVisitorState::ItemReaderVisitorState(ItemReaderCache &cache, Logger &logger) - : m_cache(cache), m_logger(logger) -{ -} +ItemReaderVisitorState::ItemReaderVisitorState(LoaderState &loaderState) + : m_loaderState(loaderState) + , m_cache(loaderState.topLevelProject().itemReaderCache()) + , m_logger(m_loaderState.logger()) +{} Item *ItemReaderVisitorState::readFile(const QString &filePath, const QStringList &searchPaths, ItemPool *itemPool) @@ -144,6 +146,16 @@ void ItemReaderVisitorState::setMostDerivingItem(Item *item) m_mostDerivingItem = item; } +DeprecationWarningMode ItemReaderVisitorState::deprecationWarningMode() const +{ + return m_loaderState.parameters().deprecationWarningMode(); +} + +void ItemReaderVisitorState::addCodeLink( + const QString &sourceFile, const CodeRange &sourceRange, const CodeLocation &targetLoc) +{ + m_loaderState.topLevelProject().addCodeLink(sourceFile, sourceRange, targetLoc); +} } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/loader/itemreadervisitorstate.h b/src/lib/corelib/loader/itemreadervisitorstate.h index cbf1966b6..fa2b7094b 100644 --- a/src/lib/corelib/loader/itemreadervisitorstate.h +++ b/src/lib/corelib/loader/itemreadervisitorstate.h @@ -39,26 +39,25 @@ #ifndef QBS_ITEMREADERVISITORSTATE_H #define QBS_ITEMREADERVISITORSTATE_H +#include <tools/codelocation.h> #include <tools/deprecationwarningmode.h> -#include <tools/set.h> #include <QtCore/qstringlist.h> -#include <memory> - namespace qbs { namespace Internal { class Item; class ItemPool; class ItemReaderCache; +class LoaderState; class Logger; class ItemReaderVisitorState { public: - ItemReaderVisitorState(ItemReaderCache &cache, Logger &logger); + ItemReaderVisitorState(LoaderState &loaderState); - Logger &logger() { return m_logger; } + Logger &logger() const { return m_logger; } Item *readFile(const QString &filePath, const QStringList &searchPaths, ItemPool *itemPool); @@ -67,11 +66,13 @@ public: Item *mostDerivingItem() const; void setMostDerivingItem(Item *item); - void setDeprecationWarningMode(DeprecationWarningMode mode) { m_deprecationWarningMode = mode; } - DeprecationWarningMode deprecationWarningMode() const { return m_deprecationWarningMode; } + DeprecationWarningMode deprecationWarningMode() const; + + void addCodeLink( + const QString &sourceFile, const CodeRange &sourceRange, const CodeLocation &targetLoc); private: - DeprecationWarningMode m_deprecationWarningMode = defaultDeprecationWarningMode(); + LoaderState &m_loaderState; ItemReaderCache &m_cache; Logger &m_logger; Item *m_mostDerivingItem = nullptr; diff --git a/tests/auto/blackbox/testdata/lsp/MyProduct.qbs b/tests/auto/blackbox/testdata/lsp/MyProduct.qbs new file mode 100644 index 000000000..9c7681bc3 --- /dev/null +++ b/tests/auto/blackbox/testdata/lsp/MyProduct.qbs @@ -0,0 +1,2 @@ +// This is a simple forwarder ... +/* ... that we are indenting to test non-zero line and column numbers */ Product {} diff --git a/tests/auto/blackbox/testdata/lsp/lsp.qbs b/tests/auto/blackbox/testdata/lsp/lsp.qbs index 791a9928c..fa697e489 100644 --- a/tests/auto/blackbox/testdata/lsp/lsp.qbs +++ b/tests/auto/blackbox/testdata/lsp/lsp.qbs @@ -14,4 +14,5 @@ Project { } } references: "other.qbs" + MyProduct { name: "dummy" } } diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index e781a6ae4..2ecfe25aa 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -7014,6 +7014,9 @@ void TestBlackbox::qbsLanguageServer_data() QTest::addRow("follow \"references\"") << "--goto-def" << (testDataDir + "/lsp/lsp.qbs:16:24") << QString() << QString() << (testDataDir + "/lsp/other.qbs:1:1"); + QTest::addRow("follow item from import path") + << "--goto-def" << (testDataDir + "/lsp/lsp.qbs:17:7") << QString() << QString() + << (testDataDir + "/lsp/MyProduct.qbs:2:74"); QTest::addRow("completion: LHS, module prefix") << "--completion" << (testDataDir + "/lsp/lsp.qbs:7:1") << QString() << QString("P") << QString("Prefix.m1\nPrefix.m2\nPrefix.m3"); |