From 0e8f8fb5a77037cdbdc75c768599369a13d1e44a Mon Sep 17 00:00:00 2001 From: idrissrio Date: Mon, 21 Jul 2025 14:20:33 +0200 Subject: [PATCH 1/6] Java: Add `MODULEIMPORT` to dbscheme --- java/ql/lib/config/semmlecode.dbscheme | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java/ql/lib/config/semmlecode.dbscheme b/java/ql/lib/config/semmlecode.dbscheme index 1b8f5f4c747e..1da2b6556cd0 100644 --- a/java/ql/lib/config/semmlecode.dbscheme +++ b/java/ql/lib/config/semmlecode.dbscheme @@ -588,6 +588,14 @@ imports( unique int id: @import, int holder: @classorinterfaceorpackage ref, string name: string ref, + /* kind: + 1 = TYPE + 2 = TYPEWILDCARD + 3 = PACKAGEWILDCARD + 4 = TYPEWILDCARDSTATIC + 5 = TYPEMEMBERSTATIC + 6 = MODULEIMPORT + */ int kind: int ref ); From 91c6dfb32544651aece69c266304a145de34660b Mon Sep 17 00:00:00 2001 From: idrissrio Date: Mon, 21 Jul 2025 14:21:30 +0200 Subject: [PATCH 2/6] Java: Add `ModuleImportDeclaration` QL class --- java/ql/lib/semmle/code/java/Import.qll | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/java/ql/lib/semmle/code/java/Import.qll b/java/ql/lib/semmle/code/java/Import.qll index aed041155555..19505e82a0bf 100644 --- a/java/ql/lib/semmle/code/java/Import.qll +++ b/java/ql/lib/semmle/code/java/Import.qll @@ -154,3 +154,38 @@ class ImportStaticTypeMember extends Import { override string getAPrimaryQlClass() { result = "ImportStaticTypeMember" } } + +/** + * A module import declaration, which imports an entire module. + * + * For example, `import module java.base;`. + */ +class ModuleImportDeclaration extends Import { + ModuleImportDeclaration() { imports(this, _, _, 6) } + + /** Gets the name of the imported module. */ + string getModuleName() { imports(this, _, result, _) } + + /** Gets the imported module. */ + Module getModule() { result.getName() = this.getModuleName() } + + /** Gets an exported package from the imported module. */ + Package getAnImportedPackage() { + exists(ExportsDirective exports | + exports = this.getModule().getADirective() and + result = exports.getExportedPackage() + ) + } + + /** Gets a type that is imported from the module. */ + RefType getAnImportedType() { + exists(Package pkg | + pkg = this.getAnImportedPackage() and + result.getPackage() = pkg + ) + } + + override string toString() { result = "import module " + this.getModuleName() } + + override string getAPrimaryQlClass() { result = "ModuleImportDeclaration" } +} From 0e17991959faf1653d4c650d294c00eb8f9b1bff Mon Sep 17 00:00:00 2001 From: idrissrio Date: Mon, 21 Jul 2025 14:27:49 +0200 Subject: [PATCH 3/6] Java: Add module import declaration test --- .../ImportedPackage.expected | 61 + .../ImportedPackage.ql | 4 + .../ImportedType.expected | 1513 +++++++++++++++++ .../ImportedType.ql | 4 + .../module-import-declarations/Test.java | 6 + .../module-import-declarations/options | 1 + 6 files changed, 1589 insertions(+) create mode 100644 java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected create mode 100644 java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql create mode 100644 java/ql/test/library-tests/module-import-declarations/ImportedType.expected create mode 100644 java/ql/test/library-tests/module-import-declarations/ImportedType.ql create mode 100644 java/ql/test/library-tests/module-import-declarations/Test.java create mode 100644 java/ql/test/library-tests/module-import-declarations/options diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected new file mode 100644 index 000000000000..64eef6870110 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected @@ -0,0 +1,61 @@ +| java.base | java.io | +| java.base | java.lang | +| java.base | java.lang.annotation | +| java.base | java.lang.classfile | +| java.base | java.lang.classfile.attribute | +| java.base | java.lang.classfile.constantpool | +| java.base | java.lang.classfile.instruction | +| java.base | java.lang.constant | +| java.base | java.lang.foreign | +| java.base | java.lang.invoke | +| java.base | java.lang.module | +| java.base | java.lang.ref | +| java.base | java.lang.reflect | +| java.base | java.lang.runtime | +| java.base | java.math | +| java.base | java.net | +| java.base | java.net.spi | +| java.base | java.nio | +| java.base | java.nio.channels | +| java.base | java.nio.channels.spi | +| java.base | java.nio.charset | +| java.base | java.nio.charset.spi | +| java.base | java.nio.file | +| java.base | java.nio.file.attribute | +| java.base | java.nio.file.spi | +| java.base | java.security | +| java.base | java.security.cert | +| java.base | java.security.interfaces | +| java.base | java.security.spec | +| java.base | java.text | +| java.base | java.text.spi | +| java.base | java.time | +| java.base | java.time.chrono | +| java.base | java.time.format | +| java.base | java.time.temporal | +| java.base | java.time.zone | +| java.base | java.util | +| java.base | java.util.concurrent | +| java.base | java.util.concurrent.atomic | +| java.base | java.util.concurrent.locks | +| java.base | java.util.function | +| java.base | java.util.jar | +| java.base | java.util.random | +| java.base | java.util.regex | +| java.base | java.util.spi | +| java.base | java.util.stream | +| java.base | java.util.zip | +| java.base | javax.crypto | +| java.base | javax.crypto.interfaces | +| java.base | javax.crypto.spec | +| java.base | javax.net | +| java.base | javax.net.ssl | +| java.base | javax.security.auth | +| java.base | javax.security.auth.callback | +| java.base | javax.security.auth.login | +| java.base | javax.security.auth.spi | +| java.base | javax.security.auth.x500 | +| java.base | javax.security.cert | +| java.base | jdk.internal.event | +| java.base | jdk.internal.javac | +| java.base | jdk.internal.vm.vector | diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql new file mode 100644 index 000000000000..797cabfd5462 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql @@ -0,0 +1,4 @@ +import java + +from ModuleImportDeclaration mid +select mid.getModuleName(), mid.getAnImportedPackage().getName() diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedType.expected b/java/ql/test/library-tests/module-import-declarations/ImportedType.expected new file mode 100644 index 000000000000..cf9064b60524 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedType.expected @@ -0,0 +1,1513 @@ +| java.base | java.io.BufferedReader | +| java.base | java.io.BufferedWriter | +| java.base | java.io.Closeable | +| java.base | java.io.File | +| java.base | java.io.FileDescriptor | +| java.base | java.io.FileFilter | +| java.base | java.io.FileNotFoundException | +| java.base | java.io.FilenameFilter | +| java.base | java.io.FilterOutputStream | +| java.base | java.io.Flushable | +| java.base | java.io.IOException | +| java.base | java.io.InputStream | +| java.base | java.io.InvalidObjectException | +| java.base | java.io.ObjectStreamException | +| java.base | java.io.OutputStream | +| java.base | java.io.PrintStream | +| java.base | java.io.PrintWriter | +| java.base | java.io.Reader | +| java.base | java.io.Serializable | +| java.base | java.io.SyncFailedException | +| java.base | java.io.UnsupportedEncodingException | +| java.base | java.io.Writer | +| java.base | java.lang.A | +| java.base | java.lang.AbstractStringBuilder | +| java.base | java.lang.Appendable | +| java.base | java.lang.AutoCloseable | +| java.base | java.lang.Boolean | +| java.base | java.lang.CharSequence | +| java.base | java.lang.Character | +| java.base | java.lang.Class | +| java.base | java.lang.Class<> | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.ClassFormatError | +| java.base | java.lang.ClassLoader | +| java.base | java.lang.ClassNotFoundException | +| java.base | java.lang.CloneNotSupportedException | +| java.base | java.lang.Cloneable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable<> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Deprecated | +| java.base | java.lang.Double | +| java.base | java.lang.E | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc<> | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum<> | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Error | +| java.base | java.lang.Exception | +| java.base | java.lang.Float | +| java.base | java.lang.FunctionalInterface | +| java.base | java.lang.IllegalAccessException | +| java.base | java.lang.IllegalArgumentException | +| java.base | java.lang.IllegalStateException | +| java.base | java.lang.InstantiationException | +| java.base | java.lang.Integer | +| java.base | java.lang.InterruptedException | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable<> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.LinkageError | +| java.base | java.lang.Long | +| java.base | java.lang.Module | +| java.base | java.lang.ModuleLayer | +| java.base | java.lang.ModuleLayer$Controller | +| java.base | java.lang.NamedPackage | +| java.base | java.lang.NoSuchFieldException | +| java.base | java.lang.NoSuchMethodException | +| java.base | java.lang.Number | +| java.base | java.lang.NumberFormatException | +| java.base | java.lang.Object | +| java.base | java.lang.Package | +| java.base | java.lang.Process | +| java.base | java.lang.ProcessHandle | +| java.base | java.lang.ProcessHandle$Info | +| java.base | java.lang.R | +| java.base | java.lang.Readable | +| java.base | java.lang.Record | +| java.base | java.lang.ReflectiveOperationException | +| java.base | java.lang.Runnable | +| java.base | java.lang.Runtime | +| java.base | java.lang.Runtime$Version | +| java.base | java.lang.RuntimeException | +| java.base | java.lang.SafeVarargs | +| java.base | java.lang.SecurityException | +| java.base | java.lang.StackTraceElement | +| java.base | java.lang.String | +| java.base | java.lang.StringBuffer | +| java.base | java.lang.StringBuilder | +| java.base | java.lang.T | +| java.base | java.lang.Thread | +| java.base | java.lang.Thread$Builder | +| java.base | java.lang.Thread$Builder$OfPlatform | +| java.base | java.lang.Thread$Builder$OfVirtual | +| java.base | java.lang.Thread$State | +| java.base | java.lang.Thread$UncaughtExceptionHandler | +| java.base | java.lang.ThreadBuilders | +| java.base | java.lang.ThreadBuilders$BaseThreadBuilder | +| java.base | java.lang.ThreadBuilders$PlatformThreadBuilder | +| java.base | java.lang.ThreadBuilders$VirtualThreadBuilder | +| java.base | java.lang.ThreadGroup | +| java.base | java.lang.Throwable | +| java.base | java.lang.TypeNotPresentException | +| java.base | java.lang.U | +| java.base | java.lang.Void | +| java.base | java.lang.annotation.Annotation | +| java.base | java.lang.annotation.Documented | +| java.base | java.lang.annotation.ElementType | +| java.base | java.lang.annotation.Retention | +| java.base | java.lang.annotation.RetentionPolicy | +| java.base | java.lang.annotation.Target | +| java.base | java.lang.constant.AsTypeMethodHandleDesc | +| java.base | java.lang.constant.ClassDesc | +| java.base | java.lang.constant.Constable | +| java.base | java.lang.constant.ConstantDesc | +| java.base | java.lang.constant.DirectMethodHandleDesc | +| java.base | java.lang.constant.DirectMethodHandleDesc$Kind | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc<> | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc> | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.MethodHandleDesc | +| java.base | java.lang.constant.MethodTypeDesc | +| java.base | java.lang.constant.T | +| java.base | java.lang.foreign.AddressLayout | +| java.base | java.lang.foreign.Arena | +| java.base | java.lang.foreign.GroupLayout | +| java.base | java.lang.foreign.MemoryLayout | +| java.base | java.lang.foreign.MemoryLayout$PathElement | +| java.base | java.lang.foreign.MemorySegment | +| java.base | java.lang.foreign.MemorySegment$Scope | +| java.base | java.lang.foreign.PaddingLayout | +| java.base | java.lang.foreign.SegmentAllocator | +| java.base | java.lang.foreign.SequenceLayout | +| java.base | java.lang.foreign.StructLayout | +| java.base | java.lang.foreign.UnionLayout | +| java.base | java.lang.foreign.ValueLayout | +| java.base | java.lang.foreign.ValueLayout$OfBoolean | +| java.base | java.lang.foreign.ValueLayout$OfByte | +| java.base | java.lang.foreign.ValueLayout$OfChar | +| java.base | java.lang.foreign.ValueLayout$OfDouble | +| java.base | java.lang.foreign.ValueLayout$OfFloat | +| java.base | java.lang.foreign.ValueLayout$OfInt | +| java.base | java.lang.foreign.ValueLayout$OfLong | +| java.base | java.lang.foreign.ValueLayout$OfShort | +| java.base | java.lang.invoke.BoundMethodHandle | +| java.base | java.lang.invoke.DelegatingMethodHandle | +| java.base | java.lang.invoke.DirectMethodHandle | +| java.base | java.lang.invoke.DirectMethodHandle$Accessor | +| java.base | java.lang.invoke.DirectMethodHandle$Constructor | +| java.base | java.lang.invoke.DirectMethodHandle$Interface | +| java.base | java.lang.invoke.DirectMethodHandle$Special | +| java.base | java.lang.invoke.DirectMethodHandle$StaticAccessor | +| java.base | java.lang.invoke.F | +| java.base | java.lang.invoke.IndirectVarHandle | +| java.base | java.lang.invoke.LambdaForm | +| java.base | java.lang.invoke.LazyInitializingVarHandle | +| java.base | java.lang.invoke.M | +| java.base | java.lang.invoke.MethodHandle | +| java.base | java.lang.invoke.MethodHandleImpl | +| java.base | java.lang.invoke.MethodHandleImpl$AsVarargsCollector | +| java.base | java.lang.invoke.MethodHandleImpl$CountingWrapper | +| java.base | java.lang.invoke.MethodHandleImpl$IntrinsicMethodHandle | +| java.base | java.lang.invoke.MethodHandleImpl$WrappedMember | +| java.base | java.lang.invoke.MethodHandleInfo | +| java.base | java.lang.invoke.MethodHandles | +| java.base | java.lang.invoke.MethodHandles$Lookup | +| java.base | java.lang.invoke.MethodHandles$Lookup$ClassOption | +| java.base | java.lang.invoke.MethodType | +| java.base | java.lang.invoke.NativeMethodHandle | +| java.base | java.lang.invoke.SegmentVarHandle | +| java.base | java.lang.invoke.T | +| java.base | java.lang.invoke.TypeDescriptor | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfField<> | +| java.base | java.lang.invoke.TypeDescriptor$OfField> | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod<> | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod,MethodType> | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod | +| java.base | java.lang.invoke.VarForm | +| java.base | java.lang.invoke.VarHandle | +| java.base | java.lang.invoke.VarHandle$AccessMode | +| java.base | java.lang.invoke.VarHandle$VarHandleDesc | +| java.base | java.lang.invoke.VarHandleBooleans | +| java.base | java.lang.invoke.VarHandleBooleans$Array | +| java.base | java.lang.invoke.VarHandleBooleans$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleBooleans$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleBooleans$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleBooleans$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayBase | +| java.base | java.lang.invoke.VarHandleBytes | +| java.base | java.lang.invoke.VarHandleBytes$Array | +| java.base | java.lang.invoke.VarHandleBytes$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleBytes$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleBytes$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleBytes$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleChars | +| java.base | java.lang.invoke.VarHandleChars$Array | +| java.base | java.lang.invoke.VarHandleChars$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleChars$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleChars$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleChars$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleDoubles | +| java.base | java.lang.invoke.VarHandleDoubles$Array | +| java.base | java.lang.invoke.VarHandleDoubles$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleDoubles$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleDoubles$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleDoubles$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleFloats | +| java.base | java.lang.invoke.VarHandleFloats$Array | +| java.base | java.lang.invoke.VarHandleFloats$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleFloats$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleFloats$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleFloats$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleInts | +| java.base | java.lang.invoke.VarHandleInts$Array | +| java.base | java.lang.invoke.VarHandleInts$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleInts$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleInts$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleInts$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleLongs | +| java.base | java.lang.invoke.VarHandleLongs$Array | +| java.base | java.lang.invoke.VarHandleLongs$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleLongs$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleLongs$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleLongs$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleReferences | +| java.base | java.lang.invoke.VarHandleReferences$Array | +| java.base | java.lang.invoke.VarHandleReferences$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleReferences$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleReferences$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleShorts | +| java.base | java.lang.invoke.VarHandleShorts$Array | +| java.base | java.lang.invoke.VarHandleShorts$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleShorts$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleShorts$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleShorts$FieldStaticReadWrite | +| java.base | java.lang.module.Configuration | +| java.base | java.lang.module.ModuleDescriptor | +| java.base | java.lang.module.ModuleDescriptor$Builder | +| java.base | java.lang.module.ModuleDescriptor$Exports | +| java.base | java.lang.module.ModuleDescriptor$Exports$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Opens | +| java.base | java.lang.module.ModuleDescriptor$Opens$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Provides | +| java.base | java.lang.module.ModuleDescriptor$Requires | +| java.base | java.lang.module.ModuleDescriptor$Requires$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Version | +| java.base | java.lang.module.ModuleFinder | +| java.base | java.lang.module.ModuleReader | +| java.base | java.lang.module.ModuleReference | +| java.base | java.lang.module.ResolvedModule | +| java.base | java.lang.ref.Cleaner | +| java.base | java.lang.ref.Cleaner$Cleanable | +| java.base | java.lang.reflect.AccessFlag | +| java.base | java.lang.reflect.AccessFlag$Location | +| java.base | java.lang.reflect.AccessibleObject | +| java.base | java.lang.reflect.AnnotatedElement | +| java.base | java.lang.reflect.AnnotatedType | +| java.base | java.lang.reflect.ClassFileFormatVersion | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.Constructor<> | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.D | +| java.base | java.lang.reflect.Executable | +| java.base | java.lang.reflect.Field | +| java.base | java.lang.reflect.GenericDeclaration | +| java.base | java.lang.reflect.InvocationTargetException | +| java.base | java.lang.reflect.Member | +| java.base | java.lang.reflect.Method | +| java.base | java.lang.reflect.Parameter | +| java.base | java.lang.reflect.RecordComponent | +| java.base | java.lang.reflect.T | +| java.base | java.lang.reflect.Type | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable<> | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.math.BigInteger | +| java.base | java.net.ContentHandler | +| java.base | java.net.ContentHandlerFactory | +| java.base | java.net.FileNameMap | +| java.base | java.net.Inet4Address | +| java.base | java.net.Inet6Address | +| java.base | java.net.InetAddress | +| java.base | java.net.InterfaceAddress | +| java.base | java.net.MalformedURLException | +| java.base | java.net.NetworkInterface | +| java.base | java.net.Proxy | +| java.base | java.net.Proxy$Type | +| java.base | java.net.SocketAddress | +| java.base | java.net.SocketException | +| java.base | java.net.URI | +| java.base | java.net.URISyntaxException | +| java.base | java.net.URL | +| java.base | java.net.URLConnection | +| java.base | java.net.URLStreamHandler | +| java.base | java.net.URLStreamHandlerFactory | +| java.base | java.net.UnknownHostException | +| java.base | java.nio.Buffer | +| java.base | java.nio.ByteBuffer | +| java.base | java.nio.ByteBufferAsCharBufferB | +| java.base | java.nio.ByteBufferAsCharBufferL | +| java.base | java.nio.ByteBufferAsCharBufferRB | +| java.base | java.nio.ByteBufferAsCharBufferRL | +| java.base | java.nio.ByteBufferAsDoubleBufferB | +| java.base | java.nio.ByteBufferAsDoubleBufferL | +| java.base | java.nio.ByteBufferAsDoubleBufferRB | +| java.base | java.nio.ByteBufferAsDoubleBufferRL | +| java.base | java.nio.ByteBufferAsFloatBufferB | +| java.base | java.nio.ByteBufferAsFloatBufferL | +| java.base | java.nio.ByteBufferAsFloatBufferRB | +| java.base | java.nio.ByteBufferAsFloatBufferRL | +| java.base | java.nio.ByteBufferAsIntBufferB | +| java.base | java.nio.ByteBufferAsIntBufferL | +| java.base | java.nio.ByteBufferAsIntBufferRB | +| java.base | java.nio.ByteBufferAsIntBufferRL | +| java.base | java.nio.ByteBufferAsLongBufferB | +| java.base | java.nio.ByteBufferAsLongBufferL | +| java.base | java.nio.ByteBufferAsLongBufferRB | +| java.base | java.nio.ByteBufferAsLongBufferRL | +| java.base | java.nio.ByteBufferAsShortBufferB | +| java.base | java.nio.ByteBufferAsShortBufferL | +| java.base | java.nio.ByteBufferAsShortBufferRB | +| java.base | java.nio.ByteBufferAsShortBufferRL | +| java.base | java.nio.ByteOrder | +| java.base | java.nio.CharBuffer | +| java.base | java.nio.DirectByteBuffer | +| java.base | java.nio.DirectByteBufferR | +| java.base | java.nio.DirectCharBufferRS | +| java.base | java.nio.DirectCharBufferRU | +| java.base | java.nio.DirectCharBufferS | +| java.base | java.nio.DirectCharBufferU | +| java.base | java.nio.DirectDoubleBufferRS | +| java.base | java.nio.DirectDoubleBufferRU | +| java.base | java.nio.DirectDoubleBufferS | +| java.base | java.nio.DirectDoubleBufferU | +| java.base | java.nio.DirectFloatBufferRS | +| java.base | java.nio.DirectFloatBufferRU | +| java.base | java.nio.DirectFloatBufferS | +| java.base | java.nio.DirectFloatBufferU | +| java.base | java.nio.DirectIntBufferRS | +| java.base | java.nio.DirectIntBufferRU | +| java.base | java.nio.DirectIntBufferS | +| java.base | java.nio.DirectIntBufferU | +| java.base | java.nio.DirectLongBufferRS | +| java.base | java.nio.DirectLongBufferRU | +| java.base | java.nio.DirectLongBufferS | +| java.base | java.nio.DirectLongBufferU | +| java.base | java.nio.DirectShortBufferRS | +| java.base | java.nio.DirectShortBufferRU | +| java.base | java.nio.DirectShortBufferS | +| java.base | java.nio.DirectShortBufferU | +| java.base | java.nio.DoubleBuffer | +| java.base | java.nio.FloatBuffer | +| java.base | java.nio.HeapByteBuffer | +| java.base | java.nio.HeapByteBufferR | +| java.base | java.nio.HeapCharBuffer | +| java.base | java.nio.HeapCharBufferR | +| java.base | java.nio.HeapDoubleBuffer | +| java.base | java.nio.HeapDoubleBufferR | +| java.base | java.nio.HeapFloatBuffer | +| java.base | java.nio.HeapFloatBufferR | +| java.base | java.nio.HeapIntBuffer | +| java.base | java.nio.HeapIntBufferR | +| java.base | java.nio.HeapLongBuffer | +| java.base | java.nio.HeapLongBufferR | +| java.base | java.nio.HeapShortBuffer | +| java.base | java.nio.HeapShortBufferR | +| java.base | java.nio.IntBuffer | +| java.base | java.nio.LongBuffer | +| java.base | java.nio.MappedByteBuffer | +| java.base | java.nio.ShortBuffer | +| java.base | java.nio.StringCharBuffer | +| java.base | java.nio.channels.A | +| java.base | java.nio.channels.AsynchronousChannel | +| java.base | java.nio.channels.AsynchronousCloseException | +| java.base | java.nio.channels.AsynchronousFileChannel | +| java.base | java.nio.channels.ByteChannel | +| java.base | java.nio.channels.Channel | +| java.base | java.nio.channels.ClosedChannelException | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.CompletionHandler<> | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.FileChannel | +| java.base | java.nio.channels.FileChannel$MapMode | +| java.base | java.nio.channels.FileLock | +| java.base | java.nio.channels.GatheringByteChannel | +| java.base | java.nio.channels.InterruptibleChannel | +| java.base | java.nio.channels.ReadableByteChannel | +| java.base | java.nio.channels.ScatteringByteChannel | +| java.base | java.nio.channels.SeekableByteChannel | +| java.base | java.nio.channels.V | +| java.base | java.nio.channels.WritableByteChannel | +| java.base | java.nio.channels.spi.AbstractInterruptibleChannel | +| java.base | java.nio.charset.CharacterCodingException | +| java.base | java.nio.charset.Charset | +| java.base | java.nio.charset.CharsetDecoder | +| java.base | java.nio.charset.CharsetEncoder | +| java.base | java.nio.charset.CoderResult | +| java.base | java.nio.charset.CodingErrorAction | +| java.base | java.nio.file.AccessMode | +| java.base | java.nio.file.CopyOption | +| java.base | java.nio.file.DirectoryStream | +| java.base | java.nio.file.DirectoryStream$Filter | +| java.base | java.nio.file.DirectoryStream$Filter | +| java.base | java.nio.file.DirectoryStream<> | +| java.base | java.nio.file.DirectoryStream | +| java.base | java.nio.file.FileStore | +| java.base | java.nio.file.FileSystem | +| java.base | java.nio.file.LinkOption | +| java.base | java.nio.file.OpenOption | +| java.base | java.nio.file.Path | +| java.base | java.nio.file.PathMatcher | +| java.base | java.nio.file.T | +| java.base | java.nio.file.V | +| java.base | java.nio.file.WatchEvent | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Kind<> | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Modifier | +| java.base | java.nio.file.WatchEvent | +| java.base | java.nio.file.WatchKey | +| java.base | java.nio.file.WatchService | +| java.base | java.nio.file.Watchable | +| java.base | java.nio.file.attribute.AttributeView | +| java.base | java.nio.file.attribute.BasicFileAttributes | +| java.base | java.nio.file.attribute.FileAttribute | +| java.base | java.nio.file.attribute.FileAttribute | +| java.base | java.nio.file.attribute.FileAttributeView | +| java.base | java.nio.file.attribute.FileStoreAttributeView | +| java.base | java.nio.file.attribute.FileTime | +| java.base | java.nio.file.attribute.GroupPrincipal | +| java.base | java.nio.file.attribute.T | +| java.base | java.nio.file.attribute.UserPrincipal | +| java.base | java.nio.file.attribute.UserPrincipalLookupService | +| java.base | java.nio.file.spi.A | +| java.base | java.nio.file.spi.FileSystemProvider | +| java.base | java.nio.file.spi.V | +| java.base | java.security.AccessControlContext | +| java.base | java.security.AccessControlException | +| java.base | java.security.AlgorithmParameters | +| java.base | java.security.AlgorithmParametersSpi | +| java.base | java.security.AsymmetricKey | +| java.base | java.security.CodeSigner | +| java.base | java.security.CodeSource | +| java.base | java.security.DEREncodable | +| java.base | java.security.DomainCombiner | +| java.base | java.security.GeneralSecurityException | +| java.base | java.security.Guard | +| java.base | java.security.InvalidAlgorithmParameterException | +| java.base | java.security.InvalidKeyException | +| java.base | java.security.Key | +| java.base | java.security.KeyException | +| java.base | java.security.KeyPair | +| java.base | java.security.NoSuchAlgorithmException | +| java.base | java.security.NoSuchProviderException | +| java.base | java.security.PEMRecord | +| java.base | java.security.Permission | +| java.base | java.security.PermissionCollection | +| java.base | java.security.Principal | +| java.base | java.security.PrivateKey | +| java.base | java.security.PrivilegedAction | +| java.base | java.security.PrivilegedAction<> | +| java.base | java.security.PrivilegedAction | +| java.base | java.security.PrivilegedActionException | +| java.base | java.security.PrivilegedExceptionAction | +| java.base | java.security.PrivilegedExceptionAction<> | +| java.base | java.security.PrivilegedExceptionAction | +| java.base | java.security.ProtectionDomain | +| java.base | java.security.Provider | +| java.base | java.security.Provider$Service | +| java.base | java.security.PublicKey | +| java.base | java.security.SecureRandom | +| java.base | java.security.SecureRandomParameters | +| java.base | java.security.SecureRandomSpi | +| java.base | java.security.SignatureException | +| java.base | java.security.T | +| java.base | java.security.Timestamp | +| java.base | java.security.cert.CRL | +| java.base | java.security.cert.CRLException | +| java.base | java.security.cert.CRLReason | +| java.base | java.security.cert.CertPath | +| java.base | java.security.cert.Certificate | +| java.base | java.security.cert.CertificateEncodingException | +| java.base | java.security.cert.CertificateException | +| java.base | java.security.cert.CertificateExpiredException | +| java.base | java.security.cert.CertificateNotYetValidException | +| java.base | java.security.cert.CertificateParsingException | +| java.base | java.security.cert.X509CRL | +| java.base | java.security.cert.X509CRLEntry | +| java.base | java.security.cert.X509Certificate | +| java.base | java.security.cert.X509Extension | +| java.base | java.security.spec.AlgorithmParameterSpec | +| java.base | java.security.spec.EncodedKeySpec | +| java.base | java.security.spec.InvalidKeySpecException | +| java.base | java.security.spec.InvalidParameterSpecException | +| java.base | java.security.spec.KeySpec | +| java.base | java.security.spec.PKCS8EncodedKeySpec | +| java.base | java.security.spec.X509EncodedKeySpec | +| java.base | java.text.AttributedCharacterIterator | +| java.base | java.text.AttributedCharacterIterator$Attribute | +| java.base | java.text.CharacterIterator | +| java.base | java.text.FieldPosition | +| java.base | java.text.Format | +| java.base | java.text.Format$Field | +| java.base | java.text.ParseException | +| java.base | java.text.ParsePosition | +| java.base | java.time.Clock | +| java.base | java.time.DayOfWeek | +| java.base | java.time.Duration | +| java.base | java.time.Instant | +| java.base | java.time.InstantSource | +| java.base | java.time.LocalDate | +| java.base | java.time.LocalDateTime | +| java.base | java.time.LocalTime | +| java.base | java.time.Month | +| java.base | java.time.OffsetDateTime | +| java.base | java.time.OffsetTime | +| java.base | java.time.Period | +| java.base | java.time.R | +| java.base | java.time.ZoneId | +| java.base | java.time.ZoneOffset | +| java.base | java.time.ZoneRegion | +| java.base | java.time.ZonedDateTime | +| java.base | java.time.chrono.AbstractChronology | +| java.base | java.time.chrono.ChronoLocalDate | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime<> | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoPeriod | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime<> | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.Chronology | +| java.base | java.time.chrono.D | +| java.base | java.time.chrono.Era | +| java.base | java.time.chrono.IsoChronology | +| java.base | java.time.chrono.IsoEra | +| java.base | java.time.chrono.R | +| java.base | java.time.format.DateTimeFormatter | +| java.base | java.time.format.DecimalStyle | +| java.base | java.time.format.FormatStyle | +| java.base | java.time.format.ResolverStyle | +| java.base | java.time.format.T | +| java.base | java.time.format.TextStyle | +| java.base | java.time.temporal.ChronoField | +| java.base | java.time.temporal.ChronoUnit | +| java.base | java.time.temporal.R | +| java.base | java.time.temporal.Temporal | +| java.base | java.time.temporal.TemporalAccessor | +| java.base | java.time.temporal.TemporalAdjuster | +| java.base | java.time.temporal.TemporalAmount | +| java.base | java.time.temporal.TemporalField | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery<> | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalUnit | +| java.base | java.time.temporal.ValueRange | +| java.base | java.time.zone.ZoneOffsetTransition | +| java.base | java.time.zone.ZoneOffsetTransitionRule | +| java.base | java.time.zone.ZoneOffsetTransitionRule$TimeDefinition | +| java.base | java.time.zone.ZoneRules | +| java.base | java.util.Collection | +| java.base | java.util.Collection<> | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator<> | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Date | +| java.base | java.util.Dictionary | +| java.base | java.util.Dictionary | +| java.base | java.util.Dictionary | +| java.base | java.util.DoubleSummaryStatistics | +| java.base | java.util.E | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration<> | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Hashtable | +| java.base | java.util.Hashtable | +| java.base | java.util.IntSummaryStatistics | +| java.base | java.util.InvalidPropertiesFormatException | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator<> | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.K | +| java.base | java.util.List | +| java.base | java.util.List<> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.ListIterator | +| java.base | java.util.ListIterator<> | +| java.base | java.util.ListIterator | +| java.base | java.util.Locale | +| java.base | java.util.Locale$Category | +| java.base | java.util.Locale$FilteringMode | +| java.base | java.util.Locale$IsoCountryCode | +| java.base | java.util.Locale$IsoCountryCode$1 | +| java.base | java.util.Locale$IsoCountryCode$2 | +| java.base | java.util.Locale$IsoCountryCode$3 | +| java.base | java.util.Locale$LanguageRange | +| java.base | java.util.LongSummaryStatistics | +| java.base | java.util.Map | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry<> | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map<> | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map> | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.MissingResourceException | +| java.base | java.util.Optional | +| java.base | java.util.Optional<> | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.OptionalDouble | +| java.base | java.util.OptionalInt | +| java.base | java.util.OptionalLong | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator$OfDouble | +| java.base | java.util.PrimitiveIterator$OfInt | +| java.base | java.util.PrimitiveIterator$OfLong | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.Properties | +| java.base | java.util.Random | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection<> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedMap<> | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedSet | +| java.base | java.util.SequencedSet<> | +| java.base | java.util.SequencedSet> | +| java.base | java.util.SequencedSet | +| java.base | java.util.Set | +| java.base | java.util.Set<> | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set> | +| java.base | java.util.Set> | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.SortedMap | +| java.base | java.util.SortedMap<> | +| java.base | java.util.SortedMap | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator$OfDouble | +| java.base | java.util.Spliterator$OfInt | +| java.base | java.util.Spliterator$OfLong | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive<> | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator<> | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.T | +| java.base | java.util.T_CONS | +| java.base | java.util.T_SPLITR | +| java.base | java.util.U | +| java.base | java.util.V | +| java.base | java.util.X | +| java.base | java.util.concurrent.Callable | +| java.base | java.util.concurrent.Callable<> | +| java.base | java.util.concurrent.Callable | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture<> | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletionException | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage<> | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.ExecutionException | +| java.base | java.util.concurrent.Executor | +| java.base | java.util.concurrent.ExecutorService | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future$State | +| java.base | java.util.concurrent.Future<> | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.T | +| java.base | java.util.concurrent.ThreadFactory | +| java.base | java.util.concurrent.TimeUnit | +| java.base | java.util.concurrent.TimeoutException | +| java.base | java.util.concurrent.U | +| java.base | java.util.concurrent.V | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer<> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction<> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction,RuntimeException> | +| java.base | java.util.function.BiFunction,V> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator<> | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer<> | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.DoubleBinaryOperator | +| java.base | java.util.function.DoubleConsumer | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoubleFunction<> | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoublePredicate | +| java.base | java.util.function.DoubleSupplier | +| java.base | java.util.function.DoubleToIntFunction | +| java.base | java.util.function.DoubleToLongFunction | +| java.base | java.util.function.DoubleUnaryOperator | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function<> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.IntBinaryOperator | +| java.base | java.util.function.IntConsumer | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction<> | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntPredicate | +| java.base | java.util.function.IntSupplier | +| java.base | java.util.function.IntToDoubleFunction | +| java.base | java.util.function.IntToLongFunction | +| java.base | java.util.function.IntUnaryOperator | +| java.base | java.util.function.LongBinaryOperator | +| java.base | java.util.function.LongConsumer | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongFunction<> | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongPredicate | +| java.base | java.util.function.LongSupplier | +| java.base | java.util.function.LongToDoubleFunction | +| java.base | java.util.function.LongToIntFunction | +| java.base | java.util.function.LongUnaryOperator | +| java.base | java.util.function.ObjDoubleConsumer | +| java.base | java.util.function.ObjDoubleConsumer<> | +| java.base | java.util.function.ObjDoubleConsumer | +| java.base | java.util.function.ObjIntConsumer | +| java.base | java.util.function.ObjIntConsumer<> | +| java.base | java.util.function.ObjIntConsumer | +| java.base | java.util.function.ObjLongConsumer | +| java.base | java.util.function.ObjLongConsumer<> | +| java.base | java.util.function.ObjLongConsumer | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate<> | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.R | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier<> | +| java.base | java.util.function.Supplier> | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier> | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.T | +| java.base | java.util.function.ToDoubleFunction | +| java.base | java.util.function.ToDoubleFunction<> | +| java.base | java.util.function.ToDoubleFunction | +| java.base | java.util.function.ToIntFunction | +| java.base | java.util.function.ToIntFunction<> | +| java.base | java.util.function.ToIntFunction | +| java.base | java.util.function.ToLongFunction | +| java.base | java.util.function.ToLongFunction<> | +| java.base | java.util.function.ToLongFunction | +| java.base | java.util.function.U | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator<> | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.V | +| java.base | java.util.random.RandomGenerator | +| java.base | java.util.stream.A | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream<> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector$Characteristics | +| java.base | java.util.stream.Collector<> | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.DoubleStream | +| java.base | java.util.stream.DoubleStream$Builder | +| java.base | java.util.stream.DoubleStream$DoubleMapMultiConsumer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer$Downstream | +| java.base | java.util.stream.Gatherer$Downstream | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer$Integrator$Greedy | +| java.base | java.util.stream.Gatherer$Integrator$Greedy<> | +| java.base | java.util.stream.Gatherer$Integrator$Greedy | +| java.base | java.util.stream.Gatherer$Integrator<> | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer<> | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.IntStream | +| java.base | java.util.stream.IntStream$Builder | +| java.base | java.util.stream.IntStream$IntMapMultiConsumer | +| java.base | java.util.stream.LongStream | +| java.base | java.util.stream.LongStream$Builder | +| java.base | java.util.stream.LongStream$LongMapMultiConsumer | +| java.base | java.util.stream.R | +| java.base | java.util.stream.RR | +| java.base | java.util.stream.S | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream$Builder | +| java.base | java.util.stream.Stream$Builder<> | +| java.base | java.util.stream.Stream$Builder | +| java.base | java.util.stream.Stream<> | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.T | +| java.base | java.util.stream.U | +| java.base | javax.crypto.BadPaddingException | +| java.base | javax.crypto.Cipher | +| java.base | javax.crypto.CipherSpi | +| java.base | javax.crypto.EncryptedPrivateKeyInfo | +| java.base | javax.crypto.ExemptionMechanism | +| java.base | javax.crypto.ExemptionMechanismException | +| java.base | javax.crypto.ExemptionMechanismSpi | +| java.base | javax.crypto.IllegalBlockSizeException | +| java.base | javax.crypto.NoSuchPaddingException | +| java.base | javax.crypto.ShortBufferException | +| java.base | javax.security.auth.DestroyFailedException | +| java.base | javax.security.auth.Destroyable | +| java.base | javax.security.auth.Subject | +| java.base | javax.security.auth.T | +| java.base | javax.security.auth.x500.X500Principal | +| java.base | jdk.internal.javac.Restricted+Annotation | diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedType.ql b/java/ql/test/library-tests/module-import-declarations/ImportedType.ql new file mode 100644 index 000000000000..4dfe43084ecb --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedType.ql @@ -0,0 +1,4 @@ +import java + +from ModuleImportDeclaration mid +select mid.getModuleName(), mid.getAnImportedType().getQualifiedName() diff --git a/java/ql/test/library-tests/module-import-declarations/Test.java b/java/ql/test/library-tests/module-import-declarations/Test.java new file mode 100644 index 000000000000..ed6d3dfe664f --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/Test.java @@ -0,0 +1,6 @@ +import module java.base; + +class Test { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/java/ql/test/library-tests/module-import-declarations/options b/java/ql/test/library-tests/module-import-declarations/options new file mode 100644 index 000000000000..b510fdce0df9 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --release 25 --enable-preview \ No newline at end of file From 6cee6554be997390c66410d96867e3533d50e3b2 Mon Sep 17 00:00:00 2001 From: idrissrio Date: Mon, 21 Jul 2025 14:48:12 +0200 Subject: [PATCH 4/6] Java: Add change note --- .../change-notes/2025-07-21-module-import-declarations.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 java/ql/lib/change-notes/2025-07-21-module-import-declarations.md diff --git a/java/ql/lib/change-notes/2025-07-21-module-import-declarations.md b/java/ql/lib/change-notes/2025-07-21-module-import-declarations.md new file mode 100644 index 000000000000..56c7972399a6 --- /dev/null +++ b/java/ql/lib/change-notes/2025-07-21-module-import-declarations.md @@ -0,0 +1,5 @@ +--- +category: feature +--- +* Added support for Java 25 module import declarations. +* Add `ModuleImportDeclaration` class. From c81224ffaf313a2ef9b2a03c3ae851a45a2b72ea Mon Sep 17 00:00:00 2001 From: idrissrio Date: Tue, 22 Jul 2025 12:43:58 +0200 Subject: [PATCH 5/6] Java: Add upgrade and downgrade script --- .../imports.ql | 12 + .../old.dbscheme | 1244 +++++++++++++++++ .../semmlecode.dbscheme | 1236 ++++++++++++++++ .../upgrade.properties | 3 + .../old.dbscheme | 1236 ++++++++++++++++ .../semmlecode.dbscheme | 1244 +++++++++++++++++ .../upgrade.properties | 2 + 7 files changed, 4977 insertions(+) create mode 100644 java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/imports.ql create mode 100644 java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/old.dbscheme create mode 100644 java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/semmlecode.dbscheme create mode 100644 java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/upgrade.properties create mode 100644 java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme create mode 100644 java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme create mode 100644 java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties diff --git a/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/imports.ql b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/imports.ql new file mode 100644 index 000000000000..8180e270aba9 --- /dev/null +++ b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/imports.ql @@ -0,0 +1,12 @@ +class Import extends @import { + string toString() { none() } +} + +class ClassOrInterface extends @classorinterface { + string toString() { none() } +} + +from Import imp, ClassOrInterface holder, string name, int kind +where + imports(imp, holder, name, kind) and kind != 6 +select imp, holder, name, kind diff --git a/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/old.dbscheme b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/old.dbscheme new file mode 100644 index 000000000000..1da2b6556cd0 --- /dev/null +++ b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/old.dbscheme @@ -0,0 +1,1244 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation ref +) + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: string ref +) + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@@@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + /* kind: + 1 = TYPE + 2 = TYPEWILDCARD + 3 = PACKAGEWILDCARD + 4 = TYPEWILDCARDSTATIC + 5 = TYPEMEMBERSTATIC + 6 = MODULEIMPORT + */ + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/semmlecode.dbscheme b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/semmlecode.dbscheme new file mode 100644 index 000000000000..1b8f5f4c747e --- /dev/null +++ b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/semmlecode.dbscheme @@ -0,0 +1,1236 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation ref +) + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: string ref +) + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@@@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/upgrade.properties b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/upgrade.properties new file mode 100644 index 000000000000..e78d641d025f --- /dev/null +++ b/java/downgrades/1da2b6556cd039f88d2476ef4dd5453c21dcdd69/upgrade.properties @@ -0,0 +1,3 @@ +description: Add support for Java 25 module import declarations +compatibility: partial +imports.rel: run imports.qlo \ No newline at end of file diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme new file mode 100644 index 000000000000..1b8f5f4c747e --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme @@ -0,0 +1,1236 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation ref +) + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: string ref +) + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@@@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme new file mode 100644 index 000000000000..1da2b6556cd0 --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme @@ -0,0 +1,1244 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation ref +) + +compilation_info( + int id : @compilation ref, + string info_key: string ref, + string info_value: string ref +) + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The expanded arguments that were passed to the extractor for a + * compiler invocation. This is similar to `compilation_args`, but + * for a `@@@someFile` argument, it includes the arguments from that + * file, rather than just taking the argument literally. + */ +#keyset[id, num] +compilation_expanded_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + unique int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + /* kind: + 1 = TYPE + 2 = TYPEWILDCARD + 3 = PACKAGEWILDCARD + 4 = TYPEWILDCARDSTATIC + 5 = TYPEMEMBERSTATIC + 6 = MODULEIMPORT + */ + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * XML Files + */ + +xmlEncoding( + unique int id: @file ref, + string encoding: string ref +); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters | @xmlelement | @xmlcomment | @xmlattribute | @xmldtd | @file | @xmlnamespace; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties new file mode 100644 index 000000000000..6e26aea2a807 --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties @@ -0,0 +1,2 @@ +description: Add moduleImportDeclarations relation for Java 25 module import declarations +compatibility: full \ No newline at end of file From a24e4ae2ebaab358621d19c32676c910b60609da Mon Sep 17 00:00:00 2001 From: idrissrio Date: Thu, 24 Jul 2025 15:15:37 +0200 Subject: [PATCH 6/6] Java: add Diagnostic Match for synthetic annotation generated by javac --- .../test/library-tests/module-import-declarations/Test.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/ql/test/library-tests/module-import-declarations/Test.java b/java/ql/test/library-tests/module-import-declarations/Test.java index ed6d3dfe664f..ffae9af9e4a5 100644 --- a/java/ql/test/library-tests/module-import-declarations/Test.java +++ b/java/ql/test/library-tests/module-import-declarations/Test.java @@ -3,4 +3,6 @@ class Test { public static void main(String[] args) { } -} \ No newline at end of file +} + +// Diagnostic Matches: Unknown location for jdk.internal.RequiresIdentity+Annotation \ No newline at end of file pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy

Alternative Proxy