summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/doc/parser.rs14
-rw-r--r--cli/module_graph.rs21
-rw-r--r--cli/swc_util.rs65
-rw-r--r--cli/tests/ts_with_generic.ts3
4 files changed, 86 insertions, 17 deletions
diff --git a/cli/doc/parser.rs b/cli/doc/parser.rs
index 0e58e4b0a..9215637c5 100644
--- a/cli/doc/parser.rs
+++ b/cli/doc/parser.rs
@@ -1,4 +1,5 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+use crate::file_fetcher::map_file_extension;
use crate::op_error::OpError;
use crate::swc_common::comments::CommentKind;
use crate::swc_common::Span;
@@ -15,6 +16,7 @@ use deno_core::ModuleSpecifier;
use futures::Future;
use regex::Regex;
use std::collections::HashMap;
+use std::path::PathBuf;
use std::pin::Pin;
use super::namespace::NamespaceDef;
@@ -57,9 +59,12 @@ impl DocParser {
file_name: &str,
source_code: &str,
) -> Result<ModuleDoc, SwcDiagnosticBuffer> {
- self
- .ast_parser
- .parse_module(file_name, source_code, |parse_result| {
+ let media_type = map_file_extension(&PathBuf::from(file_name));
+ self.ast_parser.parse_module(
+ file_name,
+ media_type,
+ source_code,
+ |parse_result| {
let module = parse_result?;
let doc_entries =
self.get_doc_nodes_for_module_body(module.body.clone());
@@ -69,7 +74,8 @@ impl DocParser {
reexports,
};
Ok(module_doc)
- })
+ },
+ )
}
pub async fn parse(&self, file_name: &str) -> Result<Vec<DocNode>, ErrBox> {
diff --git a/cli/module_graph.rs b/cli/module_graph.rs
index 3a59a537d..be3bd2884 100644
--- a/cli/module_graph.rs
+++ b/cli/module_graph.rs
@@ -196,6 +196,7 @@ impl ModuleGraphLoader {
let (import_descs, ref_descs) = analyze_dependencies_and_references(
&specifier,
+ map_file_extension(&PathBuf::from(&specifier)),
&source_code,
self.analyze_dynamic_imports,
)?;
@@ -409,6 +410,7 @@ impl ModuleGraphLoader {
let (import_descs, ref_descs) = analyze_dependencies_and_references(
&module_specifier.to_string(),
+ source_file.media_type,
&source_code,
self.analyze_dynamic_imports,
)?;
@@ -786,4 +788,23 @@ mod tests {
);
drop(http_server_guard);
}
+
+ #[tokio::test]
+ async fn source_graph_different_langs() {
+ let http_server_guard = crate::test_util::http_server();
+
+ // ModuleGraphLoader was mistakenly parsing this file as TSX
+ // https://github.com/denoland/deno/issues/5867
+
+ let module_specifier = ModuleSpecifier::resolve_url_or_path(
+ "http://localhost:4545/cli/tests/ts_with_generic.ts",
+ )
+ .unwrap();
+
+ build_graph(&module_specifier)
+ .await
+ .expect("Failed to build graph");
+
+ drop(http_server_guard);
+ }
}
diff --git a/cli/swc_util.rs b/cli/swc_util.rs
index 465fb9769..ce7372159 100644
--- a/cli/swc_util.rs
+++ b/cli/swc_util.rs
@@ -1,4 +1,5 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+use crate::msg::MediaType;
use crate::swc_common;
use crate::swc_common::comments::CommentKind;
use crate::swc_common::comments::Comments;
@@ -13,19 +14,42 @@ use crate::swc_common::SourceMap;
use crate::swc_common::Span;
use crate::swc_ecma_ast;
use crate::swc_ecma_parser::lexer::Lexer;
+use crate::swc_ecma_parser::EsConfig;
use crate::swc_ecma_parser::JscTarget;
use crate::swc_ecma_parser::Parser;
use crate::swc_ecma_parser::Session;
use crate::swc_ecma_parser::SourceFileInput;
use crate::swc_ecma_parser::Syntax;
use crate::swc_ecma_parser::TsConfig;
-use swc_ecma_visit::Node;
-use swc_ecma_visit::Visit;
-
use std::error::Error;
use std::fmt;
use std::sync::Arc;
use std::sync::RwLock;
+use swc_ecma_visit::Node;
+use swc_ecma_visit::Visit;
+
+fn get_default_es_config() -> EsConfig {
+ let mut config = EsConfig::default();
+ config.num_sep = true;
+ config.class_private_props = false;
+ config.class_private_methods = false;
+ config.class_props = false;
+ config.export_default_from = true;
+ config.export_namespace_from = true;
+ config.dynamic_import = true;
+ config.nullish_coalescing = true;
+ config.optional_chaining = true;
+ config.import_meta = true;
+ config.top_level_await = true;
+ config
+}
+
+fn get_default_ts_config() -> TsConfig {
+ let mut ts_config = TsConfig::default();
+ ts_config.dynamic_import = true;
+ ts_config.decorators = true;
+ ts_config
+}
#[derive(Clone, Debug)]
pub struct SwcDiagnosticBuffer {
@@ -126,6 +150,7 @@ impl AstParser {
pub fn parse_module<F, R>(
&self,
file_name: &str,
+ media_type: MediaType,
source_code: &str,
callback: F,
) -> R
@@ -143,12 +168,21 @@ impl AstParser {
handler: &self.handler,
};
- // TODO(bartlomieju): lexer should be configurable by the caller
- let mut ts_config = TsConfig::default();
- ts_config.dynamic_import = true;
- ts_config.decorators = true;
- ts_config.tsx = true;
- let syntax = Syntax::Typescript(ts_config);
+ let syntax = match media_type {
+ MediaType::JavaScript => Syntax::Es(get_default_es_config()),
+ MediaType::JSX => {
+ let mut config = get_default_es_config();
+ config.jsx = true;
+ Syntax::Es(config)
+ }
+ MediaType::TypeScript => Syntax::Typescript(get_default_ts_config()),
+ MediaType::TSX => {
+ let mut config = get_default_ts_config();
+ config.tsx = true;
+ Syntax::Typescript(config)
+ }
+ _ => Syntax::Es(get_default_es_config()),
+ };
let lexer = Lexer::new(
session,
@@ -433,6 +467,7 @@ pub struct TsReferenceDescriptor {
pub fn analyze_dependencies_and_references(
file_name: &str,
+ media_type: MediaType,
source_code: &str,
analyze_dynamic_imports: bool,
) -> Result<
@@ -440,7 +475,7 @@ pub fn analyze_dependencies_and_references(
SwcDiagnosticBuffer,
> {
let parser = AstParser::new();
- parser.parse_module(file_name, source_code, |parse_result| {
+ parser.parse_module(file_name, media_type, source_code, |parse_result| {
let module = parse_result?;
let mut collector = NewDependencyVisitor {
dependencies: vec![],
@@ -547,9 +582,13 @@ console.log(fizz);
console.log(qat.qat);
"#;
- let (imports, references) =
- analyze_dependencies_and_references("some/file.ts", source, true)
- .expect("Failed to parse");
+ let (imports, references) = analyze_dependencies_and_references(
+ "some/file.ts",
+ MediaType::TypeScript,
+ source,
+ true,
+ )
+ .expect("Failed to parse");
assert_eq!(
imports,
diff --git a/cli/tests/ts_with_generic.ts b/cli/tests/ts_with_generic.ts
new file mode 100644
index 000000000..aa83e73b9
--- /dev/null
+++ b/cli/tests/ts_with_generic.ts
@@ -0,0 +1,3 @@
+/* eslint-disable */
+
+const foo = { delete<S>() {} };