changeset 56985:36c88ca11314 records-and-sealed

dont accept record component names like: toString, etc
author vromero
date Wed, 14 Aug 2019 18:14:28 -0400
parents 79c030f0364a
children c0de553f0b3f 6f214db52b77
files src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties test/langtools/tools/javac/records/fields/IllegalRecordComponentNameTest.java test/langtools/tools/javac/records/fields/IllegalRecordComponentNameTest.out
diffstat 4 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java	Fri Aug 09 17:13:59 2019 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java	Wed Aug 14 18:14:28 2019 -0400
@@ -3819,6 +3819,9 @@
         return fields.toList();
     }
 
+    static final Set<String> forbiddenRecordComponentNames = Set.of("toString", "hashCode", "getClass",
+            "readObjectNoData", "readResolve", "writeReplace", "serialPersistentFields");
+
     JCVariableDecl headerField() {
         JCModifiers mods = modifiersOpt();
         if (mods.flags != 0) {
@@ -3828,6 +3831,9 @@
         JCExpression type = parseType();
         int pos = token.pos;
         Name id = ident();
+        if (forbiddenRecordComponentNames.contains(id.toString())) {
+            log.error(pos, Errors.IllegalRecordComponentName(id));
+        }
         List<Pair<Accessors.Kind, Name>> accessors = List.of(new Pair<>(Accessors.Kind.GET, id));
         return toP(F.at(pos).VarDef(mods, id, type, null, accessors));
     }
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties	Fri Aug 09 17:13:59 2019 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties	Wed Aug 14 18:14:28 2019 -0400
@@ -3469,6 +3469,10 @@
     required: {0}\n\
     found:    {1}\n\
 
+# 0: name
+compiler.err.illegal.record.component.name=\
+    Illegal record component name: {0}
+
 ############################################
 # messages previouly at javac.properties
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/records/fields/IllegalRecordComponentNameTest.java	Wed Aug 14 18:14:28 2019 -0400
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @summary dont accept illegal record component names
+ * @compile/fail/ref=IllegalRecordComponentNameTest.out -XDrawDiagnostics IllegalRecordComponentNameTest.java
+ */
+
+public class IllegalRecordComponentNameTest {
+    record R1(String toString) {}
+    record R2(String hashCode) {}
+    record R3(String getClass) {}
+    record R4(String readObjectNoData) {}
+    record R5(String readResolve) {}
+    record R6(String writeReplace) {}
+    record R7(String serialPersistentFields) {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/tools/javac/records/fields/IllegalRecordComponentNameTest.out	Wed Aug 14 18:14:28 2019 -0400
@@ -0,0 +1,8 @@
+IllegalRecordComponentNameTest.java:8:22: compiler.err.illegal.record.component.name: toString
+IllegalRecordComponentNameTest.java:9:22: compiler.err.illegal.record.component.name: hashCode
+IllegalRecordComponentNameTest.java:10:22: compiler.err.illegal.record.component.name: getClass
+IllegalRecordComponentNameTest.java:11:22: compiler.err.illegal.record.component.name: readObjectNoData
+IllegalRecordComponentNameTest.java:12:22: compiler.err.illegal.record.component.name: readResolve
+IllegalRecordComponentNameTest.java:13:22: compiler.err.illegal.record.component.name: writeReplace
+IllegalRecordComponentNameTest.java:14:22: compiler.err.illegal.record.component.name: serialPersistentFields
+7 errors