diff --git a/duper/src/parser/mod.rs b/duper/src/parser/mod.rs --- a/duper/src/parser/mod.rs +++ b/duper/src/parser/mod.rs @@ -714,6 +714,10 @@ let duper = DuperParser::parse_duper_value(input).unwrap(); assert!(matches!(duper, DuperValue::String { .. })); + let input = r#""//""#; + let duper = DuperParser::parse_duper_value(input).unwrap(); + assert!(matches!(duper, DuperValue::String { .. })); + let input = r#" b"\x1b\t\x00" "#; @@ -1312,7 +1316,15 @@ "#; assert!(DuperParser::parse_duper_value(input).is_err()); let input = r#" + [1,,2] + "#; + assert!(DuperParser::parse_duper_value(input).is_err()); + let input = r#" (,,) + "#; + assert!(DuperParser::parse_duper_value(input).is_err()); + let input = r#" + (1,,2) "#; assert!(DuperParser::parse_duper_value(input).is_err()); diff --git a/tree-sitter-duper/test/corpus/arrays.txt b/tree-sitter-duper/test/corpus/arrays.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/arrays.txt @@ -0,0 +1,28 @@ +================== +Empty +================== + +[] + +--- + +(duper_value + (array)) + +================== +Mixed values array +================== + +[1, 2.2, []] + +--- + +(duper_value + (array + (duper_value + (integer + (decimal_integer))) + (duper_value + (float)) + (duper_value + (array)))) diff --git a/tree-sitter-duper/test/corpus/bytes.txt b/tree-sitter-duper/test/corpus/bytes.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/bytes.txt @@ -0,0 +1,40 @@ +================== +Quoted bytes +================== + +b"\x1b\t\x00" + +--- + +(duper_value + (bytes + (quoted_bytes + (quoted_content)))) + +================== +Raw bytes +================== + +br"¯\_(ツ)_/¯" + +--- + +(duper_value + (bytes + (raw_bytes + (raw_start) + (raw_content) + (raw_end)))) + +================== +Base64 bytes +================== + +b64"RHVwZXI" + +--- + +(duper_value + (bytes + (base64_bytes + (base64_content)))) diff --git a/tree-sitter-duper/test/corpus/comments.txt b/tree-sitter-duper/test/corpus/comments.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/comments.txt @@ -0,0 +1,30 @@ +================== +Line comment before +================== + +// Line comment +12_000 + +--- + +(duper_value + (line_comment) + (integer + (decimal_integer))) + +================== +Block comment after +================== + +"foo" +/* + Block comment +*/ + +--- + +(duper_value + (string + (quoted_string + (quoted_content))) + (block_comment)) \ No newline at end of file diff --git a/tree-sitter-duper/test/corpus/errors.txt b/tree-sitter-duper/test/corpus/errors.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/errors.txt @@ -0,0 +1,893 @@ +================== +Line comment +:error +================== + +// Only a line comment + +--- + +================== +Block comment +:error +================== + +/* + Only a multiline comment +*/ + +--- + +================== +Unclosed string +:error +================== + +"unclosed + +--- + +================== +Unopened string +:error +================== + +unopened" + +--- + +================== +Unclosed bytes +:error +================== + +b"unclosed bytes + +--- + +================== +Unclosed raw string +:error +================== + +r"unclosed raw + +--- + +================== +Unclosed raw bytes +:error +================== + +br"unclosed raw bytes + +--- + +================== +Unknown escape sequence +:error +================== + +"\e" + +--- + +================== +Padding character in incorrect position +:error +================== + +b64"RHV=wZXI" + +--- + +================== +Invalid character +:error +================== + +b64"ABC-" + +--- + +================== +Plus sign +:error +================== + ++ + +--- + +================== +Minus sign +:error +================== + +- + +--- + +================== +No trailing zero +:error +================== + +01 + +--- + +================== +Lone underscore +:error +================== + +_ + +--- + +================== +Underscore at start +:error +================== + +_12 + +--- + +================== +Underscore at end +:error +================== + +12_ + +--- + +================== +Double underscore +:error +================== + +1__2 + +--- + +================== +Invalid character in integer +:error +================== + +12f + +--- + +================== +Missing decimal +:error +================== + +12. + +--- + +================== +Missing exponent +:error +================== + +12e + +--- + +================== +Missing exponent with plus sign +:error +================== + +12e+ + +--- + +================== +Missing exponent with minus sign +:error +================== + +12e- + +--- + +================== +Too many fractionals +:error +================== + +12.34.56 + +--- + +================== +Too many exponents +:error +================== + +12e34e56 + +--- + +================== +Invalid exponent character +:error +================== + +12.3a4 + +--- + +================== +Missing integer part before exponent +:error +================== + +e10 + +--- + +================== +Lone dot +:error +================== + +. + +--- + +================== +Missing integer part before negative fractional part +:error +================== + +-.5 + +--- + +================== +Missing integer part before positive fractional part +:error +================== + ++.5 + +--- + +================== +Underscore before fractional dot +:error +================== + +_.123 + +--- + +================== +Underscore after fractional dot +:error +================== + +12._34 + +--- + +================== +Underscore after exponent character +:error +================== + +12e_34 + +--- + +================== +Underscore after exponent sign +:error +================== + +12e+_34 + +--- + +================== +Double underscore in integer part +:error +================== + +1__2.34 + +--- + +================== +Double underscore in fractional part +:error +================== + +12.3__4 + +--- + +================== +Double underscore in exponent +:error +================== + +12e3__4 + +--- + +================== +Underscore after fractional part +:error +================== + +12.34_ + +--- + +================== +Underscore after exponent +:error +================== + +12e34_ + +--- + +================== +Missing exponent +:error +================== + +12e + +--- + +================== +Swapped fractional part and exponent +:error +================== + +12e3.4 + +--- + +================== +Missing hexadecimal integer +:error +================== + +0x + +--- + +================== +Invalid hexadecimal digit +:error +================== + +0xg + +--- + +================== +Lone underscore in hexadecimal integer +:error +================== + +0x_ + +--- + +================== +Underscore after hexadecimal integer +:error +================== + +0x1_ + +--- + +================== +Underscore before hexadecimal integer +:error +================== + +0x_1 + +--- + +================== +Fraction in hexadecimal integer +:error +================== + +0x1.2 + +--- + +================== +Sign inside hexadecimal integer +:error +================== + +0x-1 + +--- + +================== +Sign outside hexadecimal integer +:error +================== + +-0x1 + +--- + +================== +Missing octal integer +:error +================== + +0o + +--- + +================== +Invalid octal digit +:error +================== + +0o8 + +--- + +================== +Lone underscore in octal integer +:error +================== + +0o_ + +--- + +================== +Underscore after octal integer +:error +================== + +0o1_ + +--- + +================== +Underscore before octal integer +:error +================== + +0o_1 + +--- + +================== +Fraction in octal integer +:error +================== + +0o1.2 + +--- + +================== +Sign inside octal integer +:error +================== + +0o-1 + +--- + +================== +Sign outside octal integer +:error +================== + +-0o1 + +--- + + +================== +Missing binary integer +:error +================== + +0b + +--- + +================== +Invalid binary digit +:error +================== + +0b2 + +--- + +================== +Lone underscore in binary integer +:error +================== + +0b_ + +--- + +================== +Underscore after binary integer +:error +================== + +0b1_ + +--- + +================== +Underscore before binary integer +:error +================== + +0b_1 + +--- + +================== +Fraction in binary integer +:error +================== + +0b1.1 + +--- + +================== +Sign inside binary integer +:error +================== + +0b-1 + +--- + +================== +Sign outside binary integer +:error +================== + +-0b1 + +--- + +================== +Comma in empty object +:error +================== + +{,} + +--- + +================== +Double comma in empty object +:error +================== + +{,,} + +--- + +================== +Starting digit in plain key +:error +================== + +{1a: ""} + +--- + +================== +Starting hyphen in plain key +:error +================== + +{-a: ""} + +--- + +================== +Ending hyphen in plain key +:error +================== + +{a-: ""} + +--- + +================== +Ending underscore in plain key +:error +================== + +{a_: ""} + +--- + +================== +Consecutive hyphens in plain key +:error +================== + +{a--b: ""} + +--- + +================== +Consecutive underscores in plain key +:error +================== + +{a__b: ""} + +--- + +================== +Underscore followed by hyphen in plain key +:error +================== + +{a_-b: ""} + +--- + +================== +Hyphen followed by underscore in plain key +:error +================== + +{a-_b: ""} + +--- + +================== +Starting underscore followed by hyphen in plain key +:error +================== + +{_-a: ""} + +--- + +================== +Starting double underscored in plain key +:error +================== + +{__a: "no starting double underscore in key"} + +--- + +================== +Single underscore plain key +:error +================== + +{_: ""} + +--- + +================== +Byte string value as key +:error +================== + +{b"value as key": null} + +--- + +================== +Missing colon +:error +================== + +{"missing" "colon"} + +--- + +================== +Missing value +:error +================== + +{"missing_value"} + +--- + +================== +Double comma in empty array +:error +================== + +[,,] + +--- + +================== +Double comma in non-empty array +:error +================== + +[1,,2] + +--- + +================== +Double comma in empty tuple +:error +================== + +(,,) + +--- + +================== +Double comma in non-empty tuple +:error +================== + +(1,,2) + +--- + +================== +Unicode characters in identifier +:error +================== + +NoÜnicodeÇharacters({}) + +--- + +================== +Starting number in identifier +:error +================== + +1NoStartingNumber({}) + +--- + +================== +Starting lowercase in identifier +:error +================== + +noStartingLowercase({}) + +--- + +================== +Space in identifier +:error +================== + +No Space({}) + +--- + +================== +Starting hyphen in identifier +:error +================== + +-NoStartingHyphen({}) + +--- + +================== +Starting underscore in identifier +:error +================== + +_NoStartingUnderscore({}) + +--- + +================== +Ending hyphen in identifier +:error +================== + +NoEndingHyphen-({}) + +--- + +================== +Ending underscore in identifier +:error +================== + +NoEndingUnderscore_({}) + +--- + +================== +Hyphen then underscore in identifier +:error +================== + +No-_HyphenThenUnderscore({}) + +--- + +================== +Underscore then hyphen in identifier +:error +================== + +No_-UnderscoreThenHyphen({}) + +--- + +================== +Brackets for identifier +:error +================== + +NoParenthesis[] + +--- + +================== +Identifier without value +:error +================== + +NoValue() + +--- + +================== +Comma after value +:error +================== + +null, + +--- + +================== +Comma before value +:error +================== + +,null + +--- + +================== +Comma between values +:error +================== + +true,false + +--- diff --git a/tree-sitter-duper/test/corpus/floats.txt b/tree-sitter-duper/test/corpus/floats.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/floats.txt @@ -0,0 +1,32 @@ +================== +Only decimal +================== + +3.14 + +--- + +(duper_value + (float)) + +================== +Only exponent +================== + +12e-10 + +--- + +(duper_value + (float)) + +================== +Underscore separators +================== + +1_2.3_4E5_6 + +--- + +(duper_value + (float)) \ No newline at end of file diff --git a/tree-sitter-duper/test/corpus/integers.txt b/tree-sitter-duper/test/corpus/integers.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/integers.txt @@ -0,0 +1,48 @@ +================== +Decimal +================== + ++9001 + +--- + +(duper_value + (integer + (decimal_integer))) + + +================== +Hexadecimal +================== + +0x2001 + +--- + +(duper_value + (integer + (hex_integer))) + +================== +Octal +================== + +0o755 + +--- + +(duper_value + (integer + (octal_integer))) + +================== +Binary +================== + +0b0101_0101 + +--- + +(duper_value + (integer + (binary_integer))) diff --git a/tree-sitter-duper/test/corpus/keywords.txt b/tree-sitter-duper/test/corpus/keywords.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/keywords.txt @@ -0,0 +1,32 @@ +================== +True +================== + +true + +--- + +(duper_value + (boolean)) + +================== +False +================== + +false + +--- + +(duper_value + (boolean)) + +================== +Null value +================== + +null + +--- + +(duper_value + (null)) diff --git a/tree-sitter-duper/test/corpus/objects.txt b/tree-sitter-duper/test/corpus/objects.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/objects.txt @@ -0,0 +1,118 @@ +================== +Compact with Temporal +================== + +{id:"5",http:Instant('2000-11-01T00:00:00-03:00')} + +--- + +(duper_value + (object + (object_entry + (object_key + (plain_key)) + (duper_value + (string + (quoted_string + (quoted_content))))) + (object_entry + (object_key + (plain_key)) + (duper_value + (identified_value + (identifier) + (temporal + (temporal_content))))))) + +================== +Weird formatting +================== + +{duper: 1337, _123: b"bar", _a-b_c + : + true, "_": false, "": null} + +--- + +(duper_value + (object + (object_entry + (object_key + (plain_key)) + (duper_value + (integer + (decimal_integer)))) + (object_entry + (object_key + (plain_key)) + (duper_value + (bytes + (quoted_bytes + (quoted_content))))) + (object_entry + (object_key + (plain_key)) + (duper_value + (boolean))) + (object_entry + (object_key + (quoted_string + (quoted_content))) + (duper_value + (boolean))) + (object_entry + (object_key + (quoted_string + (quoted_content))) + (duper_value + (null))))) + +================== +Commented entries +================== + +{ + name: "constant.other.temporal.duper", + begin: Regex("'"), + end: Regex("'"), + // patterns: [ + // { + // match: Regex("."), + // }, + // ], +} + +--- + +(duper_value + (object + (object_entry + (object_key + (plain_key)) + (duper_value + (string + (quoted_string + (quoted_content))))) + (object_entry + (object_key + (plain_key)) + (duper_value + (identified_value + (identifier) + (string + (quoted_string + (quoted_content)))))) + (object_entry + (object_key + (plain_key)) + (duper_value + (identified_value + (identifier) + (string + (quoted_string + (quoted_content)))))) + (line_comment) + (line_comment) + (line_comment) + (line_comment) + (line_comment))) diff --git a/tree-sitter-duper/test/corpus/strings.txt b/tree-sitter-duper/test/corpus/strings.txt --- a/tree-sitter-duper/test/corpus/strings.txt +++ b/tree-sitter-duper/test/corpus/strings.txt @@ -1,4 +1,33 @@ ================== +Basic string +================== + +"hello" + +--- + +(duper_value + (string + (quoted_string + (quoted_content)))) + +================== +Raw string +================== + +r"I am +powerful" + +--- + +(duper_value + (string + (raw_string + (raw_start) + (raw_content) + (raw_end)))) + +================== Two slashes in string ================== diff --git a/tree-sitter-duper/test/corpus/temporal.txt b/tree-sitter-duper/test/corpus/temporal.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/temporal.txt @@ -0,0 +1,39 @@ +================== +Full extension +================== + +ZonedDateTime('2022-02-28T11:06:00.092121729+08:00[Asia/Shanghai][u-ca=chinese]') + +--- + +(duper_value + (identified_value + (identifier) + (temporal + (temporal_content)))) + +================== +Whitespace padding +================== + +' 2022-02-28T03:06:00.092121729+02:00 ' + +--- + +(duper_value + (temporal + (temporal_content))) + +================== +Unknown identifier +================== + +UnknownIdent('--11-03') + +--- + +(duper_value + (identified_value + (identifier) + (temporal + (temporal_content)))) diff --git a/tree-sitter-duper/test/corpus/tuples.txt b/tree-sitter-duper/test/corpus/tuples.txt new file mode 100644 --- /dev/null +++ b/tree-sitter-duper/test/corpus/tuples.txt @@ -0,0 +1,37 @@ +================== +Empty tuple +================== + +( +) + +--- + +(duper_value + (tuple)) + +================== +Empty tuple with comma +================== + +(,) + +--- + +(duper_value + (tuple)) + +================== +Nested tuples with identifier +================== + +Hi((())) + +--- + +(duper_value + (identified_value + (identifier) + (tuple + (duper_value + (tuple))))) \ No newline at end of file