diff --git a/autotests/syntaxrepository_test.cpp b/autotests/syntaxrepository_test.cpp --- a/autotests/syntaxrepository_test.cpp +++ b/autotests/syntaxrepository_test.cpp @@ -276,6 +276,7 @@ QVERIFY(def.indenter().isEmpty()); QVERIFY(def.author().isEmpty()); QVERIFY(def.license().isEmpty()); + QVERIFY(!def.foldingEnabled()); QVERIFY(!def.indentationBasedFoldingEnabled()); QVERIFY(def.foldingIgnoreList().isEmpty()); QVERIFY(def.keywordLists().isEmpty()); @@ -307,6 +308,39 @@ for (QChar c : QStringLiteral(",{}[]")) QVERIFY(def.isWordWrapDelimiter(c)); } + + void testFoldingEnabled() + { + // test invalid folding + Definition def; + QVERIFY(!def.isValid()); + QVERIFY(!def.foldingEnabled()); + QVERIFY(!def.indentationBasedFoldingEnabled()); + + // test no folding + def = m_repo.definitionForName(QLatin1String("ChangeLog")); + QVERIFY(def.isValid()); + QVERIFY(!def.foldingEnabled()); + QVERIFY(!def.indentationBasedFoldingEnabled()); + + // C++ (itself has no regions, since it includes ISOC++ + def = m_repo.definitionForName(QLatin1String("C++")); + QVERIFY(def.isValid()); + QVERIFY(def.foldingEnabled()); + QVERIFY(!def.indentationBasedFoldingEnabled()); + + // ISO C++ itself has folding regions + def = m_repo.definitionForName(QLatin1String("ISO C++")); + QVERIFY(def.isValid()); + QVERIFY(def.foldingEnabled()); + QVERIFY(!def.indentationBasedFoldingEnabled()); + + // Python has indentation based folding + def = m_repo.definitionForName(QLatin1String("Python")); + QVERIFY(def.isValid()); + QVERIFY(def.foldingEnabled()); + QVERIFY(def.indentationBasedFoldingEnabled()); + } }; } diff --git a/src/lib/definition.h b/src/lib/definition.h --- a/src/lib/definition.h +++ b/src/lib/definition.h @@ -220,6 +220,15 @@ */ bool isWordWrapDelimiter(QChar c) const; + /** + * Returns whether the highlighting supports code folding. + * Code folding is supported either if the highlighting defines code folding + * regions or if indentationBasedFoldingEnabled() returns @e true. + * @since 5.50 + * @see indentationBasedFoldingEnabled() + */ + bool foldingEnabled() const; + /** * Returns whether indentation-based folding is enabled. * An example for indentation-based folding is Python. diff --git a/src/lib/definition.cpp b/src/lib/definition.cpp --- a/src/lib/definition.cpp +++ b/src/lib/definition.cpp @@ -182,6 +182,21 @@ return std::binary_search(d->wordWrapDelimiters.constBegin(), d->wordWrapDelimiters.constEnd(), c); } +bool Definition::foldingEnabled() const +{ + d->load(); + if (d->hasFoldingRegions || indentationBasedFoldingEnabled()) { + return true; + } + + // check included definitions + for (const auto &def : includedDefinitions()) { + if (def.foldingEnabled()) + return true; + } + return false; +} + bool Definition::indentationBasedFoldingEnabled() const { d->load(); @@ -670,6 +685,7 @@ quint16 DefinitionData::foldingRegionId(const QString &foldName) { + hasFoldingRegions = true; return RepositoryPrivate::get(repo)->foldingRegionId(name, foldName); } diff --git a/src/lib/definition_p.h b/src/lib/definition_p.h --- a/src/lib/definition_p.h +++ b/src/lib/definition_p.h @@ -76,6 +76,7 @@ QHash formats; QString wordDelimiters; QString wordWrapDelimiters; + bool hasFoldingRegions = false; bool indentationBasedFolding = false; QStringList foldingIgnoreList; QString singleLineCommentMarker;