diff --git a/python/.vscode/ql.code-snippets b/python/.vscode/ql.code-snippets index b7187f155b0..136172cd2e2 100644 --- a/python/.vscode/ql.code-snippets +++ b/python/.vscode/ql.code-snippets @@ -152,4 +152,62 @@ ] }, + "Type tracking class": { + "scope": "ql", + "prefix": "type tracking class", + "body": [ + "/**", + " * Provides models for the `${TM_SELECTED_TEXT}` class", + " *", + " * See ${1:https://apiref (TODO)}.", + " */", + "module ${TM_SELECTED_TEXT/^(.*)\\.([^.]+)$/$2/} {", + " /** Gets a reference to the `${TM_SELECTED_TEXT}` class. */", + " private API::Node classRef() {", + " result = API::moduleImport(\"${TM_SELECTED_TEXT/\\.([^.]+)/\").getMember(\"$1/g}\")", + " }", + "", + " /**", + " * A source of instances of `${TM_SELECTED_TEXT}`, extend this class to model new instances.", + " *", + " * This can include instantiations of the class, return values from function", + " * calls, or a special parameter that will be set when functions are called by an external", + " * library.", + " *", + " * Use the predicate `${TM_SELECTED_TEXT/^(.*)\\.([^.]+)$/$2/}::instance()` to get references to instances of `${TM_SELECTED_TEXT}`.", + " */", + " abstract class InstanceSource extends DataFlow::LocalSourceNode { }", + "", + " /** A direct instantiation of `${TM_SELECTED_TEXT}`. */", + " private class ClassInstantiation extends InstanceSource, DataFlow::CallCfgNode {", + " override CallNode node;", + "", + " ClassInstantiation() { this = classRef().getACall() }", + " }", + "", + " /** Gets a reference to an instance of `${TM_SELECTED_TEXT}`. */", + " private DataFlow::TypeTrackingNode instance(DataFlow::TypeTracker t) {", + " t.start() and", + " result instanceof InstanceSource", + " or", + " exists(DataFlow::TypeTracker t2 | result = instance(t2).track(t2, t))", + " }", + "", + " /** Gets a reference to an instance of `${TM_SELECTED_TEXT}`. */", + " DataFlow::Node instance() { instance(DataFlow::TypeTracker::end()).flowsTo(result) }", + "", + " DataFlow::Node instance() { instance(DataFlow::TypeTracker::end()).flowsTo(result) }", + "}", + ], + "description": "Type tracking class (select full class path before inserting)", + }, + + "API graph .getMember chain": { + "scope": "ql", + "prefix": "api graph .getMember chain", + "body": [ + "API::moduleImport(\"${TM_SELECTED_TEXT/\\.([^.]+)/\").getMember(\"$1/g}\")" + ], + "description": "API graph .getMember chain (select full path before inserting)", + }, }