mirror of
https://github.com/swc-project/swc.git
synced 2024-11-24 02:06:08 +03:00
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:
parent
e8a1710a21
commit
b206404d94
14
Cargo.lock
generated
14
Cargo.lock
generated
@ -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",
|
||||
|
@ -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"}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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),
|
||||
}
|
||||
|
@ -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"}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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"}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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::*;
|
||||
|
@ -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,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 20,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -197,7 +197,7 @@
|
||||
"end": 67,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 45,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 7,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 20,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 11,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 7,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -79,7 +79,7 @@
|
||||
"end": 9,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 59,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 8,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 20,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -89,7 +89,7 @@
|
||||
"end": 27,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -47,7 +47,7 @@
|
||||
"end": 37,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
@ -104,7 +104,7 @@
|
||||
"end": 43,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -55,7 +55,7 @@
|
||||
"end": 37,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 24,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -79,7 +79,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 26,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -47,7 +47,7 @@
|
||||
"end": 26,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -79,7 +79,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 14,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 16,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -90,7 +90,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 14,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 13,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -90,7 +90,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -89,7 +89,7 @@
|
||||
"end": 29,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -83,7 +83,7 @@
|
||||
"end": 18,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 11,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -90,7 +90,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 23,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 7,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 13,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -47,7 +47,7 @@
|
||||
"end": 26,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -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": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 19,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 20,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -47,7 +47,7 @@
|
||||
"end": 27,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -90,7 +90,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -62,7 +62,7 @@
|
||||
"end": 32,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -90,7 +90,7 @@
|
||||
"end": 8,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 22,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -74,7 +74,7 @@
|
||||
"end": 7,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 20,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 23,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 21,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 15,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 16,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -72,7 +72,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -82,7 +82,7 @@
|
||||
"end": 14,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 17,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": [
|
||||
"items": [
|
||||
{
|
||||
"type": "Property",
|
||||
"span": {
|
||||
|
@ -74,7 +74,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -61,7 +61,7 @@
|
||||
"end": 6,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -79,7 +79,7 @@
|
||||
"end": 10,
|
||||
"ctxt": 0
|
||||
},
|
||||
"properties": []
|
||||
"items": []
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user