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