diff --git a/make/build.xml b/make/build.xml
index 2d3da00b0f4122dfad46e73b71971f5ab0d2b60b..d242e72214137498837fe799f6e82ed737e7196d 100644
--- a/make/build.xml
+++ b/make/build.xml
@@ -716,6 +716,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -811,6 +834,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -826,6 +874,7 @@
+
@@ -868,6 +917,7 @@
+
@@ -935,6 +985,32 @@
classpath="${build.toolclasses.dir}/"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
currentFieldsToIgnore =
+ classFieldsToIgnoreMap.get(className);
+ if (currentFieldsToIgnore != null) {
+ for (String fieldToIgnore : currentFieldsToIgnore) {
+ if (field.equals(fieldToIgnore)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ class MutableFieldsVisitor extends TreeScanner {
+
+ @Override
+ public void visitVarDef(JCVariableDecl tree) {
+ boolean isJavacPack = tree.sym.outermostClass().fullname.toString()
+ .contains(packageToCheck);
+ if (isJavacPack &&
+ (tree.sym.flags() & SYNTHETIC) == 0 &&
+ tree.sym.owner.kind == Kinds.TYP) {
+ if (!ignoreField(tree.sym.owner.flatName().toString(),
+ tree.getName().toString())) {
+ boolean enumClass = (tree.sym.owner.flags() & ENUM) != 0;
+ boolean nonFinalStaticEnumField =
+ (tree.sym.flags() & (ENUM | FINAL)) == 0;
+ boolean nonFinalStaticField =
+ (tree.sym.flags() & STATIC) != 0 &&
+ (tree.sym.flags() & FINAL) == 0;
+ if (enumClass ? nonFinalStaticEnumField : nonFinalStaticField) {
+ messages.error(tree, "crules.err.var.must.be.final", tree);
+ }
+ }
+ }
+ super.visitVarDef(tree);
+ }
+
+ }
+
+ private static final String packageToCheck = "com.sun.tools.javac";
+
+ private static final Map> classFieldsToIgnoreMap =
+ new HashMap>();
+
+ static {
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.util.JCDiagnostic",
+ Arrays.asList("fragmentFormatter"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.util.JavacMessages",
+ Arrays.asList("defaultBundle", "defaultMessages"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.file.ZipFileIndexCache",
+ Arrays.asList("sharedInstance"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.main.JavaCompiler",
+ Arrays.asList("versionRB"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.code.Type",
+ Arrays.asList("moreInfo"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.util.SharedNameTable",
+ Arrays.asList("freelist"));
+ classFieldsToIgnoreMap.
+ put("com.sun.tools.javac.util.Log",
+ Arrays.asList("useRawMessages"));
+ }
+
+}
diff --git a/make/tools/crules/resources/crules.properties b/make/tools/crules/resources/crules.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9ae44b5258bc818b946670c2e22aee9af518fdec
--- /dev/null
+++ b/make/tools/crules/resources/crules.properties
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# 0: symbol
+crules.err.var.must.be.final=\
+ Static variable {0} must be final