Skip to content

JS: QL-side type/name resolution for TypeScript and JSDoc #19078

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 47 commits into from
Jun 11, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
5064cd5
JS: Exclude externs from CallGraph meta-query
asgerf Apr 11, 2025
9fc0b8c
JS: Add ImportSpecifier.getImportDeclaration()
asgerf Mar 11, 2025
50e4ac8
JS: Do not ignore variables from ambient declarations
asgerf Apr 11, 2025
b5a4fc0
JS: Make Closure concepts based on AST instead
asgerf Apr 11, 2025
4cd6f45
JS: Avoid accidental recursion with API graphs
asgerf Apr 11, 2025
9566265
JS: Add helper for getting local type names
asgerf Apr 11, 2025
4bfb048
JS: Resolve JSDocLocalTypeAccess to a variable in scope
asgerf Apr 11, 2025
1051136
JS: Add test
asgerf Apr 11, 2025
1533e13
JS: Add NameResolution.qll
asgerf Apr 11, 2025
d61f576
JS: Add UnderlyingTypes.qll
asgerf Apr 11, 2025
fc580a5
JS: Add TypeResolution.qll
asgerf Apr 11, 2025
b923eac
JS: Use underlying types in DataFlow::Node
asgerf Apr 11, 2025
cca48c0
JS: Use in TypeAnnotation.getClass and hasUnderlyingType predicates
asgerf Apr 11, 2025
9fd85c9
JS: Update jQuery model
asgerf Apr 11, 2025
2d21074
JS: Use sanitizing primitive types in ViewComponentInput
asgerf Apr 11, 2025
6fdd7fe
JS: Use sanitizing primitive type in Nest model
asgerf Apr 11, 2025
4e44fda
JS: Use hasUnderlyingStringOrAnyType in Nest model
asgerf Apr 11, 2025
6ac35f1
JS: Use in MissingAwait
asgerf Apr 11, 2025
989402d
JS: Remove some dependencies on type extraction
asgerf Apr 11, 2025
57811ed
JS: Some test updates
asgerf Apr 11, 2025
307715a
JS: Use type resolution for CG augmentation
asgerf Apr 22, 2025
f06b9a9
JS: Add call graph test with types
asgerf Apr 30, 2025
500291d
JS: Hide shadowed inherited members
asgerf Apr 30, 2025
167f752
JS: Also propagate through promise types
asgerf Apr 30, 2025
6e82b6e
JS: Add failing test for assigning a non-SourceNode to a type annotat…
asgerf Apr 30, 2025
e07a036
JS: Mark type-annotated nodes as SourceNode
asgerf Apr 14, 2025
fbafd6f
JS: Update to avoid deprecations after import resolution change
asgerf May 2, 2025
b8dc1b3
JS: Remove redundant casts
asgerf May 2, 2025
bba872a
JS: Make jump-to-def behave nicer
asgerf May 12, 2025
de7d851
JS: Update output of old HasUnderlyingType test
asgerf May 12, 2025
22a4114
JS: Accept regression in overload resolution
asgerf May 12, 2025
b610e10
JS: Accept change in handling of variable resolution in face of ambie…
asgerf May 12, 2025
27979c6
JS: Add regression tests for declared globals
asgerf May 13, 2025
9bcc620
JS: Fix regression from global declare vars
asgerf May 13, 2025
11607e5
JS: Update TRAP after extractor change
asgerf May 19, 2025
b698b4e
JS: Add test for missing type flow through generics
asgerf May 20, 2025
d644f80
JS: Remove obsolete meta query
asgerf May 20, 2025
853ba49
Update javascript/ql/lib/semmle/javascript/internal/TypeResolution.qll
asgerf Jun 4, 2025
79101fd
JS: Add test with type casts
asgerf Jun 4, 2025
57fad7e
JS: Add SatisfiesExpr
asgerf Jun 4, 2025
691fdb1
JS: Nicer jump-to-def for function declarations
asgerf Jun 4, 2025
42f762a
JS: Update test output now that 'satisfies' is a SourceNode
asgerf Jun 9, 2025
a6488cb
Update javascript/ql/lib/semmle/javascript/internal/NameResolution.qll
asgerf Jun 10, 2025
18f9133
JS: Rename and clarify comment for trackFunctionType
asgerf Jun 10, 2025
72cc439
JS: Normalize a few more extensions
asgerf Jun 10, 2025
2aa5fa1
JS: Add comment and examples in FlowImpl doc
asgerf Jun 11, 2025
e848aa7
JS: Clarifying comment on commonStep
asgerf Jun 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion javascript/ql/lib/semmle/javascript/dataflow/Sources.qll
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,13 @@ module SourceNode {
astNode instanceof TaggedTemplateExpr or
astNode instanceof Templating::PipeRefExpr or
astNode instanceof Templating::TemplateVarRefExpr or
astNode instanceof StringLiteral
astNode instanceof StringLiteral or
astNode instanceof TypeAssertion
)
or
exists(VariableDeclarator decl |
exists(decl.getTypeAnnotation()) and
this = DataFlow::valueNode(decl.getBindingPattern())
)
or
DataFlow::parameterNode(this, _)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,12 @@ module TypeResolution {
)
}

private predicate contextualType(Node value, Node type) {
predicate contextualType(Node value, Node type) {
exists(LocalVariable v |
type = v.getADeclaration().getTypeAnnotation() and
value = v.getAnAssignedExpr()
)
or
exists(InvokeExpr call, Function target, int i |
callTarget(call, target) and
value = call.getArgument(i) and
Expand Down Expand Up @@ -228,6 +233,8 @@ module TypeResolution {
predicate valueHasType(Node value, Node type) {
value.(BindingPattern).getTypeAnnotation() = type
or
value.(TypeAssertion).getTypeAnnotation() = type
or
exists(VarDecl decl |
// ValueFlow::step is restricted to variables with at most one assignment. Allow the type annotation
// of a variable to propagate to its uses, even if the variable has multiple assignments.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@
| subtype.ts:7:13:7:15 | req | 'express'.Request |
| subtype.ts:13:13:13:15 | req | 'express'.Request |
| subtype.ts:19:13:19:15 | req | 'express'.Request |
| varAssignment.ts:4:9:4:11 | req | 'express'.Request |
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as express from 'express';

function t1(e) {
var req: express.Request = e; // $ MISSING: hasUnderlyingType='express'.Request
var req: express.Request = e; // $ hasUnderlyingType='express'.Request
}