Crate swc_ecma_parser

Source
Expand description

EcmaScript/TypeScript parser for the rust programming language.

§Features

§Heavily tested

Passes almost all tests from tc39/test262.

§Error reporting

error: 'implements', 'interface', 'let', 'package', 'private', 'protected',  'public', 'static', or 'yield' cannot be used as an identifier in strict mode
 --> invalid.js:3:10
  |
3 | function yield() {
  |          ^^^^^

§Error recovery

The parser can recover from some parsing errors. For example, parser returns Ok(Module) for the code below, while emitting error to handler.

const CONST = 9000 % 2;
const enum D {
    // Comma is required, but parser can recover because of the newline.
    d = 10
    g = CONST
}

§Example (lexer)

See lexer.rs in examples directory.

§Example (parser)

#[macro_use]
extern crate swc_common;
extern crate swc_ecma_parser;
use swc_common::sync::Lrc;
use swc_common::{
    errors::{ColorConfig, Handler},
    FileName, FilePathMapping, SourceMap,
};
use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};

fn main() {
    let cm: Lrc<SourceMap> = Default::default();
    let handler =
        Handler::with_tty_emitter(ColorConfig::Auto, true, false,
        Some(cm.clone()));

    // Real usage
    // let fm = cm
    //     .load_file(Path::new("test.js"))
    //     .expect("failed to load test.js");
    let fm = cm.new_source_file(
        FileName::Custom("test.js".into()).into(),
        "function foo() {}".into(),
    );
    let lexer = Lexer::new(
        // We want to parse ecmascript
        Syntax::Es(Default::default()),
        // EsVersion defaults to es5
        Default::default(),
        StringInput::from(&*fm),
        None,
    );

    let mut parser = Parser::new_from(lexer);

    for e in parser.take_errors() {
        e.into_diagnostic(&handler).emit();
    }

    let _module = parser
        .parse_module()
        .map_err(|mut e| {
            // Unrecoverable fatal error occurred
            e.into_diagnostic(&handler).emit()
        })
        .expect("failed to parser module");
}

§Cargo features

§typescript

Enables typescript parser.

§verify

Verify more errors, using swc_ecma_visit.

§Known issues

§Null character after \

Because String of rust should only contain valid utf-8 characters while javascript allows non-utf8 characters, the parser stores invalid utf8 characters in escaped form.

As a result, swc needs a way to distinguish invalid-utf8 code points and input specified by the user. The parser stores a null character right after \\ for non-utf8 code points. Note that other parts of swc is aware of this fact.

Note that this can be changed at anytime with a breaking change.

Modules§

error
input
lexer
ECMAScript lexer.
token
Ported from babel/babylon

Structs§

Capturing
Note: Lexer need access to parser’s context to lex correctly.
Context
Syntactic context.
EsSyntax
Parser
EcmaScript parser.
StringInput
Implementation of Input.
TokensInput
TsSyntax

Enums§

Syntax

Traits§

Input
Tokens
Clone should be cheap if you are parsing typescript because typescript syntax requires backtracking.

Functions§

parse_file_as_expr
Note: This is recommended way to parse a file.
parse_file_as_module
Note: This is recommended way to parse a file.
parse_file_as_program
Note: This is recommended way to parse a file.
parse_file_as_script
Note: This is recommended way to parse a file.
with_file_parser

Type Aliases§

PResult
When error occurs, error is emitted and parser returns Err(()).