From c33d580a2a4881a6020becdbe1f16c8482ff1a28 Mon Sep 17 00:00:00 2001 From: SasinduDilshara Date: Tue, 6 Jun 2023 14:28:02 +0530 Subject: [PATCH 1/3] Fix NPE in regex parser with single quantifiers --- .../internal/parser/RegExpParser.java | 4 +- .../regexp_constructor_assert_03.json | 4 ++ .../regexp_constructor_assert_04.json | 4 ++ .../regexp_constructor_assert_19.json | 4 ++ .../regexp_constructor_assert_36.json | 4 ++ .../regexp_constructor_assert_37.json | 4 ++ .../raw-template/assert/regex_expressions.bal | 39 +++++++++++++++++++ .../raw-template/source/regex_expressions.bal | 39 +++++++++++++++++++ 8 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal create mode 100644 misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java index b3375f2b555d..3557b4b65216 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java @@ -504,8 +504,8 @@ private STNode parseBaseQuantifier() { openBrace = invalidateNonDigitNodesAndAddToTrailingMinutiae(openBrace, true); } STNode leastDigits = parseDigits(true); - STNode comma = null; - STNode mostDigits = null; + STNode comma = STNodeFactory.createEmptyNode();; + STNode mostDigits = STNodeFactory.createEmptyNodeList(); nextToken = peek(); if (nextToken.kind == SyntaxKind.COMMA_TOKEN) { comma = consume(); diff --git a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_03.json b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_03.json index 5e2cbb958c84..fb86568adbe7 100644 --- a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_03.json +++ b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_03.json @@ -462,6 +462,10 @@ } ] }, + { + "kind": "LIST", + "children": [] + }, { "kind": "CLOSE_BRACE_TOKEN" } diff --git a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_04.json b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_04.json index ed89c9beb0a0..4b501bb75962 100644 --- a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_04.json +++ b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_04.json @@ -471,6 +471,10 @@ } ] }, + { + "kind": "LIST", + "children": [] + }, { "kind": "CLOSE_BRACE_TOKEN" } diff --git a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_19.json b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_19.json index e2a7c1b5f068..0243e0f6f835 100644 --- a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_19.json +++ b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_19.json @@ -693,6 +693,10 @@ } ] }, + { + "kind": "LIST", + "children": [] + }, { "kind": "CLOSE_BRACE_TOKEN" } diff --git a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_36.json b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_36.json index d820105ec1fe..de9d2c85af26 100644 --- a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_36.json +++ b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_36.json @@ -145,6 +145,10 @@ } ] }, + { + "kind": "LIST", + "children": [] + }, { "kind": "CLOSE_BRACE_TOKEN" } diff --git a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_37.json b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_37.json index 1eaadb05ca27..7abdeb21484a 100644 --- a/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_37.json +++ b/compiler/ballerina-parser/src/test/resources/expressions/regexp-constructor-expr/regexp_constructor_assert_37.json @@ -145,6 +145,10 @@ } ] }, + { + "kind": "LIST", + "children": [] + }, { "kind": "CLOSE_BRACE_TOKEN" } diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal new file mode 100644 index 000000000000..cf91eae31af4 --- /dev/null +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal @@ -0,0 +1,39 @@ +import ballerina/constraint; + +@constraint:String {pattern: re `[A-Z]{1}`} +public type FlightClass string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3}`} +public type Code string; + +@constraint:String {pattern: re `[A-Z]{1,3}`} +public type FlightClass2 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,5}`} +public type Code2 string; + +@constraint:String {pattern: re `[A-Z]{1,}`} +public type FlightClass3 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} +public type Code3 string; + +@constraint:String {pattern: re `[A-Z]{1,}`} +public type FlightClass4 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} +public type Code4 string; + +public function main() { + Code code = "A380"; + FlightClass flightclass = "A"; + + Code2 code2 = "A380"; + FlightClass2 flightclass2 = "A"; + + Code3 code3 = "A380"; + FlightClass3 flightclass3 = "A"; + + Code4 code4 = "A380"; + FlightClass4 flightclass4 = "A"; +} diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal new file mode 100644 index 000000000000..cf91eae31af4 --- /dev/null +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal @@ -0,0 +1,39 @@ +import ballerina/constraint; + +@constraint:String {pattern: re `[A-Z]{1}`} +public type FlightClass string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3}`} +public type Code string; + +@constraint:String {pattern: re `[A-Z]{1,3}`} +public type FlightClass2 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,5}`} +public type Code2 string; + +@constraint:String {pattern: re `[A-Z]{1,}`} +public type FlightClass3 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} +public type Code3 string; + +@constraint:String {pattern: re `[A-Z]{1,}`} +public type FlightClass4 string; + +@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} +public type Code4 string; + +public function main() { + Code code = "A380"; + FlightClass flightclass = "A"; + + Code2 code2 = "A380"; + FlightClass2 flightclass2 = "A"; + + Code3 code3 = "A380"; + FlightClass3 flightclass3 = "A"; + + Code4 code4 = "A380"; + FlightClass4 flightclass4 = "A"; +} From 4344c7685cfadd52b675c1d448226b6453c05c14 Mon Sep 17 00:00:00 2001 From: SasinduDilshara Date: Wed, 7 Jun 2023 16:31:45 +0530 Subject: [PATCH 2/3] Add regex format test without using constraints --- .../raw-template/assert/regex_expressions.bal | 16 ++++++-------- .../raw-template/source/regex_expressions.bal | 22 +++++++++---------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal index cf91eae31af4..d0a7bc6e5c95 100644 --- a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal @@ -18,13 +18,7 @@ public type FlightClass3 string; @constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} public type Code3 string; -@constraint:String {pattern: re `[A-Z]{1,}`} -public type FlightClass4 string; - -@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} -public type Code4 string; - -public function main() { +public function test1() { Code code = "A380"; FlightClass flightclass = "A"; @@ -33,7 +27,11 @@ public function main() { Code3 code3 = "A380"; FlightClass3 flightclass3 = "A"; +} - Code4 code4 = "A380"; - FlightClass4 flightclass4 = "A"; +public function test2() { + string:RegExp _ = re `[A-Z]{1}`; + string:RegExp _ = re `[A-Z]{1,2}`; + string:RegExp _ = re `[A-Z]{1,}`; + string:RegExp _ = re `[A-Z]{1}`; } diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal index cf91eae31af4..a08ad49bab0a 100644 --- a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal @@ -18,22 +18,20 @@ public type FlightClass3 string; @constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} public type Code3 string; -@constraint:String {pattern: re `[A-Z]{1,}`} -public type FlightClass4 string; - -@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} -public type Code4 string; - -public function main() { +public function test1() { Code code = "A380"; - FlightClass flightclass = "A"; + FlightClass flightclass="A"; Code2 code2 = "A380"; - FlightClass2 flightclass2 = "A"; + FlightClass2 flightclass2= "A"; Code3 code3 = "A380"; - FlightClass3 flightclass3 = "A"; + FlightClass3 flightclass3 ="A"; +} - Code4 code4 = "A380"; - FlightClass4 flightclass4 = "A"; +public function test2() { + string:RegExp _=re `[A-Z]{1}`; + string:RegExp _=re `[A-Z]{1,2}`; + string:RegExp _=re `[A-Z]{1,}`; + string:RegExp _= re `[A-Z]{1}`; } From 3515654c6a0d48684a10b580ce9575b6d31f9e6d Mon Sep 17 00:00:00 2001 From: SasinduDilshara Date: Tue, 13 Jun 2023 14:44:44 +0530 Subject: [PATCH 3/3] Remove formatter tests that use stdlibs --- .../raw-template/assert/regex_expressions.bal | 49 ++++++++++--------- .../raw-template/source/regex_expressions.bal | 49 ++++++++++--------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal index d0a7bc6e5c95..fcba34d7bdf4 100644 --- a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/assert/regex_expressions.bal @@ -1,37 +1,38 @@ -import ballerina/constraint; +type AnnotRec record {| + string:RegExp value; +|}; -@constraint:String {pattern: re `[A-Z]{1}`} -public type FlightClass string; +annotation AnnotRec annot on type; -@constraint:String {pattern: re `[a-zA-Z0-9]{3}`} -public type Code string; - -@constraint:String {pattern: re `[A-Z]{1,3}`} -public type FlightClass2 string; - -@constraint:String {pattern: re `[a-zA-Z0-9]{3,5}`} -public type Code2 string; +@annot { + value: re `abc{1}` +} +type Foo record { + string name; +}; -@constraint:String {pattern: re `[A-Z]{1,}`} -public type FlightClass3 string; +@annot { + value: re `abc{1,}` +} +type Foo2 record { + string name; +}; -@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} -public type Code3 string; +@annot { + value: re `abc{1,2}` +} +type Foo3 record { + string name; +}; public function test1() { - Code code = "A380"; - FlightClass flightclass = "A"; - - Code2 code2 = "A380"; - FlightClass2 flightclass2 = "A"; - - Code3 code3 = "A380"; - FlightClass3 flightclass3 = "A"; + Foo _ = {name: "abc"}; + Foo2 _ = {name: "abc"}; + Foo3 _ = {name: "abc"}; } public function test2() { string:RegExp _ = re `[A-Z]{1}`; string:RegExp _ = re `[A-Z]{1,2}`; string:RegExp _ = re `[A-Z]{1,}`; - string:RegExp _ = re `[A-Z]{1}`; } diff --git a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal index a08ad49bab0a..b1282481d7c1 100644 --- a/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal +++ b/misc/formatter/modules/formatter-core/src/test/resources/expressions/raw-template/source/regex_expressions.bal @@ -1,37 +1,38 @@ -import ballerina/constraint; +type AnnotRec record {| + string:RegExp value; +|}; -@constraint:String {pattern: re `[A-Z]{1}`} -public type FlightClass string; +annotation AnnotRec annot on type; -@constraint:String {pattern: re `[a-zA-Z0-9]{3}`} -public type Code string; - -@constraint:String {pattern: re `[A-Z]{1,3}`} -public type FlightClass2 string; - -@constraint:String {pattern: re `[a-zA-Z0-9]{3,5}`} -public type Code2 string; +@annot { + value: re `abc{1}` +} +type Foo record { + string name; +}; -@constraint:String {pattern: re `[A-Z]{1,}`} -public type FlightClass3 string; +@annot { + value: re `abc{1,}` +} +type Foo2 record { + string name; +}; -@constraint:String {pattern: re `[a-zA-Z0-9]{3,}`} -public type Code3 string; +@annot { + value: re `abc{1,2}` +} +type Foo3 record { + string name; +}; public function test1() { - Code code = "A380"; - FlightClass flightclass="A"; - - Code2 code2 = "A380"; - FlightClass2 flightclass2= "A"; - - Code3 code3 = "A380"; - FlightClass3 flightclass3 ="A"; + Foo _={name: "abc"}; + Foo2 _={name: "abc"}; + Foo3 _={name: "abc"}; } public function test2() { string:RegExp _=re `[A-Z]{1}`; string:RegExp _=re `[A-Z]{1,2}`; string:RegExp _=re `[A-Z]{1,}`; - string:RegExp _= re `[A-Z]{1}`; }