summaryrefslogtreecommitdiff
path: root/cli/swc_util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/swc_util.rs')
-rw-r--r--cli/swc_util.rs202
1 files changed, 92 insertions, 110 deletions
diff --git a/cli/swc_util.rs b/cli/swc_util.rs
index d79f7cccb..e83a2ce18 100644
--- a/cli/swc_util.rs
+++ b/cli/swc_util.rs
@@ -1,40 +1,38 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
use crate::msg::MediaType;
-use crate::swc_common;
-use crate::swc_common::comments::Comments;
-use crate::swc_common::errors::Diagnostic;
-use crate::swc_common::errors::DiagnosticBuilder;
-use crate::swc_common::errors::Emitter;
-use crate::swc_common::errors::Handler;
-use crate::swc_common::errors::HandlerFlags;
-use crate::swc_common::FileName;
-use crate::swc_common::Globals;
-use crate::swc_common::SourceMap;
-use crate::swc_common::Span;
-use crate::swc_ecma_ast;
-use crate::swc_ecma_ast::Program;
-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::SourceFileInput;
-use crate::swc_ecma_parser::Syntax;
-use crate::swc_ecma_parser::TsConfig;
-use crate::swc_ecma_visit::FoldWith;
use deno_core::ErrBox;
use std::error::Error;
use std::fmt;
use std::sync::Arc;
use std::sync::RwLock;
use swc_common::chain;
-use swc_ecma_codegen::text_writer::JsWriter;
-use swc_ecma_codegen::Node;
-use swc_ecma_transforms::fixer;
-use swc_ecma_transforms::typescript;
+use swc_common::comments::SingleThreadedComments;
+use swc_common::errors::Diagnostic;
+use swc_common::errors::DiagnosticBuilder;
+use swc_common::errors::Emitter;
+use swc_common::errors::Handler;
+use swc_common::errors::HandlerFlags;
+use swc_common::FileName;
+use swc_common::Globals;
+use swc_common::SourceMap;
+use swc_common::Span;
+use swc_ecmascript::ast::Program;
+use swc_ecmascript::codegen::text_writer::JsWriter;
+use swc_ecmascript::codegen::Node;
+use swc_ecmascript::parser::lexer::Lexer;
+use swc_ecmascript::parser::EsConfig;
+use swc_ecmascript::parser::JscTarget;
+use swc_ecmascript::parser::Parser;
+use swc_ecmascript::parser::StringInput;
+use swc_ecmascript::parser::Syntax;
+use swc_ecmascript::parser::TsConfig;
+use swc_ecmascript::transforms::fixer;
+use swc_ecmascript::transforms::typescript;
+use swc_ecmascript::visit::FoldWith;
struct DummyHandler;
-impl swc_ecma_codegen::Handlers for DummyHandler {}
+impl swc_ecmascript::codegen::Handlers for DummyHandler {}
fn get_default_es_config() -> EsConfig {
let mut config = EsConfig::default();
@@ -147,7 +145,7 @@ pub struct AstParser {
pub buffered_error: SwcErrorBuffer,
pub source_map: Arc<SourceMap>,
pub handler: Handler,
- pub comments: Comments,
+ pub comments: SingleThreadedComments,
pub globals: Globals,
}
@@ -168,46 +166,38 @@ impl AstParser {
buffered_error,
source_map: Arc::new(SourceMap::default()),
handler,
- comments: Comments::default(),
+ comments: SingleThreadedComments::default(),
globals: Globals::new(),
}
}
- pub fn parse_module<F, R>(
+ pub fn parse_module(
&self,
file_name: &str,
media_type: MediaType,
source_code: &str,
- callback: F,
- ) -> R
- where
- F: FnOnce(Result<swc_ecma_ast::Module, SwcDiagnosticBuffer>) -> R,
- {
- swc_common::GLOBALS.set(&self.globals, || {
- let swc_source_file = self.source_map.new_source_file(
- FileName::Custom(file_name.to_string()),
- source_code.to_string(),
- );
-
- let buffered_err = self.buffered_error.clone();
- let syntax = get_syntax_for_media_type(media_type);
-
- let lexer = Lexer::new(
- syntax,
- JscTarget::Es2019,
- SourceFileInput::from(&*swc_source_file),
- Some(&self.comments),
- );
-
- let mut parser = Parser::new_from(lexer);
-
- let parse_result = parser.parse_module().map_err(move |err| {
- let mut diagnostic = err.into_diagnostic(&self.handler);
- diagnostic.emit();
- SwcDiagnosticBuffer::from_swc_error(buffered_err, self)
- });
-
- callback(parse_result)
+ ) -> Result<swc_ecmascript::ast::Module, SwcDiagnosticBuffer> {
+ let swc_source_file = self.source_map.new_source_file(
+ FileName::Custom(file_name.to_string()),
+ source_code.to_string(),
+ );
+
+ let buffered_err = self.buffered_error.clone();
+ let syntax = get_syntax_for_media_type(media_type);
+
+ let lexer = Lexer::new(
+ syntax,
+ JscTarget::Es2019,
+ StringInput::from(&*swc_source_file),
+ Some(&self.comments),
+ );
+
+ let mut parser = Parser::new_from(lexer);
+
+ parser.parse_module().map_err(move |err| {
+ let mut diagnostic = err.into_diagnostic(&self.handler);
+ diagnostic.emit();
+ SwcDiagnosticBuffer::from_swc_error(buffered_err, self)
})
}
@@ -217,48 +207,47 @@ impl AstParser {
media_type: MediaType,
source_code: &str,
) -> Result<String, ErrBox> {
- self.parse_module(file_name, media_type, source_code, |parse_result| {
- let module = parse_result?;
- let program = Program::Module(module);
- let mut compiler_pass = chain!(typescript::strip(), fixer());
- let program = swc_ecma_transforms::util::COMMENTS
- .set(&self.comments, || program.fold_with(&mut compiler_pass));
-
- let mut src_map_buf = vec![];
+ let parse_result = self.parse_module(file_name, media_type, source_code);
+ let module = parse_result?;
+ let program = Program::Module(module);
+ let mut compiler_pass =
+ chain!(typescript::strip(), fixer(Some(&self.comments)));
+ let program = program.fold_with(&mut compiler_pass);
+
+ let mut src_map_buf = vec![];
+ let mut buf = vec![];
+ {
+ let handlers = Box::new(DummyHandler);
+ let writer = Box::new(JsWriter::new(
+ self.source_map.clone(),
+ "\n",
+ &mut buf,
+ Some(&mut src_map_buf),
+ ));
+ let config = swc_ecmascript::codegen::Config { minify: false };
+ let mut emitter = swc_ecmascript::codegen::Emitter {
+ cfg: config,
+ comments: Some(&self.comments),
+ cm: self.source_map.clone(),
+ wr: writer,
+ handlers,
+ };
+ program.emit_with(&mut emitter)?;
+ }
+ let mut src = String::from_utf8(buf).map_err(ErrBox::from)?;
+ {
let mut buf = vec![];
- {
- let handlers = Box::new(DummyHandler);
- let writer = Box::new(JsWriter::new(
- self.source_map.clone(),
- "\n",
- &mut buf,
- Some(&mut src_map_buf),
- ));
- let config = swc_ecma_codegen::Config { minify: false };
- let mut emitter = swc_ecma_codegen::Emitter {
- cfg: config,
- comments: Some(&self.comments),
- cm: self.source_map.clone(),
- wr: writer,
- handlers,
- };
- program.emit_with(&mut emitter)?;
- }
- let mut src = String::from_utf8(buf).map_err(ErrBox::from)?;
- {
- let mut buf = vec![];
- self
- .source_map
- .build_source_map_from(&mut src_map_buf, None)
- .to_writer(&mut buf)?;
- let map = String::from_utf8(buf)?;
-
- src.push_str("//# sourceMappingURL=data:application/json;base64,");
- let encoded_map = base64::encode(map.as_bytes());
- src.push_str(&encoded_map);
- }
- Ok(src)
- })
+ self
+ .source_map
+ .build_source_map_from(&mut src_map_buf, None)
+ .to_writer(&mut buf)?;
+ let map = String::from_utf8(buf)?;
+
+ src.push_str("//# sourceMappingURL=data:application/json;base64,");
+ let encoded_map = base64::encode(map.as_bytes());
+ src.push_str(&encoded_map);
+ }
+ Ok(src)
}
pub fn get_span_location(&self, span: Span) -> swc_common::Loc {
@@ -269,16 +258,9 @@ impl AstParser {
&self,
span: Span,
) -> Vec<swc_common::comments::Comment> {
- let maybe_comments = self.comments.take_leading_comments(span.lo());
-
- if let Some(comments) = maybe_comments {
- // clone the comments and put them back in map
- let to_return = comments.clone();
- self.comments.add_leading(span.lo(), comments);
- to_return
- } else {
- vec![]
- }
+ self
+ .comments
+ .with_leading(span.lo(), |comments| comments.to_vec())
}
}