8310861: Improve location reporting for javac serial lint warnings

Reviewed-by: jlahoda
This commit is contained in:
Joe Darcy 2023-06-26 16:56:40 +00:00
parent d32eb015f0
commit 289f218a32
9 changed files with 52 additions and 28 deletions
src/jdk.compiler/share/classes/com/sun/tools/javac/comp
test/langtools/tools/javac/warnings/Serial

@ -5048,16 +5048,19 @@ public class Check {
if ((spf.flags() & (PRIVATE | STATIC | FINAL)) !=
(PRIVATE | STATIC | FINAL)) {
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(spf, tree), Warnings.ImproperSPF);
TreeInfo.diagnosticPositionFor(spf, tree),
Warnings.ImproperSPF);
}
if (!types.isSameType(spf.type, OSF_TYPE)) {
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(spf, tree), Warnings.OSFArraySPF);
TreeInfo.diagnosticPositionFor(spf, tree),
Warnings.OSFArraySPF);
}
if (isExternalizable((Type)(e.asType()))) {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(spf, tree),
Warnings.IneffectualSerialFieldExternalizable);
}
@ -5165,15 +5168,19 @@ public class Check {
String name = enclosed.getSimpleName().toString();
switch(enclosed.getKind()) {
case FIELD -> {
var field = (VarSymbol)enclosed;
if (serialFieldNames.contains(name)) {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(field, tree),
Warnings.IneffectualSerialFieldEnum(name));
}
}
case METHOD -> {
var method = (MethodSymbol)enclosed;
if (serialMethodNames.contains(name)) {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(method, tree),
Warnings.IneffectualSerialMethodEnum(name));
}
}
@ -5293,9 +5300,11 @@ public class Check {
String name = enclosed.getSimpleName().toString();
switch(enclosed.getKind()) {
case FIELD -> {
var field = (VarSymbol)enclosed;
switch(name) {
case "serialPersistentFields" -> {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(field, tree),
Warnings.IneffectualSerialFieldRecord);
}
@ -5303,7 +5312,7 @@ public class Check {
// Could generate additional warning that
// svuid value is not checked to match for
// records.
checkSerialVersionUID(tree, e, (VarSymbol)enclosed);
checkSerialVersionUID(tree, e, field);
}
}
@ -5314,9 +5323,11 @@ public class Check {
switch(name) {
case "writeReplace" -> checkWriteReplace(tree, e, method);
case "readResolve" -> checkReadResolve(tree, e, method);
default -> {
if (serialMethodNames.contains(name)) {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(method, tree),
Warnings.IneffectualSerialMethodRecord(name));
}
}
@ -5394,7 +5405,8 @@ public class Check {
private void checkExternalizable(JCClassDecl tree, Element enclosing, MethodSymbol method) {
// If the enclosing class is externalizable, warn for the method
if (isExternalizable((Type)enclosing.asType())) {
log.warning(LintCategory.SERIAL, tree.pos(),
log.warning(LintCategory.SERIAL,
TreeInfo.diagnosticPositionFor(method, tree),
Warnings.IneffectualSerialMethodExternalizable(method.getSimpleName()));
}
return;

@ -2,6 +2,7 @@
* @test /nodynamiccopyright/
* @bug 8202056
* @compile/ref=CtorAccess.out -XDrawDiagnostics -Xlint:serial CtorAccess.java
* @compile/ref=empty.out -XDrawDiagnostics CtorAccess.java
*/
import java.io.*;

@ -1,3 +1,3 @@
CtorAccess.java:15:12: compiler.warn.serializable.missing.access.no.arg.ctor: CtorAccess
CtorAccess.java:30:5: compiler.warn.serializable.missing.access.no.arg.ctor: CtorAccess.MemberSuper
CtorAccess.java:16:12: compiler.warn.serializable.missing.access.no.arg.ctor: CtorAccess
CtorAccess.java:31:5: compiler.warn.serializable.missing.access.no.arg.ctor: CtorAccess.MemberSuper
2 warnings

@ -2,6 +2,7 @@
* @test /nodynamiccopyright/
* @bug 8202056
* @compile/ref=EnumSerial.out -XDrawDiagnostics -Xlint:serial EnumSerial.java
* @compile/ref=empty.out -XDrawDiagnostics EnumSerial.java
*/
import java.io.*;

@ -1,8 +1,8 @@
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.field.enum: serialVersionUID
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.field.enum: serialPersistentFields
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.method.enum: writeObject
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.method.enum: writeReplace
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.method.enum: readObject
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.method.enum: readObjectNoData
EnumSerial.java:9:1: compiler.warn.ineffectual.serial.method.enum: readResolve
EnumSerial.java:16:31: compiler.warn.ineffectual.serial.field.enum: serialVersionUID
EnumSerial.java:17:46: compiler.warn.ineffectual.serial.field.enum: serialPersistentFields
EnumSerial.java:19:18: compiler.warn.ineffectual.serial.method.enum: writeObject
EnumSerial.java:23:20: compiler.warn.ineffectual.serial.method.enum: writeReplace
EnumSerial.java:27:18: compiler.warn.ineffectual.serial.method.enum: readObject
EnumSerial.java:32:18: compiler.warn.ineffectual.serial.method.enum: readObjectNoData
EnumSerial.java:36:20: compiler.warn.ineffectual.serial.method.enum: readResolve
7 warnings

@ -2,6 +2,7 @@
* @test /nodynamiccopyright/
* @bug 8202056
* @compile/ref=Extern.out -XDrawDiagnostics -Xlint:serial Extern.java
* @compile/ref=empty.out -XDrawDiagnostics Extern.java
*/
import java.io.*;

@ -1,6 +1,6 @@
Extern.java:9:1: compiler.warn.externalizable.missing.public.no.arg.ctor
Extern.java:9:1: compiler.warn.ineffectual.serial.field.externalizable
Extern.java:9:1: compiler.warn.ineffectual.serial.method.externalizable: readObject
Extern.java:9:1: compiler.warn.ineffectual.serial.method.externalizable: writeObject
Extern.java:9:1: compiler.warn.ineffectual.serial.method.externalizable: readObjectNoData
Extern.java:10:1: compiler.warn.externalizable.missing.public.no.arg.ctor
Extern.java:17:46: compiler.warn.ineffectual.serial.field.externalizable
Extern.java:28:18: compiler.warn.ineffectual.serial.method.externalizable: readObject
Extern.java:34:18: compiler.warn.ineffectual.serial.method.externalizable: writeObject
Extern.java:39:18: compiler.warn.ineffectual.serial.method.externalizable: readObjectNoData
5 warnings

@ -1,6 +1,6 @@
/*
* @test /nodynamiccopyright/
* @bug 8202056
* @bug 8202056 8310861
* @compile/ref=RecordSerial.out -XDrawDiagnostics -Xlint:serial RecordSerial.java
*/
@ -41,4 +41,13 @@ record RecordSerial(int foo) implements Serializable {
private Object readResolve() throws ObjectStreamException {
return null;
}
// meaningless Externalizable methods, no warning generated
public void writeExternal(ObjectOutput oo) {
;
}
public void readExternal(ObjectInput oi) {
;
}
}

@ -1,5 +1,5 @@
RecordSerial.java:9:1: compiler.warn.ineffectual.serial.field.record
RecordSerial.java:9:1: compiler.warn.ineffectual.serial.method.record: writeObject
RecordSerial.java:9:1: compiler.warn.ineffectual.serial.method.record: readObject
RecordSerial.java:9:1: compiler.warn.ineffectual.serial.method.record: readObjectNoData
RecordSerial.java:17:46: compiler.warn.ineffectual.serial.field.record
RecordSerial.java:20:18: compiler.warn.ineffectual.serial.method.record: writeObject
RecordSerial.java:30:18: compiler.warn.ineffectual.serial.method.record: readObject
RecordSerial.java:36:18: compiler.warn.ineffectual.serial.method.record: readObjectNoData
4 warnings