Skip to content

Commit ca92c74

Browse files
committed
refactor(vscode): use File_Language instead of Linter_Options for QLJS_Lintable_Document
QLJS_Lintable_Document keeps track of a Linter_Options object. This will be problematic when we allow some linter options to be overwritten by a user quick-lint-js.config file. Refactor QLJS_Lintable_Document to work with File_Language instead. Only create a Linter_Options object at the last minute.
1 parent 31bdbf3 commit ca92c74

File tree

4 files changed

+32
-49
lines changed

4 files changed

+32
-49
lines changed

plugin/vscode/quick-lint-js/vscode/qljs-document.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <quick-lint-js/assert.h>
99
#include <quick-lint-js/configuration/configuration-loader.h>
1010
#include <quick-lint-js/container/padded-string.h>
11+
#include <quick-lint-js/fe/language.h>
1112
#include <quick-lint-js/fe/linter.h>
1213
#include <quick-lint-js/logging/log.h>
1314
#include <quick-lint-js/lsp/lsp-document-text.h>
@@ -138,8 +139,8 @@ class QLJS_Lintable_Document : public QLJS_Document_Base {
138139
public:
139140
explicit QLJS_Lintable_Document(VSCode_Document doc,
140141
const std::optional<std::string>& file_path,
141-
Linter_Options lint_options)
142-
: QLJS_Document_Base(doc, file_path), lint_options_(lint_options) {}
142+
File_Language language)
143+
: QLJS_Document_Base(doc, file_path), language_(language) {}
143144

144145
void after_modification(::Napi::Env, QLJS_Workspace&,
145146
VSCode_Diagnostic_Collection) override;
@@ -159,13 +160,18 @@ class QLJS_Lintable_Document : public QLJS_Document_Base {
159160
VSCode_Diag_Reporter diag_reporter(vscode, env, &this->document_.locator(),
160161
this->uri());
161162
parse_and_lint(this->document_.string(), diag_reporter,
162-
this->config_->globals(), this->lint_options_);
163+
this->config_->globals(),
164+
get_linter_options_from_language(this->language_));
163165

164166
return std::move(diag_reporter).diagnostics();
165167
}
166168

167169
Configuration* config_; // Initialized by finish_init.
168-
Linter_Options lint_options_;
170+
171+
// Resolved parsing mode. Might not match VS Code's opinion.
172+
//
173+
// See VSCode_Language for how we determine this value.
174+
File_Language language_;
169175

170176
friend class QLJS_Document_Base;
171177
friend class QLJS_Workspace;

