8080353: JShell: Better error message on attempting to add default method
Special handling for errors with "default" modifier Reviewed-by: jlahoda
This commit is contained in:
parent
1813ce706a
commit
50971d6ea7
@ -98,6 +98,7 @@ import static jdk.jshell.Snippet.SubKind.STATIC_IMPORT_ON_DEMAND_SUBKIND;
|
|||||||
class Eval {
|
class Eval {
|
||||||
|
|
||||||
private static final Pattern IMPORT_PATTERN = Pattern.compile("import\\p{javaWhitespace}+(?<static>static\\p{javaWhitespace}+)?(?<fullname>[\\p{L}\\p{N}_\\$\\.]+\\.(?<name>[\\p{L}\\p{N}_\\$]+|\\*))");
|
private static final Pattern IMPORT_PATTERN = Pattern.compile("import\\p{javaWhitespace}+(?<static>static\\p{javaWhitespace}+)?(?<fullname>[\\p{L}\\p{N}_\\$\\.]+\\.(?<name>[\\p{L}\\p{N}_\\$]+|\\*))");
|
||||||
|
private static final Pattern DEFAULT_PREFIX = Pattern.compile("\\p{javaWhitespace}*(default)\\p{javaWhitespace}+");
|
||||||
|
|
||||||
// for uses that should not change state -- non-evaluations
|
// for uses that should not change state -- non-evaluations
|
||||||
private boolean preserveState = false;
|
private boolean preserveState = false;
|
||||||
@ -201,7 +202,13 @@ class Eval {
|
|||||||
}
|
}
|
||||||
Tree unitTree = units.get(0);
|
Tree unitTree = units.get(0);
|
||||||
if (pt.getDiagnostics().hasOtherThanNotStatementErrors()) {
|
if (pt.getDiagnostics().hasOtherThanNotStatementErrors()) {
|
||||||
return compileFailResult(pt, userSource, kindOfTree(unitTree));
|
Matcher matcher = DEFAULT_PREFIX.matcher(compileSource);
|
||||||
|
DiagList dlist = matcher.lookingAt()
|
||||||
|
? new DiagList(new ModifierDiagnostic(true,
|
||||||
|
state.messageFormat("jshell.diag.modifier.single.fatal", "'default'"),
|
||||||
|
matcher.start(1), matcher.end(1)))
|
||||||
|
: pt.getDiagnostics();
|
||||||
|
return compileFailResult(dlist, userSource, kindOfTree(unitTree));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Erase illegal/ignored modifiers
|
// Erase illegal/ignored modifiers
|
||||||
@ -1154,34 +1161,21 @@ class Eval {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private DiagList modifierDiagnostics(ModifiersTree modtree,
|
private class ModifierDiagnostic extends Diag {
|
||||||
final TreeDissector dis, boolean isAbstractProhibited) {
|
|
||||||
|
|
||||||
class ModifierDiagnostic extends Diag {
|
|
||||||
|
|
||||||
final boolean fatal;
|
final boolean fatal;
|
||||||
final String message;
|
final String message;
|
||||||
long start;
|
final long start;
|
||||||
long end;
|
final long end;
|
||||||
|
|
||||||
ModifierDiagnostic(List<Modifier> list, boolean fatal) {
|
ModifierDiagnostic(boolean fatal,
|
||||||
|
final String message,
|
||||||
|
long start,
|
||||||
|
long end) {
|
||||||
this.fatal = fatal;
|
this.fatal = fatal;
|
||||||
StringBuilder sb = new StringBuilder();
|
this.message = message;
|
||||||
for (Modifier mod : list) {
|
this.start = start;
|
||||||
sb.append("'");
|
this.end = end;
|
||||||
sb.append(mod.toString());
|
|
||||||
sb.append("' ");
|
|
||||||
}
|
|
||||||
String key = (list.size() > 1)
|
|
||||||
? fatal
|
|
||||||
? "jshell.diag.modifier.plural.fatal"
|
|
||||||
: "jshell.diag.modifier.plural.ignore"
|
|
||||||
: fatal
|
|
||||||
? "jshell.diag.modifier.single.fatal"
|
|
||||||
: "jshell.diag.modifier.single.ignore";
|
|
||||||
this.message = state.messageFormat(key, sb.toString());
|
|
||||||
start = dis.getStartPosition(modtree);
|
|
||||||
end = dis.getEndPosition(modtree);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1215,7 +1209,10 @@ class Eval {
|
|||||||
public String getMessage(Locale locale) {
|
public String getMessage(Locale locale) {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private DiagList modifierDiagnostics(ModifiersTree modtree,
|
||||||
|
final TreeDissector dis, boolean isAbstractProhibited) {
|
||||||
|
|
||||||
List<Modifier> list = new ArrayList<>();
|
List<Modifier> list = new ArrayList<>();
|
||||||
boolean fatal = false;
|
boolean fatal = false;
|
||||||
@ -1243,9 +1240,26 @@ class Eval {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return list.isEmpty()
|
if (list.isEmpty()) {
|
||||||
? new DiagList()
|
return new DiagList();
|
||||||
: new DiagList(new ModifierDiagnostic(list, fatal));
|
} else {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (Modifier mod : list) {
|
||||||
|
sb.append("'");
|
||||||
|
sb.append(mod.toString());
|
||||||
|
sb.append("' ");
|
||||||
|
}
|
||||||
|
String key = (list.size() > 1)
|
||||||
|
? fatal
|
||||||
|
? "jshell.diag.modifier.plural.fatal"
|
||||||
|
: "jshell.diag.modifier.plural.ignore"
|
||||||
|
: fatal
|
||||||
|
? "jshell.diag.modifier.single.fatal"
|
||||||
|
: "jshell.diag.modifier.single.ignore";
|
||||||
|
String message = state.messageFormat(key, sb.toString().trim());
|
||||||
|
return new DiagList(new ModifierDiagnostic(fatal, message,
|
||||||
|
dis.getStartPosition(modtree), dis.getEndPosition(modtree)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String computeDeclareName(TypeSymbol ts) {
|
String computeDeclareName(TypeSymbol ts) {
|
||||||
|
@ -37,7 +37,7 @@ jdk/javadoc/doclet/testIOException/TestIOException.java
|
|||||||
|
|
||||||
jdk/jshell/UserJdiUserRemoteTest.java 8173079 linux-all
|
jdk/jshell/UserJdiUserRemoteTest.java 8173079 linux-all
|
||||||
jdk/jshell/UserInputTest.java 8169536 generic-all
|
jdk/jshell/UserInputTest.java 8169536 generic-all
|
||||||
jdk/jshell/ExceptionsTest.java 8200701 windows-all
|
## jdk/jshell/ExceptionsTest.java 8200701 windows-all
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
#
|
#
|
||||||
|
@ -332,7 +332,8 @@ public class ExceptionsTest extends KullaTesting {
|
|||||||
assertEquals(actualElement.getMethodName(), expectedElement.getMethodName(), message + " : method names");
|
assertEquals(actualElement.getMethodName(), expectedElement.getMethodName(), message + " : method names");
|
||||||
}
|
}
|
||||||
assertEquals(actualElement.getFileName(), expectedElement.getFileName(), message + " : file names");
|
assertEquals(actualElement.getFileName(), expectedElement.getFileName(), message + " : file names");
|
||||||
assertEquals(actualElement.getLineNumber(), expectedElement.getLineNumber(), message + " : line numbers");
|
assertEquals(actualElement.getLineNumber(), expectedElement.getLineNumber(), message + " : line numbers"
|
||||||
|
+ " -- actual: " + actual + ", expected: " + expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8080357 8167643 8187359 8199762
|
* @bug 8080357 8167643 8187359 8199762 8080353
|
||||||
* @summary Tests for EvaluationState.methods
|
* @summary Tests for EvaluationState.methods
|
||||||
* @build KullaTesting TestingInputStream ExpectedDiagnostic
|
* @build KullaTesting TestingInputStream ExpectedDiagnostic
|
||||||
* @run testng MethodsTest
|
* @run testng MethodsTest
|
||||||
@ -237,6 +237,11 @@ public class MethodsTest extends KullaTesting {
|
|||||||
assertNumberOfActiveMethods(0);
|
assertNumberOfActiveMethods(0);
|
||||||
assertActiveKeys();
|
assertActiveKeys();
|
||||||
|
|
||||||
|
assertDeclareFail("default void f() { }",
|
||||||
|
new ExpectedDiagnostic("jdk.eval.error.illegal.modifiers", 0, 7, 0, -1, -1, Diagnostic.Kind.ERROR));
|
||||||
|
assertNumberOfActiveMethods(0);
|
||||||
|
assertActiveKeys();
|
||||||
|
|
||||||
assertDeclareFail("int f() {}", "compiler.err.missing.ret.stmt",
|
assertDeclareFail("int f() {}", "compiler.err.missing.ret.stmt",
|
||||||
added(REJECTED));
|
added(REJECTED));
|
||||||
assertNumberOfActiveMethods(0);
|
assertNumberOfActiveMethods(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user