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/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. 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 ); 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" } +} 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 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..ffae9af9e4a5 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/Test.java @@ -0,0 +1,8 @@ +import module java.base; + +class Test { + public static void main(String[] args) { + } +} + +// Diagnostic Matches: Unknown location for jdk.internal.RequiresIdentity+Annotation \ 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