plugin/vscode/quick-lint-js/vscode/qljs-workspace.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ QLJS_Document_Base* QLJS_Workspace::maybe_create_document(
305305
if (const VSCode_Language* lang = VSCode_Language::find(
306306
vscode_doc.language_id(), to_string8_view(vscode_doc.uri_string()),
307307
/*allow_typescript=*/true)) {
308-
doc = new QLJS_Lintable_Document(vscode_doc, file_path, lang->lint_options);
308+
doc = new QLJS_Lintable_Document(vscode_doc, file_path, lang->language);
309309
} else if (file_path.has_value() &&
310310
this->config_loader_.is_config_file_path(*file_path)) {
311311
doc = new QLJS_Config_Document(vscode_doc, file_path);

src/quick-lint-js/vscode/vscode-language.h

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#pragma once
55

66
#include <iterator>
7-
#include <quick-lint-js/fe/linter.h>
7+
#include <quick-lint-js/fe/language.h>
88
#include <quick-lint-js/port/char8.h>
99
#include <quick-lint-js/util/algorithm.h>
1010
#include <quick-lint-js/util/classify-path.h>
@@ -14,8 +14,8 @@ namespace quick_lint_js {
1414
// See also LSP_Language.
1515
struct VSCode_Language {
1616
constexpr VSCode_Language(std::string_view language_id,
17-
Linter_Options lint_options)
18-
: lint_options(lint_options) {
17+
File_Language language)
18+
: language(language) {
1919
quick_lint_js::copy(language_id.begin(), language_id.end(),
2020
this->raw_language_id);
2121
this->language_id_size = static_cast<unsigned char>(language_id.size());
@@ -26,41 +26,19 @@ struct VSCode_Language {
2626
}
2727

2828
// Returns nullptr if the language does not exist.
29+
// TODO(#690): Remove 'allow_typescript'. It should always be true.
2930
static const VSCode_Language* find(std::string_view language_id,
3031
String8_View uri, bool allow_typescript) {
3132
using namespace std::literals::string_view_literals;
3233

33-
static constexpr Linter_Options jsx = {
34-
.jsx = true,
35-
.typescript = false,
36-
.typescript_definition = false,
37-
.print_parser_visits = false,
38-
};
39-
static constexpr Linter_Options ts = {
40-
.jsx = false,
41-
.typescript = true,
42-
.typescript_definition = false,
43-
.print_parser_visits = false,
44-
};
4534
static constexpr VSCode_Language ts_definition(
46-
"typescript"sv, Linter_Options{
47-
.jsx = false,
48-
.typescript = true,
49-
.typescript_definition = true,
50-
.print_parser_visits = false,
51-
});
52-
static constexpr Linter_Options tsx = {
53-
.jsx = true,
54-
.typescript = true,
55-
.typescript_definition = false,
56-
.print_parser_visits = false,
57-
};
35+
"typescript"sv, File_Language::typescript_definition);
5836
static constexpr VSCode_Language languages[] = {
59-
VSCode_Language("javascript"sv, jsx),
60-
VSCode_Language("javascriptreact"sv, jsx),
37+
VSCode_Language("javascript"sv, File_Language::javascript_jsx),
38+
VSCode_Language("javascriptreact"sv, File_Language::javascript_jsx),
6139

62-
VSCode_Language("typescript"sv, ts),
63-
VSCode_Language("typescriptreact"sv, tsx),
40+
VSCode_Language("typescript"sv, File_Language::typescript),
41+
VSCode_Language("typescriptreact"sv, File_Language::typescript_jsx),
6442
};
6543
const VSCode_Language* lang =
6644
find_unique_if(std::begin(languages), std::end(languages),
@@ -70,7 +48,10 @@ struct VSCode_Language {
7048
if (lang == std::end(languages)) {
7149
return nullptr;
7250
}
73-
if (lang->lint_options.typescript && !allow_typescript) {
51+
if ((lang->language == File_Language::typescript ||
52+
lang->language == File_Language::typescript_jsx ||
53+
lang->language == File_Language::typescript_definition) &&
54+
!allow_typescript) {
7455
return nullptr;
7556
}
7657
Path_Classification classified_uri = classify_uri(uri);
@@ -82,7 +63,7 @@ struct VSCode_Language {
8263

8364
char raw_language_id[16] = {};
8465
unsigned char language_id_size = 0;
85-
Linter_Options lint_options;
66+
File_Language language;
8667
};
8768
}
8869

test/test-vscode-language.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,29 @@ TEST(Test_VSCode_Language, primary_languages) {
1717
const VSCode_Language* language =
1818
VSCode_Language::find("javascript"sv, dummy_uri, allow_typescript);
1919
ASSERT_NE(language, nullptr);
20-
EXPECT_TRUE(language->lint_options.jsx)
20+
EXPECT_EQ(language->language, File_Language::javascript_jsx)
2121
<< "JSX support should be enabled for 'javascript'";
22-
EXPECT_FALSE(language->lint_options.typescript);
2322
}
2423

2524
{
2625
const VSCode_Language* language =
2726
VSCode_Language::find("javascriptreact"sv, dummy_uri, allow_typescript);
2827
ASSERT_NE(language, nullptr);
29-
EXPECT_TRUE(language->lint_options.jsx);
30-
EXPECT_FALSE(language->lint_options.typescript);
28+
EXPECT_EQ(language->language, File_Language::javascript_jsx);
3129
}
3230

3331
{
3432
const VSCode_Language* language =
3533
VSCode_Language::find("typescript"sv, dummy_uri, allow_typescript);
3634
ASSERT_NE(language, nullptr);
37-
EXPECT_FALSE(language->lint_options.jsx);
38-
EXPECT_TRUE(language->lint_options.typescript);
35+
EXPECT_EQ(language->language, File_Language::typescript);
3936
}
4037

4138
{
4239
const VSCode_Language* language =
4340
VSCode_Language::find("typescriptreact"sv, dummy_uri, allow_typescript);
4441
ASSERT_NE(language, nullptr);
45-
EXPECT_TRUE(language->lint_options.jsx);
46-
EXPECT_TRUE(language->lint_options.typescript);
42+
EXPECT_EQ(language->language, File_Language::typescript_jsx);
4743
}
4844
}
4945

@@ -63,14 +59,14 @@ TEST(Test_VSCode_Language, typescript_file_without_d_is_source) {
6359
const VSCode_Language* language = VSCode_Language::find(
6460
"typescript"sv, u8"file:///test.ts"_sv, allow_typescript);
6561
ASSERT_NE(language, nullptr);
66-
EXPECT_FALSE(language->lint_options.typescript_definition);
62+
EXPECT_EQ(language->language, File_Language::typescript);
6763
}
6864

6965
{
7066
const VSCode_Language* language = VSCode_Language::find(
7167
"typescript"sv, u8"file:///folder.d.ts/test.ts"_sv, allow_typescript);
7268
ASSERT_NE(language, nullptr);
73-
EXPECT_FALSE(language->lint_options.typescript_definition)
69+
EXPECT_EQ(language->language, File_Language::typescript)
7470
<< ".d. in containing directory should be ignored";
7571
}
7672

@@ -90,7 +86,7 @@ TEST(Test_VSCode_Language, typescript_file_with_d_is_definition) {
9086
const VSCode_Language* language =
9187
VSCode_Language::find("typescript"sv, uri, allow_typescript);
9288
ASSERT_NE(language, nullptr);
93-
EXPECT_TRUE(language->lint_options.typescript_definition);
89+
EXPECT_EQ(language->language, File_Language::typescript_definition);
9490
}
9591
}
9692
}

0 commit comments

Comments
 (0)