1 /******************************************************************************* 2 * Copyright (c) 2000, 2020 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 * Stephan Herrmann - Contributions for 14 * bug 349326 - [1.7] new warning for missing try-with-resources 15 * bug 358903 - Filter practically unimportant resource leak warnings 16 * bug 381445 - [compiler][resource] Can the resource leak check be made aware of Closeables.closeQuietly? 17 * bug 400421 - [compiler] Null analysis for fields does not take @com.google.inject.Inject into account 18 * bug 382069 - [null] Make the null analysis consider JUnit's assertNotNull similarly to assertions 19 * Bug 405569 - Resource leak check false positive when using DbUtils.closeQuietly 20 * Bug 427199 - [1.8][resource] avoid resource leak warnings on Streams that have no resource 21 * Bug 425183 - [1.8][inference] make CaptureBinding18 safe 22 * Bug 429958 - [1.8][null] evaluate new DefaultLocation attribute of @NonNullByDefault 23 * Bug 410218 - Optional warning for arguments of "unexpected" types to Map#get(Object), Collection#remove(Object) et al. 24 * Jesper S Moller - Contributions for 25 * Bug 405066 - [1.8][compiler][codegen] Implement code generation infrastructure for JSR335 26 * Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable 27 * bug 527554 - [18.3] Compiler support for JEP 286 Local-Variable Type 28 * Andy Clement (GoPivotal, Inc) aclement@gopivotal.com - Contributions for 29 * Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas 30 * Ulrich Grave <ulrich.grave@gmx.de> - Contributions for 31 * bug 386692 - Missing "unused" warning on "autowired" fields 32 * Pierre-Yves B. <pyvesdev@gmail.com> - Contribution for 33 * bug 542520 - [JUnit 5] Warning The method xxx from the type X is never used locally is shown when using MethodSource 34 *******************************************************************************/ 35 package org.eclipse.jdt.internal.compiler.lookup; 36 37 import org.eclipse.jdt.core.compiler.CharOperation; 38 39 // TODO should rename into TypeNames (once extracted last non name constants) 40 public interface TypeConstants { 41 42 char[] JAVA = "java".toCharArray(); //$NON-NLS-1$ 43 char[] JAVAX = "javax".toCharArray(); //$NON-NLS-1$ 44 char[] LANG = "lang".toCharArray(); //$NON-NLS-1$ 45 char[] IO = "io".toCharArray(); //$NON-NLS-1$ 46 char[] NIO = "nio".toCharArray(); //$NON-NLS-1$ 47 char[] UTIL = "util".toCharArray(); //$NON-NLS-1$ 48 char[] ZIP = "zip".toCharArray(); //$NON-NLS-1$ 49 char[] ANNOTATION = "annotation".toCharArray(); //$NON-NLS-1$ 50 char[] REFLECT = "reflect".toCharArray(); //$NON-NLS-1$ 51 char[] LENGTH = "length".toCharArray(); //$NON-NLS-1$ 52 char[] CLONE = "clone".toCharArray(); //$NON-NLS-1$ 53 char[] EQUALS = "equals".toCharArray(); //$NON-NLS-1$ 54 char[] GETCLASS = "getClass".toCharArray(); //$NON-NLS-1$ 55 char[] HASHCODE = "hashCode".toCharArray(); //$NON-NLS-1$ 56 char[] TOSTRING = "toString".toCharArray(); //$NON-NLS-1$ 57 char[] OBJECT = "Object".toCharArray(); //$NON-NLS-1$ 58 char[] MAIN = "main".toCharArray(); //$NON-NLS-1$ 59 char[] SERIALVERSIONUID = "serialVersionUID".toCharArray(); //$NON-NLS-1$ 60 char[] SERIALPERSISTENTFIELDS = "serialPersistentFields".toCharArray(); //$NON-NLS-1$ 61 char[] READRESOLVE = "readResolve".toCharArray(); //$NON-NLS-1$ 62 char[] WRITEREPLACE = "writeReplace".toCharArray(); //$NON-NLS-1$ 63 char[] READOBJECT = "readObject".toCharArray(); //$NON-NLS-1$ 64 char[] WRITEOBJECT = "writeObject".toCharArray(); //$NON-NLS-1$ 65 char[] CharArray_JAVA_LANG_OBJECT = "java.lang.Object".toCharArray(); //$NON-NLS-1$ 66 char[] CharArray_JAVA_LANG_ENUM = "java.lang.Enum".toCharArray(); //$NON-NLS-1$ 67 char[] CharArray_JAVA_LANG_RECORD = "java.lang.Record".toCharArray(); //$NON-NLS-1$ 68 char[] CharArray_JAVA_LANG_RECORD_SLASH = "java/lang/Record".toCharArray(); //$NON-NLS-1$ 69 char[] CharArray_JAVA_LANG_ANNOTATION_ANNOTATION = "java.lang.annotation.Annotation".toCharArray(); //$NON-NLS-1$ 70 char[] CharArray_JAVA_IO_OBJECTINPUTSTREAM = "java.io.ObjectInputStream".toCharArray(); //$NON-NLS-1$ 71 char[] CharArray_JAVA_IO_OBJECTOUTPUTSTREAM = "java.io.ObjectOutputStream".toCharArray(); //$NON-NLS-1$ 72 char[] CharArray_JAVA_IO_OBJECTSTREAMFIELD = "java.io.ObjectStreamField".toCharArray(); //$NON-NLS-1$ 73 char[] ANONYM_PREFIX = "new ".toCharArray(); //$NON-NLS-1$ 74 char[] ANONYM_SUFFIX = "(){}".toCharArray(); //$NON-NLS-1$ 75 char[] WILDCARD_NAME = { '?' }; 76 char[] WILDCARD_SUPER = " super ".toCharArray(); //$NON-NLS-1$ 77 char[] WILDCARD_EXTENDS = " extends ".toCharArray(); //$NON-NLS-1$ 78 char[] WILDCARD_MINUS = { '-' }; 79 char[] WILDCARD_STAR = { '*' }; 80 char[] WILDCARD_PLUS = { '+' }; 81 char[] WILDCARD_CAPTURE_NAME_PREFIX = "capture#".toCharArray(); //$NON-NLS-1$ 82 char[] WILDCARD_CAPTURE_NAME_SUFFIX = "-of ".toCharArray(); //$NON-NLS-1$ 83 char[] WILDCARD_CAPTURE_SIGNABLE_NAME_SUFFIX = "capture-of ".toCharArray(); //$NON-NLS-1$ 84 char[] WILDCARD_CAPTURE = { '!' }; 85 char[] CAPTURE18 = { '^' }; 86 char[] BYTE = "byte".toCharArray(); //$NON-NLS-1$ 87 char[] SHORT = "short".toCharArray(); //$NON-NLS-1$ 88 char[] INT = "int".toCharArray(); //$NON-NLS-1$ 89 char[] LONG = "long".toCharArray(); //$NON-NLS-1$ 90 char[] FLOAT = "float".toCharArray(); //$NON-NLS-1$ 91 char[] DOUBLE = "double".toCharArray(); //$NON-NLS-1$ 92 char[] CHAR = "char".toCharArray(); //$NON-NLS-1$ 93 char[] BOOLEAN = "boolean".toCharArray(); //$NON-NLS-1$ 94 char[] NULL = "null".toCharArray(); //$NON-NLS-1$ 95 char[] VOID = "void".toCharArray(); //$NON-NLS-1$ 96 char[] VALUE = "value".toCharArray(); //$NON-NLS-1$ 97 char[] VALUES = "values".toCharArray(); //$NON-NLS-1$ 98 char[] VALUEOF = "valueOf".toCharArray(); //$NON-NLS-1$ 99 char[] UPPER_SOURCE = "SOURCE".toCharArray(); //$NON-NLS-1$ 100 char[] UPPER_CLASS = "CLASS".toCharArray(); //$NON-NLS-1$ 101 char[] UPPER_RUNTIME = "RUNTIME".toCharArray(); //$NON-NLS-1$ 102 char[] ANNOTATION_PREFIX = "@".toCharArray(); //$NON-NLS-1$ 103 char[] ANNOTATION_SUFFIX = "()".toCharArray(); //$NON-NLS-1$ 104 char[] TYPE = "TYPE".toCharArray(); //$NON-NLS-1$ 105 char[] UPPER_FIELD = "FIELD".toCharArray(); //$NON-NLS-1$ 106 char[] UPPER_METHOD = "METHOD".toCharArray(); //$NON-NLS-1$ 107 char[] UPPER_PARAMETER = "PARAMETER".toCharArray(); //$NON-NLS-1$ 108 char[] UPPER_CONSTRUCTOR = "CONSTRUCTOR".toCharArray(); //$NON-NLS-1$ 109 char[] UPPER_LOCAL_VARIABLE = "LOCAL_VARIABLE".toCharArray(); //$NON-NLS-1$ 110 char[] UPPER_ANNOTATION_TYPE = "ANNOTATION_TYPE".toCharArray(); //$NON-NLS-1$ 111 char[] UPPER_PACKAGE = "PACKAGE".toCharArray(); //$NON-NLS-1$ 112 char[] ANONYMOUS_METHOD = "lambda$".toCharArray(); //$NON-NLS-1$ 113 char[] DESERIALIZE_LAMBDA = "$deserializeLambda$".toCharArray(); //$NON-NLS-1$ 114 char[] LAMBDA_TYPE = "<lambda>".toCharArray(); //$NON-NLS-1$ 115 char[] UPPER_MODULE = "MODULE".toCharArray(); //$NON-NLS-1$ 116 char[] UPPER_RECORD_COMPONENT = "RECORD_COMPONENT".toCharArray(); //$NON-NLS-1$ 117 118 // JEP 286 119 char[] VAR = "var".toCharArray(); //$NON-NLS-1$ 120 // JEP 359 Records 121 char[] RECORD_RESTRICTED_IDENTIFIER = "record".toCharArray(); //$NON-NLS-1$ 122 char[] RECORD_CLASS = "Record".toCharArray(); //$NON-NLS-1$ 123 124 // jsr308 125 char[] TYPE_USE_TARGET = "TYPE_USE".toCharArray(); //$NON-NLS-1$ 126 char[] TYPE_PARAMETER_TARGET = "TYPE_PARAMETER".toCharArray(); //$NON-NLS-1$ 127 128 // common 3rd party package components: 129 char[] ORG = "org".toCharArray(); //$NON-NLS-1$ 130 char[] ECLIPSE = "eclipse".toCharArray(); //$NON-NLS-1$ 131 char[] CORE = "core".toCharArray(); //$NON-NLS-1$ 132 char[] RUNTIME = "runtime".toCharArray(); //$NON-NLS-1$ 133 char[] APACHE = "apache".toCharArray(); //$NON-NLS-1$ 134 char[] COMMONS = "commons".toCharArray(); //$NON-NLS-1$ 135 char[] LANG3 = "lang3".toCharArray(); //$NON-NLS-1$ 136 char[] COM = "com".toCharArray(); //$NON-NLS-1$ 137 char[] GOOGLE = "google".toCharArray(); //$NON-NLS-1$ 138 char[] JDT = "jdt".toCharArray(); //$NON-NLS-1$ 139 char[] INTERNAL = "internal".toCharArray(); //$NON-NLS-1$ 140 char[] COMPILER = "compiler".toCharArray(); //$NON-NLS-1$ 141 char[] LOOKUP = "lookup".toCharArray(); //$NON-NLS-1$ 142 char[] TYPEBINDING = "TypeBinding".toCharArray(); //$NON-NLS-1$ 143 char[] DOM = "dom".toCharArray(); //$NON-NLS-1$ 144 char[] ITYPEBINDING = "ITypeBinding".toCharArray(); //$NON-NLS-1$ 145 char[] SPRING = "springframework".toCharArray(); //$NON-NLS-1$ 146 147 // Constant compound names 148 char[][] JAVA_LANG = {JAVA, LANG}; 149 char[][] JAVA_IO = {JAVA, IO}; 150 char[][] JAVA_LANG_ANNOTATION = {JAVA, LANG, ANNOTATION}; 151 char[][] JAVA_LANG_ANNOTATION_ANNOTATION = {JAVA, LANG, ANNOTATION, "Annotation".toCharArray()}; //$NON-NLS-1$ 152 char[][] JAVA_LANG_ASSERTIONERROR = {JAVA, LANG, "AssertionError".toCharArray()}; //$NON-NLS-1$ 153 char[][] JAVA_LANG_CLASS = {JAVA, LANG, "Class".toCharArray()}; //$NON-NLS-1$ 154 char[][] JAVA_LANG_CLASSNOTFOUNDEXCEPTION = {JAVA, LANG, "ClassNotFoundException".toCharArray()}; //$NON-NLS-1$ 155 char[][] JAVA_LANG_NOSUCHFIELDERROR = {JAVA, LANG, "NoSuchFieldError".toCharArray()}; //$NON-NLS-1$ 156 char[][] JAVA_LANG_CLONEABLE = {JAVA, LANG, "Cloneable".toCharArray()}; //$NON-NLS-1$ 157 char[][] JAVA_LANG_ENUM = {JAVA, LANG, "Enum".toCharArray()}; //$NON-NLS-1$ 158 char[][] JAVA_LANG_EXCEPTION = {JAVA, LANG, "Exception".toCharArray()}; //$NON-NLS-1$ 159 char[][] JAVA_LANG_ERROR = {JAVA, LANG, "Error".toCharArray()}; //$NON-NLS-1$ 160 char[][] JAVA_LANG_ILLEGALARGUMENTEXCEPTION = {JAVA, LANG, "IllegalArgumentException".toCharArray()}; //$NON-NLS-1$ 161 char[][] JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR = {JAVA, LANG, "IncompatibleClassChangeError".toCharArray()}; //$NON-NLS-1$ 162 char[][] JAVA_LANG_ITERABLE = {JAVA, LANG, "Iterable".toCharArray()}; //$NON-NLS-1$ 163 char[][] JAVA_LANG_NOCLASSDEFERROR = {JAVA, LANG, "NoClassDefError".toCharArray()}; //$NON-NLS-1$ 164 char[][] JAVA_LANG_OBJECT = {JAVA, LANG, OBJECT}; 165 char[][] JAVA_LANG_RECORD = {JAVA, LANG, RECORD_CLASS}; 166 char[][] JAVA_LANG_STRING = {JAVA, LANG, "String".toCharArray()}; //$NON-NLS-1$ 167 char[][] JAVA_LANG_STRINGBUFFER = {JAVA, LANG, "StringBuffer".toCharArray()}; //$NON-NLS-1$ 168 char[][] JAVA_LANG_STRINGBUILDER = {JAVA, LANG, "StringBuilder".toCharArray()}; //$NON-NLS-1$ 169 char[][] JAVA_LANG_SYSTEM = {JAVA, LANG, "System".toCharArray()}; //$NON-NLS-1$ 170 char[][] JAVA_LANG_RUNTIMEEXCEPTION = {JAVA, LANG, "RuntimeException".toCharArray()}; //$NON-NLS-1$ 171 char[][] JAVA_LANG_THROWABLE = {JAVA, LANG, "Throwable".toCharArray()}; //$NON-NLS-1$ 172 char[][] JAVA_LANG_REFLECT_CONSTRUCTOR = {JAVA, LANG, REFLECT, "Constructor".toCharArray()}; //$NON-NLS-1$ 173 char[][] JAVA_IO_PRINTSTREAM = {JAVA, IO, "PrintStream".toCharArray()}; //$NON-NLS-1$ 174 char[][] JAVA_IO_SERIALIZABLE = {JAVA, IO, "Serializable".toCharArray()}; //$NON-NLS-1$ 175 char[][] JAVA_LANG_BYTE = {JAVA, LANG, "Byte".toCharArray()}; //$NON-NLS-1$ 176 char[][] JAVA_LANG_SHORT = {JAVA, LANG, "Short".toCharArray()}; //$NON-NLS-1$ 177 char[][] JAVA_LANG_CHARACTER = {JAVA, LANG, "Character".toCharArray()}; //$NON-NLS-1$ 178 char[][] JAVA_LANG_INTEGER = {JAVA, LANG, "Integer".toCharArray()}; //$NON-NLS-1$ 179 char[][] JAVA_LANG_LONG = {JAVA, LANG, "Long".toCharArray()}; //$NON-NLS-1$ 180 char[][] JAVA_LANG_FLOAT = {JAVA, LANG, "Float".toCharArray()}; //$NON-NLS-1$ 181 char[][] JAVA_LANG_DOUBLE = {JAVA, LANG, "Double".toCharArray()}; //$NON-NLS-1$ 182 char[][] JAVA_LANG_BOOLEAN = {JAVA, LANG, "Boolean".toCharArray()}; //$NON-NLS-1$ 183 char[][] JAVA_LANG_VOID = {JAVA, LANG, "Void".toCharArray()}; //$NON-NLS-1$ 184 char[][] JAVA_UTIL_COLLECTION = {JAVA, UTIL, "Collection".toCharArray()}; //$NON-NLS-1$ 185 char[][] JAVA_UTIL_ITERATOR = {JAVA, UTIL, "Iterator".toCharArray()}; //$NON-NLS-1$ 186 char[][] JAVA_UTIL_OBJECTS = {JAVA, UTIL, "Objects".toCharArray()}; //$NON-NLS-1$ 187 char[][] JAVA_UTIL_LIST = {JAVA, UTIL, "List".toCharArray()}; //$NON-NLS-1$ 188 char[][] JAVA_UTIL_ARRAYS = {JAVA, UTIL, "Arrays".toCharArray()}; //$NON-NLS-1$ 189 char[][] JAVA_LANG_DEPRECATED = {JAVA, LANG, "Deprecated".toCharArray()}; //$NON-NLS-1$ 190 char[] FOR_REMOVAL = "forRemoval".toCharArray(); //$NON-NLS-1$ 191 char[] SINCE = "since".toCharArray(); //$NON-NLS-1$ 192 char[][] JAVA_LANG_ANNOTATION_DOCUMENTED = {JAVA, LANG, ANNOTATION, "Documented".toCharArray()}; //$NON-NLS-1$ 193 char[][] JAVA_LANG_ANNOTATION_INHERITED = {JAVA, LANG, ANNOTATION, "Inherited".toCharArray()}; //$NON-NLS-1$ 194 char[][] JAVA_LANG_ANNOTATION_REPEATABLE = {JAVA, LANG, ANNOTATION, "Repeatable".toCharArray()}; //$NON-NLS-1$ 195 char[][] JAVA_LANG_OVERRIDE = {JAVA, LANG, "Override".toCharArray()}; //$NON-NLS-1$ 196 char[][] JAVA_LANG_FUNCTIONAL_INTERFACE = {JAVA, LANG, "FunctionalInterface".toCharArray()}; //$NON-NLS-1$ 197 char[][] JAVA_LANG_ANNOTATION_RETENTION = {JAVA, LANG, ANNOTATION, "Retention".toCharArray()}; //$NON-NLS-1$ 198 char[][] JAVA_LANG_SUPPRESSWARNINGS = {JAVA, LANG, "SuppressWarnings".toCharArray()}; //$NON-NLS-1$ 199 char[][] JAVA_LANG_ANNOTATION_TARGET = {JAVA, LANG, ANNOTATION, "Target".toCharArray()}; //$NON-NLS-1$ 200 char[][] JAVA_LANG_ANNOTATION_RETENTIONPOLICY = {JAVA, LANG, ANNOTATION, "RetentionPolicy".toCharArray()}; //$NON-NLS-1$ 201 char[][] JAVA_LANG_ANNOTATION_ELEMENTTYPE = {JAVA, LANG, ANNOTATION, "ElementType".toCharArray()}; //$NON-NLS-1$ 202 char[][] JAVA_LANG_REFLECT_FIELD = new char[][] {JAVA, LANG, REFLECT, "Field".toCharArray()}; //$NON-NLS-1$ 203 char[][] JAVA_LANG_REFLECT_METHOD = new char[][] {JAVA, LANG, REFLECT, "Method".toCharArray()}; //$NON-NLS-1$ 204 char[][] JAVA_IO_CLOSEABLE = new char[][] { JAVA, IO, "Closeable".toCharArray()};//$NON-NLS-1$ 205 char[][] JAVA_IO_OBJECTSTREAMEXCEPTION = new char[][] { JAVA, IO, "ObjectStreamException".toCharArray()};//$NON-NLS-1$ 206 char[][] JAVA_IO_EXTERNALIZABLE = {JAVA, IO, "Externalizable".toCharArray()}; //$NON-NLS-1$ 207 char[][] JAVA_IO_IOEXCEPTION = new char[][] { JAVA, IO, "IOException".toCharArray()};//$NON-NLS-1$ 208 char[][] JAVA_IO_OBJECTOUTPUTSTREAM = new char[][] { JAVA, IO, "ObjectOutputStream".toCharArray()}; //$NON-NLS-1$ 209 char[][] JAVA_IO_OBJECTINPUTSTREAM = new char[][] { JAVA, IO, "ObjectInputStream".toCharArray()}; //$NON-NLS-1$ 210 char[][] JAVA_NIO_FILE_FILES = new char[][] { JAVA, "nio".toCharArray(), "file".toCharArray(), "Files".toCharArray() }; //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ 211 // javax.rmi.CORBA.Stub 212 char[][] JAVAX_RMI_CORBA_STUB = new char[][] { 213 JAVAX, 214 "rmi".toCharArray(), //$NON-NLS-1$ 215 "CORBA".toCharArray(), //$NON-NLS-1$ 216 "Stub".toCharArray(), //$NON-NLS-1$ 217 }; 218 char[][] JAVA_LANG_SAFEVARARGS = {JAVA, LANG, "SafeVarargs".toCharArray()}; //$NON-NLS-1$ 219 char[] INVOKE = "invoke".toCharArray(); //$NON-NLS-1$ 220 char[][] JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE = { // Signature while parsing binary file 221 JAVA, 222 LANG, 223 INVOKE, 224 "MethodHandle".toCharArray(), //$NON-NLS-1$ 225 "PolymorphicSignature".toCharArray() //$NON-NLS-1$ 226 }; 227 char[][] JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE = { // Signature while parsing source file 228 JAVA, 229 LANG, 230 INVOKE, 231 "MethodHandle$PolymorphicSignature".toCharArray() //$NON-NLS-1$ 232 }; 233 char[][] JAVA_LANG_INVOKE_LAMBDAMETAFACTORY = {JAVA, LANG, INVOKE, "LambdaMetafactory".toCharArray()}; //$NON-NLS-1$ 234 char[][] JAVA_LANG_INVOKE_SERIALIZEDLAMBDA = {JAVA, LANG, INVOKE, "SerializedLambda".toCharArray()}; //$NON-NLS-1$ 235 char[][] JAVA_LANG_INVOKE_METHODHANDLES = {JAVA, LANG, INVOKE, "MethodHandles".toCharArray()}; //$NON-NLS-1$ 236 char[][] JAVA_LANG_AUTOCLOSEABLE = {JAVA, LANG, "AutoCloseable".toCharArray()}; //$NON-NLS-1$ 237 char[] CLOSE = "close".toCharArray(); //$NON-NLS-1$ 238 char[][] JAVA_LANG_RUNTIME_OBJECTMETHODS = {JAVA, LANG, RUNTIME, "ObjectMethods".toCharArray()}; //$NON-NLS-1$ 239 // known helper functions for closing a Closeable (all receive a Closeable as their first argument): 240 public static class CloseMethodRecord { 241 public char[][] typeName; 242 public char[] selector; 243 public int numCloseableArgs; CloseMethodRecord(char[][] typeName, char[] selector, int num)244 public CloseMethodRecord(char[][] typeName, char[] selector, int num) { 245 this.typeName = typeName; 246 this.selector = selector; 247 this.numCloseableArgs = num; 248 } 249 } 250 char[][] GUAVA_CLOSEABLES = { COM, GOOGLE, "common".toCharArray(), IO, "Closeables".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$ 251 char[][] APACHE_IOUTILS = { ORG, APACHE, COMMONS, IO, "IOUtils".toCharArray() }; //$NON-NLS-1$ 252 char[][] APACHE_DBUTILS = { ORG, APACHE, COMMONS, "dbutils".toCharArray(), "DbUtils".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$ 253 char[] CLOSE_QUIETLY = "closeQuietly".toCharArray(); //$NON-NLS-1$ 254 CloseMethodRecord[] closeMethods = new CloseMethodRecord[] { 255 new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE_QUIETLY, 1), 256 new CloseMethodRecord(GUAVA_CLOSEABLES, CLOSE, 1), 257 new CloseMethodRecord(APACHE_IOUTILS, CLOSE_QUIETLY, 1), 258 new CloseMethodRecord(APACHE_DBUTILS, CLOSE, 1), 259 new CloseMethodRecord(APACHE_DBUTILS, CLOSE_QUIETLY, 3), // closeQuietly(Connection,Statement,ResultSet) 260 new CloseMethodRecord(APACHE_DBUTILS, "commitAndClose".toCharArray(), 1), //$NON-NLS-1$ 261 new CloseMethodRecord(APACHE_DBUTILS, "commitAndCloseQuietly".toCharArray(), 1), //$NON-NLS-1$ 262 new CloseMethodRecord(APACHE_DBUTILS, "rollbackAndClose".toCharArray(), 1), //$NON-NLS-1$ 263 new CloseMethodRecord(APACHE_DBUTILS, "rollbackAndCloseQuietly".toCharArray(), 1), //$NON-NLS-1$ 264 }; 265 // white lists of closeables: 266 char[][] JAVA_IO_WRAPPER_CLOSEABLES = new char[][] { 267 "BufferedInputStream".toCharArray(), //$NON-NLS-1$ 268 "BufferedOutputStream".toCharArray(), //$NON-NLS-1$ 269 "BufferedReader".toCharArray(), //$NON-NLS-1$ 270 "BufferedWriter".toCharArray(), //$NON-NLS-1$ 271 "InputStreamReader".toCharArray(), //$NON-NLS-1$ 272 "PrintWriter".toCharArray(), //$NON-NLS-1$ 273 "LineNumberReader".toCharArray(), //$NON-NLS-1$ 274 "DataInputStream".toCharArray(), //$NON-NLS-1$ 275 "DataOutputStream".toCharArray(), //$NON-NLS-1$ 276 "ObjectInputStream".toCharArray(), //$NON-NLS-1$ 277 "ObjectOutputStream".toCharArray(), //$NON-NLS-1$ 278 "FilterInputStream".toCharArray(), //$NON-NLS-1$ 279 "FilterOutputStream".toCharArray(), //$NON-NLS-1$ 280 "DataInputStream".toCharArray(), //$NON-NLS-1$ 281 "DataOutputStream".toCharArray(), //$NON-NLS-1$ 282 "PushbackInputStream".toCharArray(), //$NON-NLS-1$ 283 "SequenceInputStream".toCharArray(), //$NON-NLS-1$ 284 "PrintStream".toCharArray(), //$NON-NLS-1$ 285 "PushbackReader".toCharArray(), //$NON-NLS-1$ 286 "OutputStreamWriter".toCharArray(), //$NON-NLS-1$ 287 }; 288 char[][] JAVA_UTIL_ZIP_WRAPPER_CLOSEABLES = new char[][] { 289 "GZIPInputStream".toCharArray(), //$NON-NLS-1$ 290 "InflaterInputStream".toCharArray(), //$NON-NLS-1$ 291 "DeflaterInputStream".toCharArray(), //$NON-NLS-1$ 292 "CheckedInputStream".toCharArray(), //$NON-NLS-1$ 293 "ZipInputStream".toCharArray(), //$NON-NLS-1$ 294 "JarInputStream".toCharArray(), //$NON-NLS-1$ 295 "GZIPOutputStream".toCharArray(), //$NON-NLS-1$ 296 "InflaterOutputStream".toCharArray(), //$NON-NLS-1$ 297 "DeflaterOutputStream".toCharArray(), //$NON-NLS-1$ 298 "CheckedOutputStream".toCharArray(), //$NON-NLS-1$ 299 "ZipOutputStream".toCharArray(), //$NON-NLS-1$ 300 "JarOutputStream".toCharArray(), //$NON-NLS-1$ 301 }; 302 char[][][] OTHER_WRAPPER_CLOSEABLES = new char[][][] { 303 {JAVA, "security".toCharArray(), "DigestInputStream".toCharArray()}, //$NON-NLS-1$ //$NON-NLS-2$ 304 {JAVA, "security".toCharArray(), "DigestOutputStream".toCharArray()}, //$NON-NLS-1$ //$NON-NLS-2$ 305 {JAVA, "beans".toCharArray(), "XMLEncoder".toCharArray()}, //$NON-NLS-1$ //$NON-NLS-2$ 306 {JAVA, "beans".toCharArray(), "XMLDecoder".toCharArray()}, //$NON-NLS-1$ //$NON-NLS-2$ 307 {JAVAX, "sound".toCharArray(), "sampled".toCharArray(), "AudioInputStream".toCharArray()}, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 308 }; 309 char[][] JAVA_IO_RESOURCE_FREE_CLOSEABLES = new char[][] { 310 "StringReader".toCharArray(), //$NON-NLS-1$ 311 "StringWriter".toCharArray(), //$NON-NLS-1$ 312 "ByteArrayInputStream".toCharArray(), //$NON-NLS-1$ 313 "ByteArrayOutputStream".toCharArray(), //$NON-NLS-1$ 314 "CharArrayReader".toCharArray(), //$NON-NLS-1$ 315 "CharArrayWriter".toCharArray(), //$NON-NLS-1$ 316 "StringBufferInputStream".toCharArray(), //$NON-NLS-1$ 317 }; 318 char[][] JAVA_UTIL_STREAM = { JAVA, UTIL, "stream".toCharArray() }; //$NON-NLS-1$ 319 char[][] RESOURCE_FREE_CLOSEABLE_J_U_STREAMS = { 320 "Stream".toCharArray(), //$NON-NLS-1$ 321 "DoubleStream".toCharArray(), //$NON-NLS-1$ 322 "LongStream".toCharArray(), //$NON-NLS-1$ 323 "IntStream".toCharArray() //$NON-NLS-1$ 324 }; 325 326 // closeable classes containing one or more 'fluent' methods (returning 'this'): 327 char[] CHANNELS = "channels".toCharArray(); //$NON-NLS-1$ 328 char[][][] FLUENT_RESOURCE_CLASSES = { 329 new char[][] {JAVA, IO, "CharArrayWriter".toCharArray() }, //$NON-NLS-1$ 330 new char[][] {JAVA, IO, "Console".toCharArray() }, //$NON-NLS-1$ 331 new char[][] {JAVA, IO, "PrintStream".toCharArray() }, //$NON-NLS-1$ 332 new char[][] {JAVA, IO, "PrintWriter".toCharArray() }, //$NON-NLS-1$ 333 new char[][] {JAVA, IO, "StringWriter".toCharArray() }, //$NON-NLS-1$ 334 new char[][] {JAVA, IO, "Writer".toCharArray() }, //$NON-NLS-1$ 335 new char[][] {JAVA, NIO, CHANNELS, "AsynchronousFileChannel".toCharArray() }, //$NON-NLS-1$ 336 new char[][] {JAVA, NIO, CHANNELS, "AsynchronousServerSocketChannel".toCharArray() }, //$NON-NLS-1$ 337 new char[][] {JAVA, NIO, CHANNELS, "FileChannel".toCharArray() }, //$NON-NLS-1$ 338 new char[][] {JAVA, NIO, CHANNELS, "NetworkChannel".toCharArray() }, //$NON-NLS-1$ 339 new char[][] {JAVA, NIO, CHANNELS, "SeekableByteChannel".toCharArray() }, //$NON-NLS-1$ 340 new char[][] {JAVA, NIO, CHANNELS, "SelectableChannel".toCharArray() }, //$NON-NLS-1$ 341 new char[][] {JAVA, NIO, CHANNELS, "Selector".toCharArray() }, //$NON-NLS-1$ 342 new char[][] {JAVA, NIO, CHANNELS, "ServerSocketChannel".toCharArray() }, //$NON-NLS-1$ 343 new char[][] {JAVA, UTIL, "Formatter".toCharArray() }, //$NON-NLS-1$ 344 new char[][] {JAVA, UTIL, "Scanner".toCharArray() }, //$NON-NLS-1$ 345 }; 346 347 // different assertion utilities: 348 char[] ASSERT_CLASS = "Assert".toCharArray(); //$NON-NLS-1$ 349 char[][] ORG_ECLIPSE_CORE_RUNTIME_ASSERT = new char[][] { ORG, ECLIPSE, CORE, RUNTIME, ASSERT_CLASS }; 350 // ... methods: 351 char[] IS_NOTNULL = "isNotNull".toCharArray(); //$NON-NLS-1$ 352 353 char[] JUNIT = "junit".toCharArray(); //$NON-NLS-1$ 354 char[] FRAMEWORK = "framework".toCharArray(); //$NON-NLS-1$ 355 char[] JUPITER = "jupiter".toCharArray(); //$NON-NLS-1$ 356 char[] PARAMS = "params".toCharArray(); //$NON-NLS-1$ 357 char[] PROVIDER = "provider".toCharArray(); //$NON-NLS-1$ 358 char[][] JUNIT_FRAMEWORK_ASSERT = new char[][] { JUNIT, FRAMEWORK, ASSERT_CLASS }; 359 char[][] ORG_JUNIT_ASSERT = new char[][] { ORG, JUNIT, ASSERT_CLASS }; 360 // ... methods: 361 char[] ASSERT_NULL = "assertNull".toCharArray(); //$NON-NLS-1$ 362 char[] ASSERT_NOTNULL = "assertNotNull".toCharArray(); //$NON-NLS-1$ 363 char[] ASSERT_TRUE = "assertTrue".toCharArray(); //$NON-NLS-1$ 364 char[] ASSERT_FALSE = "assertFalse".toCharArray(); //$NON-NLS-1$ 365 // ... annotations: 366 char[] METHOD_SOURCE = "MethodSource".toCharArray(); //$NON-NLS-1$ 367 char[][] ORG_JUNIT_METHOD_SOURCE = new char[][] { ORG, JUNIT, JUPITER, PARAMS, PROVIDER, METHOD_SOURCE }; 368 369 char[] VALIDATE_CLASS = "Validate".toCharArray(); //$NON-NLS-1$ 370 char[][] ORG_APACHE_COMMONS_LANG_VALIDATE = new char[][] { ORG, APACHE, COMMONS, LANG, VALIDATE_CLASS }; 371 char[][] ORG_APACHE_COMMONS_LANG3_VALIDATE = new char[][] { ORG, APACHE, COMMONS, LANG3, VALIDATE_CLASS }; 372 char[][] ORG_ECLIPSE_JDT_INTERNAL_COMPILER_LOOKUP_TYPEBINDING = new char[][] { ORG, ECLIPSE, JDT, INTERNAL, COMPILER, LOOKUP, TYPEBINDING }; 373 char[][] ORG_ECLIPSE_JDT_CORE_DOM_ITYPEBINDING = new char[][] { ORG, ECLIPSE, JDT, CORE, DOM, ITYPEBINDING }; 374 375 // ... methods: 376 char[] IS_TRUE = "isTrue".toCharArray(); //$NON-NLS-1$ 377 char[] NOT_NULL = "notNull".toCharArray(); //$NON-NLS-1$ 378 379 char[][] COM_GOOGLE_COMMON_BASE_PRECONDITIONS = new char[][] { 380 COM, GOOGLE, "common".toCharArray(), "base".toCharArray(), "Preconditions".toCharArray() }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 381 // ... methods: 382 char[] CHECK_NOT_NULL = "checkNotNull".toCharArray(); //$NON-NLS-1$ 383 char[] CHECK_ARGUMENT = "checkArgument".toCharArray(); //$NON-NLS-1$ 384 char[] CHECK_STATE = "checkState".toCharArray(); //$NON-NLS-1$ 385 386 // ... methods in java.util.Objects: 387 char[] REQUIRE_NON_NULL = "requireNonNull".toCharArray(); //$NON-NLS-1$ 388 389 // different @Inject annotations are relevant for @NonNull fields 390 char[] INJECT_PACKAGE = "inject".toCharArray(); //$NON-NLS-1$ 391 char[] INJECT_TYPE = "Inject".toCharArray(); //$NON-NLS-1$ 392 char[][] JAVAX_ANNOTATION_INJECT_INJECT = new char[][] { JAVAX, INJECT_PACKAGE, INJECT_TYPE }; 393 char[][] COM_GOOGLE_INJECT_INJECT = new char[][] {COM, GOOGLE, INJECT_PACKAGE, INJECT_TYPE }; 394 // detail for the above: 395 char[] OPTIONAL = "optional".toCharArray(); //$NON-NLS-1$ 396 397 // utils that ensure argument is nonnull if result is true 398 // java.lang.Class: 399 char[] IS_INSTANCE = "isInstance".toCharArray(); //$NON-NLS-1$ 400 // java.lang.Objects: 401 char[] NON_NULL = "nonNull".toCharArray(); //$NON-NLS-1$ 402 char[] IS_NULL = "isNull".toCharArray(); //$NON-NLS-1$ 403 404 // well-known methods with "dangerous" signatures: 405 char[][] JAVA_UTIL_MAP = new char[][] { JAVA, UTIL, "Map".toCharArray() }; //$NON-NLS-1$ 406 char[] GET = "get".toCharArray(); //$NON-NLS-1$ 407 char[] REMOVE = "remove".toCharArray(); //$NON-NLS-1$ 408 char[] REMOVE_ALL = "removeAll".toCharArray(); //$NON-NLS-1$ 409 char[] CONTAINS_ALL = "containsAll".toCharArray(); //$NON-NLS-1$ 410 char[] RETAIN_ALL = "retainAll".toCharArray(); //$NON-NLS-1$ 411 char[] CONTAINS_KEY = "containsKey".toCharArray(); //$NON-NLS-1$ 412 char[] CONTAINS_VALUE = "containsValue".toCharArray(); //$NON-NLS-1$ 413 // for Collection.contains: 414 char[] CONTAINS = "contains".toCharArray(); //$NON-NLS-1$ 415 // for List.*indexOf: 416 char[] INDEX_OF = "indexOf".toCharArray(); //$NON-NLS-1$ 417 char[] LAST_INDEX_OF = "lastIndexOf".toCharArray(); //$NON-NLS-1$ 418 enum DangerousMethod { 419 // Collection: 420 Contains, Remove, RemoveAll, ContainsAll, RetainAll, 421 // Map: 422 Get, ContainsKey, ContainsValue, 423 // List: 424 IndexOf, LastIndexOf, 425 // Object: 426 Equals; 427 detectSelector(char[] selector)428 public static DangerousMethod detectSelector(char[] selector) { 429 switch (selector[0]) { 430 case 'r': 431 if (CharOperation.prefixEquals(TypeConstants.REMOVE, selector)) { 432 if (CharOperation.equals(selector, TypeConstants.REMOVE)) 433 return DangerousMethod.Remove; 434 else if (CharOperation.equals(selector, TypeConstants.REMOVE_ALL)) 435 return DangerousMethod.RemoveAll; 436 } else if (CharOperation.equals(selector, TypeConstants.RETAIN_ALL)) { 437 return DangerousMethod.RetainAll; 438 } 439 break; 440 case 'c': 441 if (CharOperation.prefixEquals(TypeConstants.CONTAINS, selector)) { 442 if (CharOperation.equals(selector, TypeConstants.CONTAINS)) 443 return DangerousMethod.Contains; 444 else if (CharOperation.equals(selector, TypeConstants.CONTAINS_ALL)) 445 return DangerousMethod.ContainsAll; 446 else if (CharOperation.equals(selector, TypeConstants.CONTAINS_KEY)) 447 return DangerousMethod.ContainsKey; 448 else if (CharOperation.equals(selector, TypeConstants.CONTAINS_VALUE)) 449 return DangerousMethod.ContainsValue; 450 } 451 break; 452 case 'g': 453 if (CharOperation.equals(selector, TypeConstants.GET)) 454 return DangerousMethod.Get; 455 break; 456 case 'i': 457 if (CharOperation.equals(selector, TypeConstants.INDEX_OF)) 458 return DangerousMethod.IndexOf; 459 break; 460 case 'l': 461 if (CharOperation.equals(selector, TypeConstants.LAST_INDEX_OF)) 462 return DangerousMethod.LastIndexOf; 463 break; 464 case 'e': 465 if (CharOperation.equals(selector, TypeConstants.EQUALS)) 466 return DangerousMethod.Equals; 467 break; 468 } 469 return null; 470 } 471 } 472 473 // Spring @Autowired annotation 474 char [] AUTOWIRED = "Autowired".toCharArray(); //$NON-NLS-1$ 475 char [] BEANS = "beans".toCharArray(); //$NON-NLS-1$ 476 char [] FACTORY = "factory".toCharArray(); //$NON-NLS-1$ 477 char[][] ORG_SPRING_AUTOWIRED = new char[][] {ORG, SPRING, BEANS, FACTORY, ANNOTATION, AUTOWIRED}; 478 char[] REQUIRED = "required".toCharArray(); //$NON-NLS-1$ 479 480 // Constraints for generic type argument inference 481 int CONSTRAINT_EQUAL = 0; // Actual = Formal 482 int CONSTRAINT_EXTENDS = 1; // Actual << Formal 483 int CONSTRAINT_SUPER = 2; // Actual >> Formal 484 485 // status of bound checks 486 public static enum BoundCheckStatus { 487 OK, NULL_PROBLEM, UNCHECKED, MISMATCH; 488 /** true if no problem or only a null problem. */ isOKbyJLS()489 boolean isOKbyJLS() { 490 switch (this) { 491 case OK: 492 case NULL_PROBLEM: 493 return true; 494 default: 495 return false; 496 } 497 } betterOf(BoundCheckStatus other)498 public BoundCheckStatus betterOf(BoundCheckStatus other) { 499 if (this.ordinal() < other.ordinal()) 500 return this; 501 return other; 502 } 503 } 504 505 // Synthetics 506 char[] INIT = "<init>".toCharArray(); //$NON-NLS-1$ 507 char[] CLINIT = "<clinit>".toCharArray(); //$NON-NLS-1$ 508 char[] SYNTHETIC_SWITCH_ENUM_TABLE = "$SWITCH_TABLE$".toCharArray(); //$NON-NLS-1$ 509 char[] SYNTHETIC_ENUM_VALUES = "ENUM$VALUES".toCharArray(); //$NON-NLS-1$ 510 char[] SYNTHETIC_ASSERT_DISABLED = "$assertionsDisabled".toCharArray(); //$NON-NLS-1$ 511 char[] SYNTHETIC_CLASS = "class$".toCharArray(); //$NON-NLS-1$ 512 char[] SYNTHETIC_OUTER_LOCAL_PREFIX = "val$".toCharArray(); //$NON-NLS-1$ 513 char[] SYNTHETIC_ENCLOSING_INSTANCE_PREFIX = "this$".toCharArray(); //$NON-NLS-1$ 514 char[] SYNTHETIC_ACCESS_METHOD_PREFIX = "access$".toCharArray(); //$NON-NLS-1$ 515 char[] SYNTHETIC_ENUM_CONSTANT_INITIALIZATION_METHOD_PREFIX = " enum constant initialization$".toCharArray(); //$NON-NLS-1$ 516 char[] SYNTHETIC_STATIC_FACTORY = "<factory>".toCharArray(); //$NON-NLS-1$ 517 518 // constants in enum org.eclipse.jdt.annotation.DefaultLocation: 519 char[] DEFAULT_LOCATION__PARAMETER = "PARAMETER".toCharArray(); //$NON-NLS-1$ 520 char[] DEFAULT_LOCATION__RETURN_TYPE = "RETURN_TYPE".toCharArray(); //$NON-NLS-1$ 521 char[] DEFAULT_LOCATION__FIELD = "FIELD".toCharArray(); //$NON-NLS-1$ 522 char[] DEFAULT_LOCATION__TYPE_ARGUMENT = "TYPE_ARGUMENT".toCharArray(); //$NON-NLS-1$ 523 char[] DEFAULT_LOCATION__TYPE_PARAMETER = "TYPE_PARAMETER".toCharArray(); //$NON-NLS-1$ 524 char[] DEFAULT_LOCATION__TYPE_BOUND = "TYPE_BOUND".toCharArray(); //$NON-NLS-1$ 525 char[] DEFAULT_LOCATION__ARRAY_CONTENTS = "ARRAY_CONTENTS".toCharArray(); //$NON-NLS-1$ 526 527 528 // synthetic package-info name 529 public static final char[] PACKAGE_INFO_NAME = "package-info".toCharArray(); //$NON-NLS-1$ 530 public static final char[] MODULE_INFO_NAME = "module-info".toCharArray(); //$NON-NLS-1$ 531 public static final String MODULE_INFO_NAME_STRING = "module-info"; //$NON-NLS-1$ 532 public static final char[] MODULE_INFO_FILE_NAME = "module-info.java".toCharArray(); //$NON-NLS-1$ 533 public static final char[] MODULE_INFO_CLASS_NAME = "module-info.class".toCharArray(); //$NON-NLS-1$ 534 public static final String MODULE_INFO_FILE_NAME_STRING = "module-info.java"; //$NON-NLS-1$ 535 public static final String MODULE_INFO_CLASS_NAME_STRING = "module-info.class"; //$NON-NLS-1$ 536 // java.base module name 537 char[] JAVA_BASE = "java.base".toCharArray(); //$NON-NLS-1$ 538 String META_INF_MANIFEST_MF = "META-INF/MANIFEST.MF"; //$NON-NLS-1$ 539 String AUTOMATIC_MODULE_NAME = "Automatic-Module-Name"; //$NON-NLS-1$ 540 } 541