diff --git a/CHANGES.md b/CHANGES.md
index 0036c3a5fa..5f77890137 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -4,6 +4,7 @@ Grammars:
- fix(python) Fix recognition of numeric literals followed by keywords without whitespace (#2985) [Richard Gibson][]
- enh(swift) add SE-0290 unavailability condition (#3382) [Bradley Mackey][]
+- enh(java) add `sealed` and `non-sealed` keywords (#3386) [Bradley Mackey][]
[Richard Gibson]: https://github.com/gibson042
[Bradley Mackey]: https://github.com/bradleymackey
diff --git a/src/languages/java.js b/src/languages/java.js
index 17e73e66ea..8c55aae215 100644
--- a/src/languages/java.js
+++ b/src/languages/java.js
@@ -73,7 +73,8 @@ export default function(hljs) {
'module',
'requires',
'exports',
- 'do'
+ 'do',
+ 'sealed'
];
const BUILT_INS = [
@@ -179,6 +180,11 @@ export default function(hljs) {
3: "title.class"
}
},
+ {
+ // Exceptions for hyphenated keywords
+ match: /non-sealed/,
+ scope: "keyword"
+ },
{
begin: [
JAVA_IDENT_RE,
diff --git a/test/markup/java/titles.expect.txt b/test/markup/java/titles.expect.txt
index 571bd0fe51..2043511c9a 100644
--- a/test/markup/java/titles.expect.txt
+++ b/test/markup/java/titles.expect.txt
@@ -8,3 +8,11 @@
}
}
}
+
+sealed interface Command permits LoginCommand {
+ void run();
+}
+
+non-sealed abstract class UserPluginCommand extends Command {
+ void runAsUser();
+}
diff --git a/test/markup/java/titles.txt b/test/markup/java/titles.txt
index c43f696c92..a4d553fbb6 100644
--- a/test/markup/java/titles.txt
+++ b/test/markup/java/titles.txt
@@ -8,3 +8,11 @@ public class Greet {
}
}
}
+
+sealed interface Command permits LoginCommand {
+ void run();
+}
+
+non-sealed abstract class UserPluginCommand extends Command {
+ void runAsUser();
+}