Merge pull request #112 from raghav-deepsource/sealed-classes

Sealed classes
pull/315/head
Yoann Padioleau 2022-05-24 14:11:20 +07:00 committed by GitHub
commit 30962d1b47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 36400 additions and 32668 deletions

@ -763,6 +763,7 @@ module.exports = grammar({
optional(field('type_parameters', $.type_parameters)),
optional(field('superclass', $.superclass)),
optional(field('interfaces', $.super_interfaces)),
optional(field('permits', $.permits)),
field('body', $.class_body)
),
@ -779,7 +780,9 @@ module.exports = grammar({
'synchronized',
'native',
'transient',
'volatile'
'volatile',
'sealed',
'non-sealed',
)),
type_parameters: $ => seq(
@ -801,14 +804,19 @@ module.exports = grammar({
super_interfaces: $ => seq(
'implements',
$.interface_type_list
$.type_list
),
interface_type_list: $ => seq(
type_list: $ => seq(
$._type,
repeat(seq(',', $._type))
),
permits: $ => seq(
'permits',
$.type_list
),
class_body: $ => seq(
'{',
repeat($._class_body_declaration),
@ -937,12 +945,13 @@ module.exports = grammar({
field('name', $.identifier),
field('type_parameters', optional($.type_parameters)),
optional($.extends_interfaces),
optional(field('permits', $.permits)),
field('body', $.interface_body)
),
extends_interfaces: $ => seq(
'extends',
$.interface_type_list
$.type_list
),
interface_body: $ => seq(

@ -112,6 +112,7 @@
"module"
"native"
"new"
"non-sealed"
"open"
"opens"
"package"
@ -121,6 +122,7 @@
"public"
"requires"
"return"
"sealed"
"static"
"strictfp"
"switch"

@ -11,7 +11,7 @@
(interface_declaration
name: (identifier) @name) @definition.interface
(interface_type_list
(type_list
(type_identifier) @name) @reference.implementation
(object_creation_expression

59
src/grammar.json vendored

@ -5066,6 +5066,22 @@
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "permits",
"content": {
"type": "SYMBOL",
"name": "permits"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"name": "body",
@ -5132,6 +5148,14 @@
{
"type": "STRING",
"value": "volatile"
},
{
"type": "STRING",
"value": "sealed"
},
{
"type": "STRING",
"value": "non-sealed"
}
]
}
@ -5258,11 +5282,11 @@
},
{
"type": "SYMBOL",
"name": "interface_type_list"
"name": "type_list"
}
]
},
"interface_type_list": {
"type_list": {
"type": "SEQ",
"members": [
{
@ -5287,6 +5311,19 @@
}
]
},
"permits": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "permits"
},
{
"type": "SYMBOL",
"name": "type_list"
}
]
},
"class_body": {
"type": "SEQ",
"members": [
@ -5928,6 +5965,22 @@
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "permits",
"content": {
"type": "SYMBOL",
"name": "permits"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"name": "body",
@ -5947,7 +6000,7 @@
},
{
"type": "SYMBOL",
"name": "interface_type_list"
"name": "type_list"
}
]
},

@ -1158,6 +1158,16 @@
}
]
},
"permits": {
"multiple": false,
"required": false,
"types": [
{
"type": "permits",
"named": true
}
]
},
"superclass": {
"multiple": false,
"required": false,
@ -1804,7 +1814,7 @@
"required": true,
"types": [
{
"type": "interface_type_list",
"type": "type_list",
"named": true
}
]
@ -2216,6 +2226,16 @@
}
]
},
"permits": {
"multiple": false,
"required": false,
"types": [
{
"type": "permits",
"named": true
}
]
},
"type_parameters": {
"multiple": false,
"required": false,
@ -2242,21 +2262,6 @@
]
}
},
{
"type": "interface_type_list",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "_type",
"named": true
}
]
}
},
{
"type": "labeled_statement",
"named": true,
@ -2749,6 +2754,21 @@
]
}
},
{
"type": "permits",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "type_list",
"named": true
}
]
}
},
{
"type": "program",
"named": true,
@ -3126,7 +3146,7 @@
"required": true,
"types": [
{
"type": "interface_type_list",
"type": "type_list",
"named": true
}
]
@ -3449,6 +3469,21 @@
]
}
},
{
"type": "type_list",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "_type",
"named": true
}
]
}
},
{
"type": "type_parameter",
"named": true,
@ -4016,6 +4051,10 @@
"type": "new",
"named": false
},
{
"type": "non-sealed",
"named": false
},
{
"type": "null_literal",
"named": true
@ -4036,6 +4075,10 @@
"type": "package",
"named": false
},
{
"type": "permits",
"named": false
},
{
"type": "private",
"named": false
@ -4064,6 +4107,10 @@
"type": "return",
"named": false
},
{
"type": "sealed",
"named": false
},
{
"type": "short",
"named": false

68863
src/parser.c vendored

File diff suppressed because it is too large Load Diff

@ -123,7 +123,6 @@ struct TSLanguage {
unsigned (*serialize)(void *, char *);
void (*deserialize)(void *, const char *, unsigned);
} external_scanner;
const TSStateId *primary_state_ids;
};
/*

@ -324,7 +324,7 @@ public class Dog implements ISpeak {
(program
(class_declaration
(modifiers) (identifier)
(super_interfaces (interface_type_list (type_identifier))) (class_body)))
(super_interfaces (type_list (type_identifier))) (class_body)))
============================
class declaration with body
@ -383,11 +383,11 @@ interface Bottom extends Left, Right {}
(program
(interface_declaration
(identifier)
(extends_interfaces (interface_type_list (type_identifier)))
(extends_interfaces (type_list (type_identifier)))
(interface_body))
(interface_declaration
(identifier)
(extends_interfaces (interface_type_list (type_identifier) (type_identifier))) (interface_body)))
(extends_interfaces (type_list (type_identifier) (type_identifier))) (interface_body)))
===========================================
interface with annotation type declaration
@ -668,3 +668,40 @@ class A$B {
(method_invocation
(identifier)
(argument_list))))))))
================
Sealed classes
================
sealed interface A permits B, C {
}
final class B implements A {}
non-sealed interface C extends A {}
---
(program
(interface_declaration
(modifiers)
(identifier)
(permits
(type_list
(type_identifier)
(type_identifier)))
(interface_body))
(class_declaration
(modifiers)
(identifier)
(super_interfaces
(type_list
(type_identifier)))
(class_body))
(interface_declaration
(modifiers)
(identifier)
(extends_interfaces
(type_list
(type_identifier)))
(interface_body)))