Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b8be66e

Browse files
authored
Merge pull request #887 from asger-semmle/jsdoc-accessors
Approved by xiemaisi
2 parents b13c110 + 46b996a commit b8be66e

10 files changed

Lines changed: 84 additions & 1 deletion

File tree

javascript/ql/src/semmle/javascript/Expr.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ class ExprOrType extends @exprortype, Documentable {
2929
not exists(getOwnDocumentation()) and
3030
if getParent() instanceof Property
3131
then result = getParent().(Property).getDocumentation()
32-
else result = getEnclosingStmt().getDocumentation()
32+
else
33+
if getParent() instanceof MethodDeclaration
34+
then result = getParent().(MethodDeclaration).getDocumentation()
35+
else result = getEnclosingStmt().getDocumentation()
3336
)
3437
}
3538

javascript/ql/src/semmle/javascript/Variables.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,13 @@ class Parameter extends BindingPattern {
585585
int getNumDecorator() { result = count(getADecorator()) }
586586

587587
override predicate isLValue() { any() }
588+
589+
/**
590+
* Gets the JSDoc tag describing this parameter, if any.
591+
*/
592+
JSDocTag getJSDocTag() {
593+
none() // overridden in SimpleParameter
594+
}
588595
}
589596

590597
/** A parameter declaration that is not an object or array pattern. */
@@ -601,6 +608,15 @@ class SimpleParameter extends Parameter, VarDecl {
601608
result = ssa.getVariable().getAUse()
602609
)
603610
}
611+
612+
override JSDocTag getJSDocTag() {
613+
exists(Function fun |
614+
this = fun.getAParameter() and
615+
result = fun.getDocumentation().getATag() and
616+
result.getTitle() = "param" and
617+
result.getName() = getName()
618+
)
619+
}
604620
}
605621

606622
/**

javascript/ql/test/library-tests/JSDoc/Function_getDocumentation.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,7 @@
3737
| tst.js:343:12:343:36 | functio ... rn a; } | tst.js:338:1:342:3 | /**\\n * ... e T\\n */ |
3838
| tst.js:354:1:354:16 | function f(x) {} | tst.js:351:1:353:3 | /**\\n * ... ger\\n */ |
3939
| tst.js:360:1:360:27 | functio ... fn) {} | tst.js:356:1:359:3 | /**\\n * ... ion\\n */ |
40+
| tst.js:366:18:366:31 | function(p) {} | tst.js:363:3:365:5 | /**\\n ... p\\n */ |
41+
| tst.js:371:14:371:19 | (p) {} | tst.js:368:3:370:5 | /**\\n ... p\\n */ |
42+
| tst.js:378:14:378:19 | (p) {} | tst.js:375:3:377:5 | /**\\n ... p\\n */ |
43+
| tst.js:383:14:383:19 | (p) {} | tst.js:380:3:382:5 | /**\\n ... p\\n */ |

javascript/ql/test/library-tests/JSDoc/JSDoc.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,7 @@
6565
| tst.js:349:1:349:31 | /** @ty ... ned} */ | | tst.js:349:1:349:31 | /** @ty ... ned} */ |
6666
| tst.js:351:1:353:3 | /**\\n * ... ger\\n */ | | tst.js:351:1:353:3 | /**\\n * ... ger\\n */ |
6767
| tst.js:356:1:359:3 | /**\\n * ... ion\\n */ | | tst.js:356:1:359:3 | /**\\n * ... ion\\n */ |
68+
| tst.js:363:3:365:5 | /**\\n ... p\\n */ | | tst.js:363:3:365:5 | /**\\n ... p\\n */ |
69+
| tst.js:368:3:370:5 | /**\\n ... p\\n */ | | tst.js:368:3:370:5 | /**\\n ... p\\n */ |
70+
| tst.js:375:3:377:5 | /**\\n ... p\\n */ | | tst.js:375:3:377:5 | /**\\n ... p\\n */ |
71+
| tst.js:380:3:382:5 | /**\\n ... p\\n */ | | tst.js:380:3:382:5 | /**\\n ... p\\n */ |

javascript/ql/test/library-tests/JSDoc/JSDocTag.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,7 @@
100100
| tst.js:352:4:352:9 | @param | param | tst.js:351:1:353:3 | /**\\n * ... ger\\n */ | 0 | [int] an integer | (none) | (none) |
101101
| tst.js:357:4:357:9 | @param | param | tst.js:356:1:359:3 | /**\\n * ... ion\\n */ | 0 | the array to sort\n | array | Array.<number> |
102102
| tst.js:358:4:358:9 | @param | param | tst.js:356:1:359:3 | /**\\n * ... ion\\n */ | 1 | the comparator function | fn | function (x: !number, y: !number): number |
103+
| tst.js:364:6:364:11 | @param | param | tst.js:363:3:365:5 | /**\\n ... p\\n */ | 0 | (none) | p | T1 |
104+
| tst.js:369:6:369:11 | @param | param | tst.js:368:3:370:5 | /**\\n ... p\\n */ | 0 | (none) | p | T2 |
105+
| tst.js:376:6:376:11 | @param | param | tst.js:375:3:377:5 | /**\\n ... p\\n */ | 0 | (none) | p | T3 |
106+
| tst.js:381:6:381:11 | @param | param | tst.js:380:3:382:5 | /**\\n ... p\\n */ | 0 | (none) | p | T4 |

