From c7fce0a736a35b69f1223cd799c092e5ca907c3d Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 11 Dec 2024 22:27:38 -0500 Subject: [PATCH 1/5] SIP-64 Givens with colon --- grammar.js | 5 ++++- test/corpus/definitions.txt | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/grammar.js b/grammar.js index f30d2b9..de27622 100644 --- a/grammar.js +++ b/grammar.js @@ -625,7 +625,10 @@ module.exports = grammar({ PREC.compound, seq( $._constructor_application, - "with", + choice( + ":", + "with" + ), field("body", $.with_template_body), ), ), diff --git a/test/corpus/definitions.txt b/test/corpus/definitions.txt index 11e4262..8403a2e 100644 --- a/test/corpus/definitions.txt +++ b/test/corpus/definitions.txt @@ -1237,6 +1237,9 @@ object A: given intFoo: CanFoo[Int] with def foo(x: Int): Int = 0 + given intFoo: CanFoo[Int]: + def foo(x: Int): Int = 0 + given CanFoo[Int] with def foo(x: Int): Int = 0 @@ -1289,6 +1292,21 @@ object A: (type_identifier))) (type_identifier) (integer_literal)))) + (given_definition + (identifier) + (generic_type + (type_identifier) + (type_arguments + (type_identifier))) + (with_template_body + (function_definition + (identifier) + (parameters + (parameter + (identifier) + (type_identifier))) + (type_identifier) + (integer_literal)))) (given_definition (generic_type (type_identifier) From 5a5767af612c40cd04246121fd71155e20b4402e Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 11 Dec 2024 22:38:13 -0500 Subject: [PATCH 2/5] SIP-64 Naming context bounds --- grammar.js | 9 ++++++++- test/corpus/types.txt | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/grammar.js b/grammar.js index de27622..9d61ab3 100644 --- a/grammar.js +++ b/grammar.js @@ -373,7 +373,14 @@ module.exports = grammar({ view_bound: $ => seq("<%", field("type", $._type)), - context_bound: $ => seq(":", field("type", $._type)), + context_bound: $ => seq( + ":", + field("type", $._type), + optional(seq( + "as", + field("name", $._identifier), + )), + ), /* * TemplateBody ::= :<<< [SelfType] TemplateStat {semi TemplateStat} >>> diff --git a/test/corpus/types.txt b/test/corpus/types.txt index a239d0b..776f41f 100644 --- a/test/corpus/types.txt +++ b/test/corpus/types.txt @@ -403,6 +403,32 @@ class A[B : C : D] (context_bound (type_identifier))))) +================================================================================ +Context bound (Scala 3 syntax) +================================================================================ + +def reduce[A : Monoid as m](xs: List[A]): A = () + +-------------------------------------------------------------------------------- + +(compilation_unit + (function_definition + (identifier) + (type_parameters + (identifier) + (context_bound + (type_identifier) + (identifier))) + (parameters + (parameter + (identifier) + (generic_type + (type_identifier) + (type_arguments + (type_identifier))))) + (type_identifier) + (unit))) + ================================================================================ Projections ================================================================================ From 8f10b4b485d1967ecd510f2d555e509a56af9eb8 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 11 Dec 2024 23:41:12 -0500 Subject: [PATCH 3/5] SIP-64 Aggregate context bounds --- grammar.js | 47 +++++++++++++++++++++++++++++++------------ test/corpus/types.txt | 19 +++++++++++++++++ 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/grammar.js b/grammar.js index 9d61ab3..34ce712 100644 --- a/grammar.js +++ b/grammar.js @@ -3,6 +3,7 @@ const PREC = { using_directive: 2, control: 1, stable_type_id: 2, + type: 2, while: 2, assign: 3, case: 3, @@ -93,8 +94,12 @@ module.exports = grammar({ [$._type, $.compound_type], // 'if' parenthesized_expression • '{' … [$._if_condition, $._simple_expression], - // _postfix_expression_choice ':' '(' wildcard • ':' … - [$.binding, $._simple_type], + [$.block, $._braced_template_body1], + [$._simple_expression, $.self_type, $._type_identifier], + [$._simple_expression, $._type_identifier], + [$.lambda_expression, $.self_type, $._type_identifier], + [$.lambda_expression, $._type_identifier], + [$.binding, $._simple_expression, $._type_identifier], ], word: $ => $._alpha_identifier, @@ -364,7 +369,7 @@ module.exports = grammar({ field("bound", optional($.lower_bound)), field("bound", optional($.upper_bound)), field("bound", optional(repeat($.view_bound))), - field("bound", optional(repeat($.context_bound))), + field("bound", optional($._context_bounds)), ), upper_bound: $ => seq("<:", field("type", $._type)), @@ -373,8 +378,20 @@ module.exports = grammar({ view_bound: $ => seq("<%", field("type", $._type)), + _context_bounds: $ => choice( + repeat1(seq( + ":", + $.context_bound + )), + seq( + ":", + "{", + trailingCommaSep1($.context_bound), + "}", + ) + ), + context_bound: $ => seq( - ":", field("type", $._type), optional(seq( "as", @@ -839,14 +856,17 @@ module.exports = grammar({ annotated_type: $ => prec.right(seq($._simple_type, repeat1($.annotation))), _simple_type: $ => - choice( - $.generic_type, - $.projected_type, - $.tuple_type, - $.singleton_type, - $.stable_type_identifier, - $._type_identifier, - $.wildcard, + prec.left( + PREC.type, + choice( + $.generic_type, + $.projected_type, + $.tuple_type, + $.singleton_type, + $.stable_type_identifier, + $._type_identifier, + $.wildcard, + ) ), compound_type: $ => @@ -1526,7 +1546,8 @@ module.exports = grammar({ $.string, ), - literal_type: $ => $._non_null_literal, + literal_type: $ => + prec.left(PREC.type, $._non_null_literal), literal: $ => choice($._non_null_literal, $.null_literal), diff --git a/test/corpus/types.txt b/test/corpus/types.txt index 776f41f..2f69974 100644 --- a/test/corpus/types.txt +++ b/test/corpus/types.txt @@ -409,6 +409,8 @@ Context bound (Scala 3 syntax) def reduce[A : Monoid as m](xs: List[A]): A = () +def showMax[X : {Ordering, Show}](x: X, y: X): String = () + -------------------------------------------------------------------------------- (compilation_unit @@ -427,6 +429,23 @@ def reduce[A : Monoid as m](xs: List[A]): A = () (type_arguments (type_identifier))))) (type_identifier) + (unit)) + (function_definition + (identifier) + (type_parameters + (identifier) + (context_bound + (type_identifier)) + (context_bound + (type_identifier))) + (parameters + (parameter + (identifier) + (type_identifier)) + (parameter + (identifier) + (type_identifier))) + (type_identifier) (unit))) ================================================================================ From 6c5e7d2b19089a578485e39a5d18a0e828263208 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 11 Dec 2024 23:55:40 -0500 Subject: [PATCH 4/5] SIP-64 Conditonal givens --- grammar.js | 9 +++++++++ test/corpus/definitions.txt | 13 ++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/grammar.js b/grammar.js index 34ce712..10fc635 100644 --- a/grammar.js +++ b/grammar.js @@ -617,6 +617,7 @@ module.exports = grammar({ optional($.modifiers), "given", optional($._given_constructor), + repeat($._given_sig), choice( field("return_type", $._structural_instance), seq( @@ -627,6 +628,14 @@ module.exports = grammar({ ), ), + _given_sig: $ => + seq( + $._given_conditional, + "=>" + ), + + _given_conditional: $ => alias($.parameters, $.given_conditional), + _given_constructor: $ => prec.right( seq( diff --git a/test/corpus/definitions.txt b/test/corpus/definitions.txt index 8403a2e..56c9ed4 100644 --- a/test/corpus/definitions.txt +++ b/test/corpus/definitions.txt @@ -1267,6 +1267,8 @@ object A: trait B: given c: Context[T] + given (config: Config) => Factory = ConcreteFactory() + -------------------------------------------------------------------------------- (compilation_unit @@ -1429,7 +1431,16 @@ object A: (generic_type (type_identifier) (type_arguments - (type_identifier))))))))) + (type_identifier)))))) + (given_definition + (given_conditional + (parameter + (identifier) + (type_identifier))) + (type_identifier) + (call_expression + (identifier) + (arguments)))))) ================================================================================ Top-level Definitions (Scala 3 syntax) From 9e1671fc8f4ca9d1fc89b579f0aa8e77a0b9f636 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 12 Dec 2024 00:06:30 -0500 Subject: [PATCH 5/5] SIP-64 Context bounds for type members --- grammar.js | 1 + test/corpus/definitions.txt | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/grammar.js b/grammar.js index 10fc635..f9c8fe6 100644 --- a/grammar.js +++ b/grammar.js @@ -544,6 +544,7 @@ module.exports = grammar({ field("type_parameters", optional($.type_parameters)), field("bound", optional($.lower_bound)), field("bound", optional($.upper_bound)), + field("bound", optional($._context_bounds)), ), ), diff --git a/test/corpus/definitions.txt b/test/corpus/definitions.txt index 56c9ed4..b034d6c 100644 --- a/test/corpus/definitions.txt +++ b/test/corpus/definitions.txt @@ -1027,6 +1027,25 @@ class A { (type_parameters (identifier)))))) +================================================================================ +Type definitions (Scala 3 syntax) +================================================================================ + +class A: + type Element: Order + +-------------------------------------------------------------------------------- + +(compilation_unit + (class_definition + (identifier) + (template_body + (type_definition + (type_identifier) + (context_bound + (type_identifier)))))) + + ================================================================================ Function declarations ================================================================================