feat(css): Recover from invalid properties (#2312)

swc_css_ast:
 - Add `DeclBlockItem`.
 - Change `DeclBlock.properties` to `DeclBlock.items`.

swc_css_parser:
 - Add a way to recovered errors.
This commit is contained in:
Donny/강동윤 2021-09-28 18:58:56 +09:00 committed by GitHub
parent e8a1710a21
commit b206404d94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
348 changed files with 614 additions and 459 deletions

14
Cargo.lock generated
View File

@ -2477,7 +2477,7 @@ dependencies = [
[[package]]
name = "swc_css"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"swc_css_ast",
"swc_css_codegen",
@ -2488,7 +2488,7 @@ dependencies = [
[[package]]
name = "swc_css_ast"
version = "0.6.0"
version = "0.7.0"
dependencies = [
"is-macro",
"serde",
@ -2499,7 +2499,7 @@ dependencies = [
[[package]]
name = "swc_css_codegen"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"auto_impl",
"bitflags",
@ -2525,7 +2525,7 @@ dependencies = [
[[package]]
name = "swc_css_parser"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"bitflags",
"lexical",
@ -2541,7 +2541,7 @@ dependencies = [
[[package]]
name = "swc_css_utils"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"swc_atoms 0.2.7",
"swc_common",
@ -2551,7 +2551,7 @@ dependencies = [
[[package]]
name = "swc_css_visit"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"swc_atoms 0.2.7",
"swc_common",
@ -3116,7 +3116,7 @@ dependencies = [
[[package]]
name = "swc_stylis"
version = "0.4.0"
version = "0.5.0"
dependencies = [
"swc_atoms 0.2.7",
"swc_common",

View File

@ -6,11 +6,11 @@ edition = "2018"
license = "Apache-2.0/MIT"
name = "swc_css"
repository = "https://github.com/swc-project/swc.git"
version = "0.7.0"
version = "0.8.0"
[dependencies]
swc_css_ast = {version = "0.6.0", path = "./ast"}
swc_css_codegen = {version = "0.5.0", path = "./codegen"}
swc_css_parser = {version = "0.7.0", path = "./parser"}
swc_css_utils = {version = "0.3.0", path = "./utils/"}
swc_css_visit = {version = "0.5.0", path = "./visit"}
swc_css_ast = {version = "0.7.0", path = "./ast"}
swc_css_codegen = {version = "0.6.0", path = "./codegen"}
swc_css_parser = {version = "0.8.0", path = "./parser"}
swc_css_utils = {version = "0.4.0", path = "./utils/"}
swc_css_visit = {version = "0.6.0", path = "./visit"}

View File

@ -6,7 +6,7 @@ edition = "2018"
license = "Apache-2.0/MIT"
name = "swc_css_ast"
repository = "https://github.com/swc-project/swc.git"
version = "0.6.0"
version = "0.7.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

View File

@ -1,4 +1,4 @@
use crate::{ComplexSelector, Property};
use crate::{ComplexSelector, Property, Tokens};
use swc_common::{ast_node, Span};
#[ast_node("StyleRule")]
@ -11,5 +11,13 @@ pub struct StyleRule {
#[ast_node("DeclBlock")]
pub struct DeclBlock {
pub span: Span,
pub properties: Vec<Property>,
pub items: Vec<DeclBlockItem>,
}
#[ast_node]
pub enum DeclBlockItem {
#[tag("Tokens")]
Invalid(Tokens),
#[tag("Property")]
Property(Property),
}

View File

@ -6,17 +6,17 @@ edition = "2018"
license = "Apache-2.0/MIT"
name = "swc_css_codegen"
repository = "https://github.com/swc-project/swc.git"
version = "0.5.0"
version = "0.6.0"
[dependencies]
auto_impl = "0.4.1"
bitflags = "1.3.2"
swc_atoms = {version = "0.2.7", path = "../../atoms"}
swc_common = {version = "0.13.0", path = "../../common"}
swc_css_ast = {version = "0.6.0", path = "../ast/"}
swc_css_ast = {version = "0.7.0", path = "../ast/"}
swc_css_codegen_macros = {version = "0.2.0", path = "macros/"}
[dev-dependencies]
swc_css_parser = {version = "0.7.0", path = "../parser"}
swc_css_visit = {version = "0.5.0", path = "../visit"}
swc_css_parser = {version = "0.8.0", path = "../parser"}
swc_css_visit = {version = "0.6.0", path = "../visit"}
testing = {version = "0.14.0", path = "../../testing"}

View File

@ -320,14 +320,19 @@ where
fn emit_decl_block(&mut self, n: &DeclBlock) -> Result {
punct!(self, "{");
self.emit_list(
&n.properties,
ListFormat::SemiDelimited | ListFormat::MultiLine,
)?;
self.emit_list(&n.items, ListFormat::SemiDelimited | ListFormat::MultiLine)?;
punct!(self, "}");
}
#[emitter]
fn emit_decl_block_item(&mut self, n: &DeclBlockItem) -> Result {
match n {
DeclBlockItem::Invalid(n) => emit!(self, n),
DeclBlockItem::Property(n) => emit!(self, n),
}
}
#[emitter]
fn emit_property(&mut self, n: &Property) -> Result {
emit!(self, n.name);

View File

@ -1,4 +1,4 @@
use std::path::PathBuf;
use std::{mem::take, path::PathBuf};
use swc_common::{FileName, Span};
use swc_css_ast::Stylesheet;
use swc_css_codegen::{
@ -18,8 +18,13 @@ fn parse_again(input: PathBuf) {
eprintln!("==== ==== Input ==== ====\n{}\n", fm.src);
let mut errors = vec![];
let mut stylesheet: Stylesheet =
parse_file(&fm, ParserConfig { parse_values: true }).unwrap();
parse_file(&fm, ParserConfig { parse_values: true }, &mut errors).unwrap();
for err in take(&mut errors) {
err.to_diagnostics(&handler).emit();
}
let mut css_str = String::new();
{
@ -32,10 +37,16 @@ fn parse_again(input: PathBuf) {
eprintln!("==== ==== Codegen ==== ====\n{}\n", css_str);
let new_fm = cm.new_source_file(FileName::Anon, css_str);
let mut parsed: Stylesheet = parse_file(&new_fm, ParserConfig { parse_values: true })
.map_err(|err| {
err.to_diagnostics(&handler).emit();
})?;
let mut parsed: Stylesheet =
parse_file(&new_fm, ParserConfig { parse_values: true }, &mut errors).map_err(
|err| {
err.to_diagnostics(&handler).emit();
},
)?;
for err in errors {
err.to_diagnostics(&handler).emit();
}
stylesheet.visit_mut_with(&mut DropSpan);
parsed.visit_mut_with(&mut DropSpan);

View File

@ -6,7 +6,7 @@ edition = "2018"
license = "Apache-2.0/MIT"
name = "swc_css_parser"
repository = "https://github.com/swc-project/swc.git"
version = "0.7.0"
version = "0.8.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
@ -17,11 +17,11 @@ bitflags = "1.2.1"
lexical = "5.2.2"
swc_atoms = {version = "0.2.7", path = "../../atoms"}
swc_common = {version = "0.13.0", path = "../../common"}
swc_css_ast = {version = "0.6.0", path = "../ast"}
swc_css_ast = {version = "0.7.0", path = "../ast"}
unicode-xid = "0.2.2"
[dev-dependencies]
serde = "1.0.127"
serde_json = "1.0.66"
swc_css_visit = {version = "0.5.0", path = "../visit"}
swc_css_visit = {version = "0.6.0", path = "../visit"}
testing = {version = "0.14.0", path = "../../testing"}

View File

@ -1,7 +1,10 @@
#![deny(unused_must_use)]
use lexer::Lexer;
use parser::{input::TokensInput, PResult, Parser, ParserConfig};
use crate::{
error::Error,
lexer::Lexer,
parser::{input::TokensInput, PResult, Parser, ParserConfig},
};
use swc_common::{input::StringInput, BytePos, SourceFile};
use swc_css_ast::Tokens;
@ -27,11 +30,15 @@ where
}
/// Parse a given string as `T`.
///
/// If there are syntax errors but if it was recoverable, it will be appendend
/// to `errors`.
pub fn parse_str<'a, T>(
src: &'a str,
start_pos: BytePos,
end_pos: BytePos,
config: ParserConfig,
errors: &mut Vec<Error>,
) -> PResult<T>
where
Parser<Lexer<StringInput<'a>>>: Parse<T>,
@ -39,27 +46,47 @@ where
let lexer = Lexer::new(StringInput::new(src, start_pos, end_pos));
let mut parser = Parser::new(lexer, config);
parser.parse()
let res = parser.parse();
errors.extend(parser.take_errors());
res
}
/// Parse a given file as `T`.
pub fn parse_file<'a, T>(fm: &'a SourceFile, config: ParserConfig) -> PResult<T>
///
/// If there are syntax errors but if it was recoverable, it will be appendend
/// to `errors`.
pub fn parse_file<'a, T>(
fm: &'a SourceFile,
config: ParserConfig,
errors: &mut Vec<Error>,
) -> PResult<T>
where
Parser<Lexer<StringInput<'a>>>: Parse<T>,
{
let lexer = Lexer::new(StringInput::from(fm));
let mut parser = Parser::new(lexer, config);
parser.parse()
let res = parser.parse();
errors.extend(parser.take_errors());
res
}
/// Parse a given file as `T`.
pub fn parse_tokens<'a, T>(tokens: &'a Tokens, config: ParserConfig) -> PResult<T>
///
/// If there are syntax errors but if it was recoverable, it will be appendend
/// to `errors`.
pub fn parse_tokens<'a, T>(
tokens: &'a Tokens,
config: ParserConfig,
errors: &mut Vec<Error>,
) -> PResult<T>
where
Parser<TokensInput<'a>>: Parse<T>,
{
let lexer = TokensInput::new(tokens);
let mut parser = Parser::new(lexer, config);
parser.parse()
let res = parser.parse();
errors.extend(parser.take_errors());
res
}

View File

@ -1,10 +1,9 @@
use std::mem::take;
use self::input::{Buffer, ParserInput};
use crate::{
error::{Error, ErrorKind},
Parse,
};
use std::mem::take;
use swc_atoms::js_word;
use swc_common::Span;
use swc_css_ast::*;

View File

@ -34,13 +34,29 @@ where
self.input.skip_ws()?;
let properties = self.parse_properties()?;
let items = self.parse_decl_block_items()?;
expect!(self, "}");
let span = span!(self, start);
Ok(DeclBlock { span, properties })
Ok(DeclBlock { span, items })
}
fn parse_decl_block_items(&mut self) -> PResult<Vec<DeclBlockItem>> {
let mut items = vec![];
while is!(self, Ident) {
items.push(self.parse()?);
if !eat!(self, ";") {
break;
}
self.input.skip_ws()?;
}
Ok(items)
}
pub(crate) fn parse_properties(&mut self) -> PResult<Vec<Property>> {
@ -140,3 +156,42 @@ where
self.parse_properties()
}
}
impl<I> Parse<Vec<DeclBlockItem>> for Parser<I>
where
I: ParserInput,
{
fn parse(&mut self) -> PResult<Vec<DeclBlockItem>> {
self.parse_decl_block_items()
}
}
impl<I> Parse<DeclBlockItem> for Parser<I>
where
I: ParserInput,
{
fn parse(&mut self) -> PResult<DeclBlockItem> {
let start = self.input.state();
let start_pos = self.input.cur_span()?.lo;
let prop = self.parse().map(DeclBlockItem::Property);
match prop {
Ok(v) => return Ok(v),
Err(err) => {
self.errors.push(err);
}
}
self.input.reset(&start);
let mut tokens = vec![];
while !is_one_of!(self, EOF, ";", "}") {
tokens.extend(self.input.bump()?);
}
Ok(DeclBlockItem::Invalid(Tokens {
span: span!(self, start_pos),
tokens,
}))
}
}

View File

@ -25,9 +25,15 @@ impl Visit for AssertValid {
_ => {}
}
let mut errors = vec![];
let _selectors: Vec<ComplexSelector> =
parse_tokens(&s.args, ParserConfig { parse_values: true })
parse_tokens(&s.args, ParserConfig { parse_values: true }, &mut errors)
.unwrap_or_else(|err| panic!("failed to parse tokens: {:?}\n{:?}", err, s.args));
for err in errors {
panic!("{:?}", err);
}
}
}
@ -35,7 +41,7 @@ impl Visit for AssertValid {
fn tokens_input(input: PathBuf) {
eprintln!("Input: {}", input.display());
testing::run_test2(false, |cm, _handler| {
testing::run_test2(false, |cm, handler| {
let fm = cm.load_file(&input).unwrap();
let tokens = {
@ -52,11 +58,21 @@ fn tokens_input(input: PathBuf) {
}
};
let ss: Stylesheet = parse_tokens(&tokens, ParserConfig { parse_values: true })
.expect("failed to parse tokens");
let mut errors = vec![];
let ss: Stylesheet =
parse_tokens(&tokens, ParserConfig { parse_values: true }, &mut errors)
.expect("failed to parse tokens");
for err in errors {
err.to_diagnostics(&handler).emit();
}
ss.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
if handler.has_errors() {
return Err(());
}
Ok(())
})
.unwrap();
@ -106,10 +122,15 @@ fn pass(input: PathBuf) {
}
}
let mut errors = vec![];
let ss_tok: Stylesheet =
parse_tokens(&tokens, ParserConfig { parse_values: true })
parse_tokens(&tokens, ParserConfig { parse_values: true }, &mut errors)
.expect("failed to parse token");
for err in errors {
err.to_diagnostics(&handler).emit();
}
let json_from_tokens = serde_json::to_string_pretty(&ss_tok)
.map(NormalizedOutput::from)
.expect("failed to serialize stylesheet from tokens");

View File

@ -61,7 +61,7 @@
"end": 20,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -197,7 +197,7 @@
"end": 67,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -62,7 +62,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 45,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -82,7 +82,7 @@
"end": 7,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 20,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -82,7 +82,7 @@
"end": 11,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -62,7 +62,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 7,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -79,7 +79,7 @@
"end": 9,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 59,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -62,7 +62,7 @@
"end": 8,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 20,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -89,7 +89,7 @@
"end": 27,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -47,7 +47,7 @@
"end": 37,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {
@ -104,7 +104,7 @@
"end": 43,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -55,7 +55,7 @@
"end": 37,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 24,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -79,7 +79,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 26,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -47,7 +47,7 @@
"end": 26,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -79,7 +79,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -82,7 +82,7 @@
"end": 14,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 16,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -90,7 +90,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -82,7 +82,7 @@
"end": 14,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -82,7 +82,7 @@
"end": 13,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 18,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -90,7 +90,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -89,7 +89,7 @@
"end": 29,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -83,7 +83,7 @@
"end": 18,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -62,7 +62,7 @@
"end": 11,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -90,7 +90,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 23,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -62,7 +62,7 @@
"end": 7,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -82,7 +82,7 @@
"end": 13,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -47,7 +47,7 @@
"end": 26,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -72,7 +72,7 @@
"end": 40,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {
@ -154,7 +154,7 @@
"end": 65,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 19,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -62,7 +62,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -82,7 +82,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 20,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -47,7 +47,7 @@
"end": 27,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -90,7 +90,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -62,7 +62,7 @@
"end": 32,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -90,7 +90,7 @@
"end": 8,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 22,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -74,7 +74,7 @@
"end": 7,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 20,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 23,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 21,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 15,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -61,7 +61,7 @@
"end": 16,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -72,7 +72,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -82,7 +82,7 @@
"end": 14,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 17,
"ctxt": 0
},
"properties": [
"items": [
{
"type": "Property",
"span": {

View File

@ -74,7 +74,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -61,7 +61,7 @@
"end": 6,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -79,7 +79,7 @@
"end": 10,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

View File

@ -74,7 +74,7 @@
"end": 11,
"ctxt": 0
},
"properties": []
"items": []
}
}
]

Some files were not shown because too many files have changed in this diff Show More