summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2021-06-04 10:31:36 +0200
committerDavid Schulz <david.schulz@qt.io>2021-06-08 04:42:27 +0000
commit4e69b5068a3a9c81e1c84d1dc8f14a0f93d23237 (patch)
tree7795d051ea50b8a1422a37bd7267ba0db082823c
parent64ce2a6f4374012b37b420dc0aaa6ea406bf7168 (diff)
downloadqt-creator-4e69b5068a3a9c81e1c84d1dc8f14a0f93d23237.tar.gz
LSP: Fix Range::overlaps
Change-Id: I14e6477b25a4c9a25c3832a4bc580728bb85c448 Reviewed-by: <sergeikrivonos@gmail.com> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/libs/languageserverprotocol/lsptypes.cpp2
-rw-r--r--tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp60
2 files changed, 61 insertions, 1 deletions
diff --git a/src/libs/languageserverprotocol/lsptypes.cpp b/src/libs/languageserverprotocol/lsptypes.cpp
index bae7f157f1..b15e59f9bd 100644
--- a/src/libs/languageserverprotocol/lsptypes.cpp
+++ b/src/libs/languageserverprotocol/lsptypes.cpp
@@ -323,7 +323,7 @@ bool Range::contains(const Range &other) const
bool Range::overlaps(const Range &range) const
{
- return contains(range.start()) || contains(range.end());
+ return end() > range.start() && start() < range.end();
}
bool DocumentFilter::applies(const Utils::FilePath &fileName, const Utils::MimeType &mimeType) const
diff --git a/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp b/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp
index c5d7ffbd11..57fa10c83e 100644
--- a/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp
+++ b/tests/auto/languageserverprotocol/tst_languageserverprotocol.cpp
@@ -38,6 +38,7 @@ Q_DECLARE_METATYPE(QTextCodec *)
Q_DECLARE_METATYPE(BaseMessage)
Q_DECLARE_METATYPE(JsonRpcMessage)
Q_DECLARE_METATYPE(DocumentUri)
+Q_DECLARE_METATYPE(Range)
class tst_LanguageServerProtocol : public QObject
{
@@ -63,6 +64,9 @@ private slots:
void documentUri_data();
void documentUri();
+ void range_data();
+ void range();
+
private:
QByteArray defaultMimeType;
QTextCodec *defaultCodec = nullptr;
@@ -537,6 +541,62 @@ void tst_LanguageServerProtocol::documentUri()
QCOMPARE(uri.toString(), string);
}
+void tst_LanguageServerProtocol::range_data()
+{
+ QTest::addColumn<Range>("r1");
+ QTest::addColumn<Range>("r2");
+ QTest::addColumn<bool>("overlaps");
+ QTest::addColumn<bool>("r1Containsr2");
+ QTest::addColumn<bool>("r2Containsr1");
+
+ auto pos = [](int pos) { return Position(0, pos); };
+
+ QTest::newRow("both ranges empty")
+ << Range(pos(0), pos(0)) << Range(pos(0), pos(0)) << false << true << true;
+ QTest::newRow("equal ranges")
+ << Range(pos(0), pos(1)) << Range(pos(0), pos(1)) << true << true << true;
+ QTest::newRow("r1 before r2")
+ << Range(pos(0), pos(1)) << Range(pos(2), pos(3)) << false << false << false;
+ QTest::newRow("r1 adjacent before r2")
+ << Range(pos(0), pos(1)) << Range(pos(1), pos(2)) << false << false << false;
+ QTest::newRow("r1 starts before r2 overlapping")
+ << Range(pos(0), pos(2)) << Range(pos(1), pos(3)) << true << false << false;
+ QTest::newRow("empty r1 on r2 start")
+ << Range(pos(0), pos(0)) << Range(pos(0), pos(1)) << false << false << true;
+ QTest::newRow("r1 inside r2 equal start")
+ << Range(pos(0), pos(1)) << Range(pos(0), pos(2)) << true << false << true;
+ QTest::newRow("r1 inside r2 equal start")
+ << Range(pos(0), pos(1)) << Range(pos(0), pos(2)) << true << false << true;
+ QTest::newRow("empty r1 inside r2")
+ << Range(pos(1), pos(1)) << Range(pos(0), pos(2)) << true << false << true;
+ QTest::newRow("r1 completely inside r2")
+ << Range(pos(1), pos(2)) << Range(pos(0), pos(3)) << true << false << true;
+ QTest::newRow("r1 inside r2 equal end")
+ << Range(pos(1), pos(2)) << Range(pos(0), pos(2)) << true << false << true;
+ QTest::newRow("r1 ends after r2 overlapping")
+ << Range(pos(1), pos(3)) << Range(pos(0), pos(2)) << true << false << false;
+ QTest::newRow("empty r1 on r2 end")
+ << Range(pos(1), pos(1)) << Range(pos(0), pos(1)) << false << false << true;
+ QTest::newRow("r1 adjacent after r2")
+ << Range(pos(1), pos(2)) << Range(pos(0), pos(1)) << false << false << false;
+ QTest::newRow("r1 behind r2")
+ << Range(pos(2), pos(3)) << Range(pos(0), pos(1)) << false << false << false;
+}
+
+void tst_LanguageServerProtocol::range()
+{
+ QFETCH(Range, r1);
+ QFETCH(Range, r2);
+ QFETCH(bool, overlaps);
+ QFETCH(bool, r1Containsr2);
+ QFETCH(bool, r2Containsr1);
+
+ QVERIFY(r1.overlaps(r2) == r2.overlaps(r1));
+ QCOMPARE(r1.overlaps(r2), overlaps);
+ QCOMPARE(r1.contains(r2), r1Containsr2);
+ QCOMPARE(r2.contains(r1), r2Containsr1);
+}
+
QTEST_MAIN(tst_LanguageServerProtocol)
#include "tst_languageserverprotocol.moc"