Skip to content

Commit 5267fa5

Browse files
committed
support more of the class syntax
1 parent be5e1aa commit 5267fa5

File tree

3 files changed

+131
-37
lines changed

3 files changed

+131
-37
lines changed

common/corpus/declarations.txt

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,3 +832,122 @@ let a!: b;
832832
(identifier)
833833
(type_annotation
834834
(type_identifier)))))
835+
836+
=======================================
837+
Classes with generic parameters
838+
=======================================
839+
840+
class A<
841+
B,
842+
C,
843+
> {}
844+
845+
class D extends A<
846+
X,
847+
Y,
848+
> {}
849+
850+
---
851+
852+
(program
853+
(class_declaration
854+
(type_identifier)
855+
(type_parameters (type_parameter (type_identifier)) (type_parameter (type_identifier)))
856+
(class_body))
857+
(class_declaration
858+
(type_identifier)
859+
(class_heritage (extends_clause (generic_type
860+
(type_identifier)
861+
(type_arguments (type_identifier) (type_identifier)))))
862+
(class_body)))
863+
864+
=======================================
865+
Classes with extensions
866+
=======================================
867+
868+
class A extends B<C>(D) implements C {}
869+
export class A extends B<C>(D) implements C {}
870+
871+
class A extends B<C>(D)<E> implements C {}
872+
export class A extends B<C>(D)<E> implements C {}
873+
874+
export class A extends B<C, D> implements C {}
875+
876+
---
877+
878+
(program
879+
(class_declaration
880+
(type_identifier)
881+
(class_heritage
882+
(extends_clause
883+
(functional_extension
884+
(generic_type
885+
(type_identifier)
886+
(type_arguments
887+
(type_identifier)))
888+
(arguments
889+
(identifier))))
890+
(implements_clause
891+
(type_identifier)))
892+
(class_body))
893+
(export_statement
894+
(class_declaration
895+
(type_identifier)
896+
(class_heritage
897+
(extends_clause
898+
(functional_extension
899+
(generic_type
900+
(type_identifier)
901+
(type_arguments
902+
(type_identifier)))
903+
(arguments
904+
(identifier))))
905+
(implements_clause
906+
(type_identifier)))
907+
(class_body)))
908+
(class_declaration
909+
(type_identifier)
910+
(class_heritage
911+
(extends_clause
912+
(functional_extension
913+
(generic_type
914+
(type_identifier)
915+
(type_arguments
916+
(type_identifier)))
917+
(arguments
918+
(identifier))
919+
(type_arguments
920+
(type_identifier))))
921+
(implements_clause
922+
(type_identifier)))
923+
(class_body))
924+
(export_statement
925+
(class_declaration
926+
(type_identifier)
927+
(class_heritage
928+
(extends_clause
929+
(functional_extension
930+
(generic_type
931+
(type_identifier)
932+
(type_arguments
933+
(type_identifier)))
934+
(arguments
935+
(identifier))
936+
(type_arguments
937+
(type_identifier))))
938+
(implements_clause
939+
(type_identifier)))
940+
(class_body)))
941+
(export_statement
942+
(class_declaration
943+
(type_identifier)
944+
(class_heritage
945+
(extends_clause
946+
(generic_type
947+
(type_identifier)
948+
(type_arguments
949+
(type_identifier)
950+
(type_identifier))))
951+
(implements_clause
952+
(type_identifier)))
953+
(class_body))))

common/corpus/types.txt

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -460,42 +460,14 @@ interface Enum extends Bar, Baz, funThatEvalsToInterface() {
460460
(extends_clause
461461
(type_identifier)
462462
(type_identifier)
463-
(call_expression (identifier) (arguments)))
463+
(functional_extension (type_identifier) (arguments)))
464464
(object_type
465465
(method_signature
466466
(accessibility_modifier)
467467
(property_identifier)
468468
(formal_parameters)
469469
(type_annotation (type_identifier))))))
470470

471-
=======================================
472-
Generic types
473-
=======================================
474-
475-
class A<
476-
B,
477-
C,
478-
> {}
479-
480-
class D extends A<
481-
X,
482-
Y,
483-
> {}
484-
485-
---
486-
487-
(program
488-
(class_declaration
489-
(type_identifier)
490-
(type_parameters (type_parameter (type_identifier)) (type_parameter (type_identifier)))
491-
(class_body))
492-
(class_declaration
493-
(type_identifier)
494-
(class_heritage (extends_clause (generic_type
495-
(type_identifier)
496-
(type_arguments (type_identifier) (type_identifier)))))
497-
(class_body)))
498-
499471
=======================================
500472
Existential types
501473
=======================================

common/define-grammar.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module.exports = function defineGrammar(dialect) {
3636
[$.mapped_type_clause, $.primary_expression],
3737
[$.accessibility_modifier, $.primary_expression],
3838
['unary_void', $.expression],
39-
['extends_type', $.primary_expression],
39+
[$._extends_type, $.extends_clause, $.primary_expression],
4040
['unary', 'assign'],
4141
['declaration', $.expression],
4242
[$.predefined_type, $.unary_expression],
@@ -437,17 +437,20 @@ module.exports = function defineGrammar(dialect) {
437437
field('body', $.object_type)
438438
),
439439

440-
extends_clause: $ => prec('extends_type', seq(
440+
_extends_type: $ => choice(
441+
$._type_identifier,
442+
$.nested_type_identifier,
443+
$.generic_type,
444+
),
445+
functional_extension: $ => seq($._extends_type, $.arguments, optional($.type_arguments)),
446+
447+
extends_clause: $ => seq(
441448
'extends',
442449
commaSep1(choice(
443-
prec('extends_type', choice(
444-
$._type_identifier,
445-
$.nested_type_identifier,
446-
$.generic_type
447-
)),
450+
choice($._extends_type, $.functional_extension),
448451
$.expression
449452
))
450-
)),
453+
),
451454

452455
enum_declaration: $ => seq(
453456
optional('const'),

0 commit comments

Comments
 (0)