aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/loader/itemreader.cpp4
-rw-r--r--src/lib/corelib/loader/itemreader.h14
-rw-r--r--src/lib/corelib/loader/itemreaderastvisitor.cpp6
-rw-r--r--src/lib/corelib/loader/itemreadervisitorstate.cpp20
-rw-r--r--src/lib/corelib/loader/itemreadervisitorstate.h17
-rw-r--r--tests/auto/blackbox/testdata/lsp/MyProduct.qbs2
-rw-r--r--tests/auto/blackbox/testdata/lsp/lsp.qbs1
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp3
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");