javascript/ql/test/library-tests/JSDoc/JSDocTypeExpr.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
| T | @return | 0 |
5252
| T | @return | 0 |
5353
| T | @return | 0 |
54+
| T1 | @param | 0 |
55+
| T2 | @param | 0 |
56+
| T3 | @param | 0 |
57+
| T4 | @param | 0 |
5458
| U | A.<U> | 0 |
5559
| X | @extends | 0 |
5660
| X | Foo.<X> | 0 |
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
| tst.js:146:37:146:44 | groupNum | groupNum | tst.js:142:4:142:9 | @param | groupNum | number |
2+
| tst.js:146:47:146:50 | term | term | tst.js:143:4:143:9 | @param | term | (string\|number\|null) |
3+
| tst.js:166:59:166:65 | element | element | tst.js:163:4:163:9 | @param | element | Element |
4+
| tst.js:220:28:220:28 | x | x | tst.js:219:5:219:10 | @param | x | goog.NumberLike |
5+
| tst.js:256:30:256:30 | t | t | tst.js:255:5:255:10 | @param | t | T |
6+
| tst.js:266:16:266:16 | t | t | tst.js:262:4:262:9 | @param | t | T |
7+
| tst.js:295:22:295:25 | fooY | fooY | tst.js:294:5:294:10 | @param | fooY | Foo.<Y> |
8+
| tst.js:307:31:307:31 | t | t | tst.js:306:5:306:10 | @param | t | T |
9+
| tst.js:343:21:343:21 | a | a | tst.js:339:4:339:9 | @param | a | T |
10+
| tst.js:360:15:360:19 | array | array | tst.js:357:4:357:9 | @param | array | Array.<number> |
11+
| tst.js:360:22:360:23 | fn | fn | tst.js:358:4:358:9 | @param | fn | function (x: !number, y: !number): number |
12+
| tst.js:366:27:366:27 | p | p | tst.js:364:6:364:11 | @param | p | T1 |
13+
| tst.js:371:15:371:15 | p | p | tst.js:369:6:369:11 | @param | p | T2 |
14+
| tst.js:378:15:378:15 | p | p | tst.js:376:6:376:11 | @param | p | T3 |
15+
| tst.js:383:15:383:15 | p | p | tst.js:381:6:381:11 | @param | p | T4 |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import javascript
2+
3+
from Parameter param, JSDocTag tag
4+
where tag = param.getJSDocTag()
5+
select param, param.getName(), tag, tag.getName(), tag.getType()

javascript/ql/test/library-tests/JSDoc/next_token.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,7 @@
8585
| tst.js:349:1:349:31 | /** @ty ... ned} */ | tst.js:349:33:349:35 | var |
8686
| tst.js:351:1:353:3 | /**\\n * ... ger\\n */ | tst.js:354:1:354:8 | function |
8787
| tst.js:356:1:359:3 | /**\\n * ... ion\\n */ | tst.js:360:1:360:8 | function |
88+
| tst.js:363:3:365:5 | /**\\n ... p\\n */ | tst.js:366:3:366:15 | classicMethod |
89+
| tst.js:368:3:370:5 | /**\\n ... p\\n */ | tst.js:371:3:371:13 | fancyMethod |
90+
| tst.js:375:3:377:5 | /**\\n ... p\\n */ | tst.js:378:3:378:13 | constructor |
91+
| tst.js:380:3:382:5 | /**\\n ... p\\n */ | tst.js:383:3:383:13 | classMethod |

javascript/ql/test/library-tests/JSDoc/tst.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,3 +358,27 @@ function f(x) {}
358358
* @param {function(x:!number, y:!number):number} fn - the comparator function
359359
*/
360360
function sort(array, fn) {}
361+
362+
var literalWithMethods = {
363+
/**
364+
* @param {T1} p
365+
*/
366+
classicMethod: function(p) {},
367+
368+
/**
369+
* @param {T2} p
370+
*/
371+
fancyMethod(p) {}
372+
};
373+
374+
class C {
375+
/**
376+
* @param {T3} p
377+
*/
378+
constructor(p) {}
379+
380+
/**
381+
* @param {T4} p
382+
*/
383+
classMethod(p) {}
384+
}

0 commit comments

Comments
 (0)