summaryrefslogtreecommitdiff
path: root/cli/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'cli/lsp')
-rw-r--r--cli/lsp/analysis.rs4
-rw-r--r--cli/lsp/config.rs28
-rw-r--r--cli/lsp/diagnostics.rs26
3 files changed, 53 insertions, 5 deletions
diff --git a/cli/lsp/analysis.rs b/cli/lsp/analysis.rs
index 9c7025781..f60f2e044 100644
--- a/cli/lsp/analysis.rs
+++ b/cli/lsp/analysis.rs
@@ -9,6 +9,7 @@ use super::tsc;
use crate::args::jsr_url;
use crate::tools::lint::create_linter;
+use deno_lint::linter::LintConfig;
use deno_runtime::fs_util::specifier_to_file_path;
use deno_ast::SourceRange;
@@ -169,9 +170,10 @@ fn as_lsp_range(
pub fn get_lint_references(
parsed_source: &deno_ast::ParsedSource,
lint_rules: Vec<&'static dyn LintRule>,
+ lint_config: LintConfig,
) -> Result<Vec<Reference>, AnyError> {
let linter = create_linter(lint_rules);
- let lint_diagnostics = linter.lint_with_ast(parsed_source);
+ let lint_diagnostics = linter.lint_with_ast(parsed_source, lint_config);
Ok(
lint_diagnostics
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index 364999cff..02f3d5afb 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -24,6 +24,7 @@ use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::serde_json::Value;
use deno_core::ModuleSpecifier;
+use deno_lint::linter::LintConfig;
use deno_lockfile::Lockfile;
use deno_npm::npm_rc::ResolvedNpmRc;
use deno_runtime::deno_node::PackageJson;
@@ -1055,6 +1056,9 @@ impl Default for LspTsConfig {
"target": "esnext",
"useDefineForClassFields": true,
"useUnknownInCatchVariables": false,
+ "jsx": "react",
+ "jsxFactory": "React.createElement",
+ "jsxFragmentFactory": "React.Fragment",
})),
}
}
@@ -1087,6 +1091,7 @@ pub struct ConfigData {
pub config_file: Option<Arc<ConfigFile>>,
pub fmt_options: Arc<FmtOptions>,
pub lint_options: Arc<LintOptions>,
+ pub lint_config: LintConfig,
pub lint_rules: Arc<ConfiguredRules>,
pub ts_config: Arc<LspTsConfig>,
pub byonm: bool,
@@ -1253,6 +1258,28 @@ impl ConfigData {
let ts_config = LspTsConfig::new(config_file.as_ref());
+ let lint_config = if ts_config.inner.0.get("jsx").and_then(|v| v.as_str())
+ == Some("react")
+ {
+ let default_jsx_factory =
+ ts_config.inner.0.get("jsxFactory").and_then(|v| v.as_str());
+ let default_jsx_fragment_factory = ts_config
+ .inner
+ .0
+ .get("jsxFragmentFactory")
+ .and_then(|v| v.as_str());
+ deno_lint::linter::LintConfig {
+ default_jsx_factory: default_jsx_factory.map(String::from),
+ default_jsx_fragment_factory: default_jsx_fragment_factory
+ .map(String::from),
+ }
+ } else {
+ deno_lint::linter::LintConfig {
+ default_jsx_factory: None,
+ default_jsx_fragment_factory: None,
+ }
+ };
+
let vendor_dir = config_file.as_ref().and_then(|c| c.vendor_dir_path());
// Load lockfile
@@ -1429,6 +1456,7 @@ impl ConfigData {
config_file: config_file.map(Arc::new),
fmt_options,
lint_options,
+ lint_config,
lint_rules,
ts_config: Arc::new(ts_config),
byonm,
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs
index 35da778dc..9e54c8106 100644
--- a/cli/lsp/diagnostics.rs
+++ b/cli/lsp/diagnostics.rs
@@ -38,6 +38,7 @@ use deno_graph::source::ResolutionMode;
use deno_graph::Resolution;
use deno_graph::ResolutionError;
use deno_graph::SpecifierError;
+use deno_lint::linter::LintConfig;
use deno_lint::rules::LintRule;
use deno_runtime::deno_fs;
use deno_runtime::deno_node;
@@ -804,12 +805,27 @@ fn generate_lint_diagnostics(
continue;
}
let version = document.maybe_lsp_version();
- let (lint_options, lint_rules) = config
+ let (lint_options, lint_config, lint_rules) = config
.tree
.scope_for_specifier(specifier)
.and_then(|s| config_data_by_scope.get(s))
- .map(|d| (d.lint_options.clone(), d.lint_rules.clone()))
- .unwrap_or_default();
+ .map(|d| {
+ (
+ d.lint_options.clone(),
+ d.lint_config.clone(),
+ d.lint_rules.clone(),
+ )
+ })
+ .unwrap_or_else(|| {
+ (
+ Arc::default(),
+ LintConfig {
+ default_jsx_factory: None,
+ default_jsx_fragment_factory: None,
+ },
+ Arc::default(),
+ )
+ });
diagnostics_vec.push(DiagnosticRecord {
specifier: specifier.clone(),
versioned: VersionedDiagnostics {
@@ -817,6 +833,7 @@ fn generate_lint_diagnostics(
diagnostics: generate_document_lint_diagnostics(
&document,
&lint_options,
+ lint_config,
lint_rules.rules.clone(),
),
},
@@ -828,6 +845,7 @@ fn generate_lint_diagnostics(
fn generate_document_lint_diagnostics(
document: &Document,
lint_options: &LintOptions,
+ lint_config: LintConfig,
lint_rules: Vec<&'static dyn LintRule>,
) -> Vec<lsp::Diagnostic> {
if !lint_options.files.matches_specifier(document.specifier()) {
@@ -836,7 +854,7 @@ fn generate_document_lint_diagnostics(
match document.maybe_parsed_source() {
Some(Ok(parsed_source)) => {
if let Ok(references) =
- analysis::get_lint_references(&parsed_source, lint_rules)
+ analysis::get_lint_references(&parsed_source, lint_rules, lint_config)
{
references
.into_iter()