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