Skip to content

Commit ccf4de9

Browse files
committed
feat: introduce Qml to parser
add the Qml tree sitter language support to all places except test files.
1 parent 9c48991 commit ccf4de9

File tree

9 files changed

+43
-10
lines changed

9 files changed

+43
-10
lines changed

CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,14 @@ add_custom_command(
135135
${CMAKE_BINARY_DIR}/compile_commands.json compile_commands.json
136136
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/test_data/projects/cpp-project)
137137

138+
add_custom_command(
139+
OUTPUT
140+
${CMAKE_CURRENT_LIST_DIR}/test_data/projects/qml-project/compile_commands.json
141+
COMMENT "Creating compile_commands.json file for qml-project"
142+
COMMAND ${CMAKE_COMMAND} -E create_symlink
143+
${CMAKE_BINARY_DIR}/compile_commands.json compile_commands.json
144+
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/test_data/projects/qml-project)
145+
138146
# Post-initialization
139147
# ##############################################################################
140148
# Need to be done *after* compiling 3rd parties

src/core/codedocument_p.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ void TreeSitterHelper::clear()
3535
treesitter::Parser &TreeSitterHelper::parser()
3636
{
3737
if (!m_parser) {
38-
// TODO: Make language configurable
39-
m_parser = treesitter::Parser(tree_sitter_cpp());
38+
m_parser = treesitter::Parser(treesitter::Parser::getTSLanguageForDocumentType(m_document->type()));
4039
}
4140

4241
// Regarding const-ness:

src/core/qmldocument.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
*/
1010

1111
#include "qmldocument.h"
12+
#include "astnode.h"
1213

1314
namespace Core {
1415

1516
QmlDocument::QmlDocument(QObject *parent)
16-
: TextDocument(Type::Qml, parent)
17+
: CodeDocument(Type::Qml, parent)
1718
{
1819
}
1920

21+
QmlDocument::~QmlDocument() = default;
2022
}

src/core/qmldocument.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@
1010

1111
#pragma once
1212

13-
#include "textdocument.h"
13+
#include "codedocument.h"
1414

1515
namespace Core {
1616

17-
class QmlDocument : public TextDocument
17+
class QmlDocument : public CodeDocument
1818
{
1919
Q_OBJECT
2020

2121
public:
2222
explicit QmlDocument(QObject *parent = nullptr);
23+
~QmlDocument() override;
2324
};
2425

2526
}

src/gui/mainwindow.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,10 +619,11 @@ void MainWindow::updateActions()
619619
ui->actionExecuteAPI->setEnabled(textDocument != nullptr);
620620

621621
auto *codeDocument = qobject_cast<Core::CodeDocument *>(document);
622+
const bool qmlEnabled = codeDocument && qobject_cast<Core::QmlDocument *>(document);
622623
const bool lspEnabled = codeDocument && codeDocument->hasLspClient();
623624
ui->actionFollowSymbol->setEnabled(lspEnabled);
624625
ui->actionSwitchDeclDef->setEnabled(lspEnabled);
625-
ui->actionTreeSitterInspector->setEnabled(lspEnabled);
626+
ui->actionTreeSitterInspector->setEnabled(lspEnabled || qmlEnabled);
626627

627628
const bool cppEnabled = codeDocument && qobject_cast<Core::CppDocument *>(document);
628629
ui->actionSwitchHeaderSource->setEnabled(cppEnabled);

src/gui/treesitterinspector.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void QueryErrorHighlighter::setUtf8Position(int position)
8080
TreeSitterInspector::TreeSitterInspector(QWidget *parent)
8181
: QDialog(parent)
8282
, ui(new Ui::TreeSitterInspector)
83-
, m_parser(tree_sitter_cpp())
83+
, m_parser(nullptr)
8484
, m_errorHighlighter(nullptr)
8585
, m_document(nullptr)
8686
{
@@ -149,7 +149,8 @@ void TreeSitterInspector::changeQuery()
149149
}
150150

151151
try {
152-
auto query = std::make_shared<treesitter::Query>(tree_sitter_cpp(), ui->query->toPlainText());
152+
auto lang = treesitter::Parser::getTSLanguageForDocumentType(m_document->type());
153+
auto query = std::make_shared<treesitter::Query>(lang, ui->query->toPlainText());
153154
m_treemodel.setQuery(query, makePredicates());
154155
m_errorHighlighter->setUtf8Position(-1);
155156

@@ -211,6 +212,7 @@ void TreeSitterInspector::setDocument(Core::CodeDocument *document)
211212
}
212213

213214
m_document = document;
215+
m_parser = treesitter::Parser::getTSLanguageForDocumentType(document->type());
214216
if (m_document) {
215217
connect(m_document, &Core::CodeDocument::textChanged, this, &TreeSitterInspector::changeText);
216218
connect(m_document, &Core::CodeDocument::positionChanged, this, &TreeSitterInspector::changeCursor);
@@ -281,8 +283,9 @@ void TreeSitterInspector::prepareTransformation(
281283
}
282284

283285
try {
284-
auto query = std::make_shared<treesitter::Query>(tree_sitter_cpp(), m_queryText);
285-
treesitter::Parser parser(tree_sitter_cpp());
286+
auto lang = treesitter::Parser::getTSLanguageForDocumentType(m_document->type());
287+
auto query = std::make_shared<treesitter::Query>(lang, m_queryText);
288+
treesitter::Parser parser(lang);
286289

287290
treesitter::Transformation transformation(m_document->text(), std::move(parser), query,
288291
ui->target->toPlainText());

src/treesitter/parser.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "parser.h"
1212
#include "tree.h"
13+
#include "treesitter/languages.h"
1314

1415
#include <tree_sitter/api.h>
1516
#include <utility>
@@ -62,4 +63,18 @@ const TSLanguage *Parser::language() const
6263
return ts_parser_language(m_parser);
6364
}
6465

66+
TSLanguage *Parser::getTSLanguageForDocumentType(Core::Document::Type type)
67+
{
68+
switch (type) {
69+
case Core::Document::Type::Qml:
70+
return tree_sitter_qmljs();
71+
// FIXME: make sane default for other documents.
72+
case Core::Document::Type::Cpp:
73+
default:
74+
return tree_sitter_cpp();
75+
break;
76+
}
77+
78+
Q_UNREACHABLE();
79+
}
6580
}

src/treesitter/parser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#pragma once
1212

13+
#include "core/document.h"
1314
#include <QString>
1415

1516
struct TSParser;
@@ -38,6 +39,8 @@ class Parser
3839

3940
const TSLanguage *language() const;
4041

42+
static TSLanguage *getTSLanguageForDocumentType(Core::Document::Type type);
43+
4144
private:
4245
TSParser *m_parser;
4346
};

test_data/projects/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
#
99

1010
add_subdirectory(cpp-project)
11+
add_subdirectory(qml-project)

0 commit comments

Comments
 (0)