From 6ef64b1d9c8a1c7ee1c136b9fc1e4a139d046bea Mon Sep 17 00:00:00 2001 From: Dave Holoway Date: Sun, 7 Jun 2020 16:22:38 +0100 Subject: [PATCH] make default a modifer keyword for interface default method support --- langserver/java/parser9.js | 4 ++-- langserver/java/validation/modifier-errors.js | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/langserver/java/parser9.js b/langserver/java/parser9.js index 3aec27a..9cf9f9f 100644 --- a/langserver/java/parser9.js +++ b/langserver/java/parser9.js @@ -241,8 +241,8 @@ function tokenize(source) { } if (m[4]) { // ident or keyword - const KEYWORDS = /^(assert|break|case|catch|class|const|continue|default|do|else|enum|extends|finally|for|goto|if|implements|import|interface|new|package|return|super|switch|throw|throws|try|while)$/; - const MODIFIER_KEYWORDS = /^(abstract|final|native|private|protected|public|static|strictfp|synchronized|transient|volatile)$/; + const KEYWORDS = /^(assert|break|case|catch|class|const|continue|do|else|enum|extends|finally|for|goto|if|implements|import|interface|new|package|return|super|switch|throw|throws|try|while)$/; + const MODIFIER_KEYWORDS = /^(abstract|final|native|private|protected|public|static|strictfp|synchronized|transient|volatile|default)$/; const PRIMITIVE_TYPE_KEYWORDS = /^(int|boolean|byte|char|double|float|long|short|void)$/ const LITERAL_VALUE_KEYWORDS = /^(this|true|false|null)$/; const OPERATOR_KEYWORDS = /^(instanceof)$/; diff --git a/langserver/java/validation/modifier-errors.js b/langserver/java/validation/modifier-errors.js index 44baf1d..d7c90be 100644 --- a/langserver/java/validation/modifier-errors.js +++ b/langserver/java/validation/modifier-errors.js @@ -96,6 +96,13 @@ function checkMethodModifiers(type, ownertypemods, method, probs) { if (allmods.has('native') && method.body().simplified.startsWith('B')) { probs.push(ParseProblem.Error(allmods.get('native'), 'Method declarations marked as native cannot have a method body')); } + // JLS8 + if (type.kind() !== 'interface' && allmods.has('default')) { + probs.push(ParseProblem.Error(method, `Default method declarations are only allowed inside interfaces`)); + } + if (allmods.has('default') && !method.body().simplified.startsWith('B')) { + probs.push(ParseProblem.Error(method, `Default method declarations must have an implementation`)); + } } /**