Skip to content

Commit 5c920eb

Browse files
authored
Merge pull request github#3120 from asger-semmle/js/prefer-typescript-file
Approved by esbena
2 parents 73dd4c8 + 816968d commit 5c920eb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+205
-156
lines changed

javascript/extractor/src/com/semmle/js/extractor/AutoBuild.java

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -565,17 +565,40 @@ private void extractSource() throws IOException {
565565
extractTypeScript(
566566
defaultExtractor, filesToExtract, tsconfigFiles, dependencyInstallationResult);
567567

568+
boolean hasTypeScriptFiles = extractedFiles.size() > 0;
569+
568570
// extract remaining files
569571
for (Path f : filesToExtract) {
570-
if (extractedFiles.add(f)) {
571-
FileExtractor extractor = defaultExtractor;
572-
if (!fileTypes.isEmpty()) {
573-
String extension = FileUtil.extension(f);
574-
if (customExtractors.containsKey(extension)) extractor = customExtractors.get(extension);
575-
}
576-
extract(extractor, f, null);
572+
if (extractedFiles.contains(f))
573+
continue;
574+
if (hasTypeScriptFiles && isFileDerivedFromTypeScriptFile(f, extractedFiles)) {
575+
continue;
576+
}
577+
extractedFiles.add(f);
578+
FileExtractor extractor = defaultExtractor;
579+
if (!fileTypes.isEmpty()) {
580+
String extension = FileUtil.extension(f);
581+
if (customExtractors.containsKey(extension)) extractor = customExtractors.get(extension);
582+
}
583+
extract(extractor, f, null);
584+
}
585+
}
586+
587+
/**
588+
* Returns true if the given path is likely the output of compiling a TypeScript file
589+
* which we have already extracted.
590+
*/
591+
private boolean isFileDerivedFromTypeScriptFile(Path path, Set<Path> extractedFiles) {
592+
String name = path.getFileName().toString();
593+
if (!name.endsWith(".js"))
594+
return false;
595+
String stem = name.substring(0, name.length() - ".js".length());
596+
for (String ext : FileType.TYPESCRIPT.getExtensions()) {
597+
if (extractedFiles.contains(path.getParent().resolve(stem + ext))) {
598+
return true;
577599
}
578600
}
601+
return false;
579602
}
580603

581604
/** Returns true if yarn is installed, otherwise prints a warning and returns false. */
@@ -613,7 +636,7 @@ private static Path tryResolveWithExtensions(Path dir, String stem, Iterable<Str
613636
}
614637
return null;
615638
}
616-
639+
617640
/**
618641
* Returns an existing file named <code>dir/stem.ext</code> where <code>ext</code> is any TypeScript or JavaScript extension,
619642
* or <code>null</code> if no such file exists.
@@ -623,7 +646,7 @@ private static Path tryResolveTypeScriptOrJavaScriptFile(Path dir, String stem)
623646
if (resolved != null) return resolved;
624647
return tryResolveWithExtensions(dir, stem, FileType.JS.getExtensions());
625648
}
626-
649+
627650
/**
628651
* Gets a child of a JSON object as a string, or <code>null</code>.
629652
*/
@@ -658,7 +681,7 @@ protected DependencyInstallationResult installDependencies(Set<Path> filesToExtr
658681
if (!verifyYarnInstallation()) {
659682
return DependencyInstallationResult.empty;
660683
}
661-
684+
662685
final Path sourceRoot = Paths.get(".").toAbsolutePath();
663686
final Path virtualSourceRoot = Paths.get(EnvironmentVariables.getScratchDir()).toAbsolutePath();
664687

@@ -746,7 +769,7 @@ protected DependencyInstallationResult installDependencies(Set<Path> filesToExtr
746769
for (Path file : packageJsonFiles.keySet()) {
747770
Path relativePath = sourceRoot.relativize(file);
748771
Path virtualFile = virtualSourceRoot.resolve(relativePath);
749-
772+
750773
try {
751774
Files.createDirectories(virtualFile.getParent());
752775
try (Writer writer = Files.newBufferedWriter(virtualFile)) {
@@ -794,7 +817,7 @@ protected DependencyInstallationResult installDependencies(Set<Path> filesToExtr
794817
*/
795818
private Path guessPackageMainFile(Path packageJsonFile, JsonObject packageJson, Iterable<String> extensions) {
796819
Path packageDir = packageJsonFile.getParent();
797-
820+
798821
// Try <package_dir>/index.ts.
799822
Path resolved = tryResolveWithExtensions(packageDir, "index", extensions);
800823
if (resolved != null) {

javascript/extractor/src/com/semmle/js/extractor/Main.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package com.semmle.js.extractor;
22

3+
import java.io.File;
4+
import java.io.IOException;
5+
import java.util.ArrayList;
6+
import java.util.LinkedHashSet;
7+
import java.util.List;
8+
import java.util.Set;
9+
import java.util.regex.Pattern;
10+
311
import com.semmle.js.extractor.ExtractorConfig.HTMLHandling;
412
import com.semmle.js.extractor.ExtractorConfig.Platform;
513
import com.semmle.js.extractor.ExtractorConfig.SourceType;
@@ -23,13 +31,6 @@
2331
import com.semmle.util.process.ArgsParser;
2432
import com.semmle.util.process.ArgsParser.FileMode;
2533
import com.semmle.util.trap.TrapWriter;
26-
import java.io.File;
27-
import java.io.IOException;
28-
import java.util.ArrayList;
29-
import java.util.LinkedHashSet;
30-
import java.util.List;
31-
import java.util.Set;
32-
import java.util.regex.Pattern;
3334

3435
/** The main entry point of the JavaScript extractor. */
3536
public class Main {
@@ -190,10 +191,29 @@ public void run(String[] args) {
190191

191192
// Extract files that were not part of a project.
192193
for (File f : files) {
194+
if (isFileDerivedFromTypeScriptFile(f))
195+
continue;
193196
ensureFileIsExtracted(f, ap);
194197
}
195198
}
196199

200+
/**
201+
* Returns true if the given path is likely the output of compiling a TypeScript file
202+
* which we have already extracted.
203+
*/
204+
private boolean isFileDerivedFromTypeScriptFile(File path) {
205+
String name = path.getName();
206+
if (!name.endsWith(".js"))
207+
return false;
208+
String stem = name.substring(0, name.length() - ".js".length());
209+
for (String ext : FileType.TYPESCRIPT.getExtensions()) {
210+
if (new File(path.getParent(), stem + ext).exists()) {
211+
return true;
212+
}
213+
}
214+
return false;
215+
}
216+
197217
private void extractTypeTable(File fileHandle, TypeTable table) {
198218
TrapWriter trapWriter =
199219
extractorOutputConfig

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
| tst2.ts:1:13:1:21 | <number>1 |
2+
| tst2.ts:1:21:1:21 | 1 |
13
| tst.js:1:1:1:3 | "a" |
24
| tst.js:2:1:2:3 | "b" |
35
| tst.js:2:1:2:9 | "b" + "c" |
@@ -59,5 +61,3 @@
5961
| tst.js:48:1:48:7 | x.p = 1 |
6062
| tst.js:48:7:48:7 | 1 |
6163
| tst.js:49:6:49:6 | 1 |
62-
| tst.ts:1:13:1:21 | <number>1 |
63-
| tst.ts:1:21:1:21 | 1 |

javascript/ql/test/library-tests/DataFlow/enclosingExpr.expected

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,36 @@
3535
| sources.js:11:14:11:16 | key | sources.js:11:14:11:16 | key |
3636
| sources.js:11:23:11:27 | array | sources.js:11:23:11:27 | array |
3737
| sources.js:11:32:11:34 | key | sources.js:11:32:11:34 | key |
38+
| tst2.ts:1:18:1:18 | A | tst2.ts:1:18:1:18 | A |
39+
| tst2.ts:2:14:2:14 | x | tst2.ts:2:14:2:14 | x |
40+
| tst2.ts:2:14:2:19 | x = 42 | tst2.ts:2:14:2:19 | x = 42 |
41+
| tst2.ts:2:18:2:19 | 42 | tst2.ts:2:18:2:19 | 42 |
42+
| tst2.ts:3:3:3:6 | setX | tst2.ts:3:3:3:6 | setX |
43+
| tst2.ts:3:3:3:8 | setX() | tst2.ts:3:3:3:8 | setX() |
44+
| tst2.ts:4:3:4:3 | x | tst2.ts:4:3:4:3 | x |
45+
| tst2.ts:7:10:7:13 | setX | tst2.ts:7:10:7:13 | setX |
46+
| tst2.ts:8:3:8:3 | A | tst2.ts:8:3:8:3 | A |
47+
| tst2.ts:8:3:8:5 | A.x | tst2.ts:8:3:8:5 | A.x |
48+
| tst2.ts:8:3:8:10 | A.x = 23 | tst2.ts:8:3:8:10 | A.x = 23 |
49+
| tst2.ts:8:5:8:5 | x | tst2.ts:8:5:8:5 | x |
50+
| tst2.ts:8:9:8:10 | 23 | tst2.ts:8:9:8:10 | 23 |
51+
| tst2.ts:11:5:11:7 | nd2 | tst2.ts:11:5:11:7 | nd2 |
52+
| tst2.ts:11:5:11:23 | nd2 = A.x as number | tst2.ts:11:5:11:23 | nd2 = A.x as number |
53+
| tst2.ts:11:11:11:11 | A | tst2.ts:11:11:11:11 | A |
54+
| tst2.ts:11:11:11:13 | A.x | tst2.ts:11:11:11:13 | A.x |
55+
| tst2.ts:11:11:11:23 | A.x as number | tst2.ts:11:11:11:23 | A.x as number |
56+
| tst2.ts:11:13:11:13 | x | tst2.ts:11:13:11:13 | x |
57+
| tst2.ts:13:7:13:16 | StringList | tst2.ts:13:7:13:16 | StringList |
58+
| tst2.ts:13:26:13:29 | List | tst2.ts:13:26:13:29 | List |
59+
| tst2.ts:13:26:13:37 | List<string> | tst2.ts:13:26:13:37 | List<string> |
60+
| tst2.ts:13:39:13:38 | (...arg ... rgs); } | tst2.ts:13:39:13:38 | (...arg ... rgs); } |
61+
| tst2.ts:13:39:13:38 | ...args | tst2.ts:13:39:13:38 | ...args |
62+
| tst2.ts:13:39:13:38 | args | tst2.ts:13:39:13:38 | args |
63+
| tst2.ts:13:39:13:38 | args | tst2.ts:13:39:13:38 | args |
64+
| tst2.ts:13:39:13:38 | args | tst2.ts:13:39:13:38 | args |
65+
| tst2.ts:13:39:13:38 | constructor | tst2.ts:13:39:13:38 | constructor |
66+
| tst2.ts:13:39:13:38 | super | tst2.ts:13:39:13:38 | super |
67+
| tst2.ts:13:39:13:38 | super(...args) | tst2.ts:13:39:13:38 | super(...args) |
3868
| tst.js:1:10:1:11 | fs | tst.js:1:10:1:11 | fs |
3969
| tst.js:1:10:1:11 | fs | tst.js:1:10:1:11 | fs |
4070
| tst.js:1:10:1:11 | fs | tst.js:1:10:1:11 | fs |
@@ -289,33 +319,3 @@
289319
| tst.js:115:1:115:12 | Array.call() | tst.js:115:1:115:12 | Array.call() |
290320
| tst.js:115:1:115:12 | reflective call | tst.js:115:1:115:12 | Array.call() |
291321
| tst.js:115:7:115:10 | call | tst.js:115:7:115:10 | call |
292-
| tst.ts:1:18:1:18 | A | tst.ts:1:18:1:18 | A |
293-
| tst.ts:2:14:2:14 | x | tst.ts:2:14:2:14 | x |
294-
| tst.ts:2:14:2:19 | x = 42 | tst.ts:2:14:2:19 | x = 42 |
295-
| tst.ts:2:18:2:19 | 42 | tst.ts:2:18:2:19 | 42 |
296-
| tst.ts:3:3:3:6 | setX | tst.ts:3:3:3:6 | setX |
297-
| tst.ts:3:3:3:8 | setX() | tst.ts:3:3:3:8 | setX() |
298-
| tst.ts:4:3:4:3 | x | tst.ts:4:3:4:3 | x |
299-
| tst.ts:7:10:7:13 | setX | tst.ts:7:10:7:13 | setX |
300-
| tst.ts:8:3:8:3 | A | tst.ts:8:3:8:3 | A |
301-
| tst.ts:8:3:8:5 | A.x | tst.ts:8:3:8:5 | A.x |
302-
| tst.ts:8:3:8:10 | A.x = 23 | tst.ts:8:3:8:10 | A.x = 23 |
303-
| tst.ts:8:5:8:5 | x | tst.ts:8:5:8:5 | x |
304-
| tst.ts:8:9:8:10 | 23 | tst.ts:8:9:8:10 | 23 |
305-
| tst.ts:11:5:11:7 | nd2 | tst.ts:11:5:11:7 | nd2 |
306-
| tst.ts:11:5:11:23 | nd2 = A.x as number | tst.ts:11:5:11:23 | nd2 = A.x as number |
307-
| tst.ts:11:11:11:11 | A | tst.ts:11:11:11:11 | A |
308-
| tst.ts:11:11:11:13 | A.x | tst.ts:11:11:11:13 | A.x |
309-
| tst.ts:11:11:11:23 | A.x as number | tst.ts:11:11:11:23 | A.x as number |
310-
| tst.ts:11:13:11:13 | x | tst.ts:11:13:11:13 | x |
311-
| tst.ts:13:7:13:16 | StringList | tst.ts:13:7:13:16 | StringList |
312-
| tst.ts:13:26:13:29 | List | tst.ts:13:26:13:29 | List |
313-
| tst.ts:13:26:13:37 | List<string> | tst.ts:13:26:13:37 | List<string> |
314-
| tst.ts:13:39:13:38 | (...arg ... rgs); } | tst.ts:13:39:13:38 | (...arg ... rgs); } |
315-
| tst.ts:13:39:13:38 | ...args | tst.ts:13:39:13:38 | ...args |
316-
| tst.ts:13:39:13:38 | args | tst.ts:13:39:13:38 | args |
317-
| tst.ts:13:39:13:38 | args | tst.ts:13:39:13:38 | args |
318-
| tst.ts:13:39:13:38 | args | tst.ts:13:39:13:38 | args |
319-
| tst.ts:13:39:13:38 | constructor | tst.ts:13:39:13:38 | constructor |
320-
| tst.ts:13:39:13:38 | super | tst.ts:13:39:13:38 | super |
321-
| tst.ts:13:39:13:38 | super(...args) | tst.ts:13:39:13:38 | super(...args) |

javascript/ql/test/library-tests/DataFlow/flowStep.expected

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,20 @@
1212
| sources.js:10:12:10:14 | key | sources.js:10:28:10:30 | key |
1313
| sources.js:11:12:11:18 | key | sources.js:11:32:11:34 | key |
1414
| sources.js:11:14:11:16 | key | sources.js:11:12:11:18 | key |
15+
| tst2.ts:1:1:1:1 | A | tst2.ts:1:18:1:18 | A |
16+
| tst2.ts:1:1:1:1 | A | tst2.ts:7:1:7:0 | A |
17+
| tst2.ts:1:8:5:1 | A | tst2.ts:7:1:7:0 | A |
18+
| tst2.ts:1:8:5:1 | A | tst2.ts:11:11:11:11 | A |
19+
| tst2.ts:1:8:5:1 | namespa ... lysed\\n} | tst2.ts:1:8:5:1 | A |
20+
| tst2.ts:2:14:2:19 | x | tst2.ts:4:3:4:3 | x |
21+
| tst2.ts:2:18:2:19 | 42 | tst2.ts:2:14:2:19 | x |
22+
| tst2.ts:7:1:7:0 | A | tst2.ts:8:3:8:3 | A |
23+
| tst2.ts:7:1:9:1 | functio ... = 23;\\n} | tst2.ts:7:10:7:13 | setX |
24+
| tst2.ts:7:10:7:13 | setX | tst2.ts:3:3:3:6 | setX |
25+
| tst2.ts:8:9:8:10 | 23 | tst2.ts:8:3:8:10 | A.x = 23 |
26+
| tst2.ts:11:11:11:13 | A.x | tst2.ts:11:11:11:23 | A.x as number |
27+
| tst2.ts:13:26:13:29 | List | tst2.ts:13:26:13:37 | List<string> |
28+
| tst2.ts:13:39:13:38 | args | tst2.ts:13:39:13:38 | args |
1529
| tst.js:1:1:1:1 | x | tst.js:28:2:28:1 | x |
1630
| tst.js:1:1:1:1 | x | tst.js:32:1:32:0 | x |
1731
| tst.js:1:10:1:11 | fs | tst.js:1:10:1:11 | fs |
@@ -147,17 +161,3 @@
147161
| tst.js:111:29:111:31 | o2c | tst.js:111:6:111:38 | v2c |
148162
| tst.js:111:36:111:38 | o2d | tst.js:111:6:111:32 | [v2a, v ... = o2c] |
149163
| tst.js:115:1:115:12 | reflective call | tst.js:115:1:115:12 | Array.call() |
150-
| tst.ts:1:1:1:1 | A | tst.ts:1:18:1:18 | A |
151-
| tst.ts:1:1:1:1 | A | tst.ts:7:1:7:0 | A |
152-
| tst.ts:1:8:5:1 | A | tst.ts:7:1:7:0 | A |
153-
| tst.ts:1:8:5:1 | A | tst.ts:11:11:11:11 | A |
154-
| tst.ts:1:8:5:1 | namespa ... lysed\\n} | tst.ts:1:8:5:1 | A |
155-
| tst.ts:2:14:2:19 | x | tst.ts:4:3:4:3 | x |
156-
| tst.ts:2:18:2:19 | 42 | tst.ts:2:14:2:19 | x |
157-
| tst.ts:7:1:7:0 | A | tst.ts:8:3:8:3 | A |
158-
| tst.ts:7:1:9:1 | functio ... = 23;\\n} | tst.ts:7:10:7:13 | setX |
159-
| tst.ts:7:10:7:13 | setX | tst.ts:3:3:3:6 | setX |
160-
| tst.ts:8:9:8:10 | 23 | tst.ts:8:3:8:10 | A.x = 23 |
161-
| tst.ts:11:11:11:13 | A.x | tst.ts:11:11:11:23 | A.x as number |
162-
| tst.ts:13:26:13:29 | List | tst.ts:13:26:13:37 | List<string> |
163-
| tst.ts:13:39:13:38 | args | tst.ts:13:39:13:38 | args |

javascript/ql/test/library-tests/DataFlow/getIntValue.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
| eval.js:2:11:2:12 | 42 | 42 |
22
| sources.js:4:12:4:13 | 19 | 19 |
33
| sources.js:5:4:5:5 | 23 | 23 |
4+
| tst2.ts:2:18:2:19 | 42 | 42 |
5+
| tst2.ts:8:9:8:10 | 23 | 23 |
46
| tst.js:3:9:3:10 | 42 | 42 |
57
| tst.js:51:11:51:12 | 42 | 42 |
68
| tst.js:65:9:65:10 | 42 | 42 |
@@ -11,5 +13,3 @@
1113
| tst.js:103:6:103:7 | 19 | 19 |
1214
| tst.js:103:10:103:11 | 23 | 23 |
1315
| tst.js:103:14:103:14 | 0 | 0 |
14-
| tst.ts:2:18:2:19 | 42 | 42 |
15-
| tst.ts:8:9:8:10 | 23 | 23 |

javascript/ql/test/library-tests/DataFlow/incomplete.expected

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@
1313
| sources.js:10:12:10:14 | key | heap |
1414
| sources.js:11:12:11:18 | key | heap |
1515
| sources.js:11:14:11:16 | key | heap |
16+
| tst2.ts:2:14:2:19 | x | namespace |
17+
| tst2.ts:3:3:3:8 | exceptional return of setX() | call |
18+
| tst2.ts:3:3:3:8 | setX() | call |
19+
| tst2.ts:7:1:9:1 | exceptional return of function setX | call |
20+
| tst2.ts:8:3:8:5 | A.x | heap |
21+
| tst2.ts:11:11:11:13 | A.x | heap |
22+
| tst2.ts:13:26:13:29 | List | global |
23+
| tst2.ts:13:39:13:38 | args | call |
24+
| tst2.ts:13:39:13:38 | exceptional return of default constructor of class StringList | call |
25+
| tst2.ts:13:39:13:38 | exceptional return of super(...args) | call |
26+
| tst2.ts:13:39:13:38 | super | call |
27+
| tst2.ts:13:39:13:38 | super(...args) | call |
1628
| tst.js:1:10:1:11 | fs | import |
1729
| tst.js:16:1:20:9 | exceptional return of (functi ... ("arg") | call |
1830
| tst.js:16:2:20:1 | exceptional return of function f | call |
@@ -92,15 +104,3 @@
92104
| tst.js:115:1:115:10 | Array.call | heap |
93105
| tst.js:115:1:115:12 | Array.call() | call |
94106
| tst.js:115:1:115:12 | exceptional return of Array.call() | call |
95-
| tst.ts:2:14:2:19 | x | namespace |
96-
| tst.ts:3:3:3:8 | exceptional return of setX() | call |
97-
| tst.ts:3:3:3:8 | setX() | call |
98-
| tst.ts:7:1:9:1 | exceptional return of function setX | call |
99-
| tst.ts:8:3:8:5 | A.x | heap |
100-
| tst.ts:11:11:11:13 | A.x | heap |
101-
| tst.ts:13:26:13:29 | List | global |
102-
| tst.ts:13:39:13:38 | args | call |
103-
| tst.ts:13:39:13:38 | exceptional return of default constructor of class StringList | call |
104-
| tst.ts:13:39:13:38 | exceptional return of super(...args) | call |
105-
| tst.ts:13:39:13:38 | super | call |
106-
| tst.ts:13:39:13:38 | super(...args) | call |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
| sources.js:1:6:1:6 | x |
22
| sources.js:3:11:3:11 | x |
33
| sources.js:9:14:9:18 | array |
4+
| tst2.ts:13:39:13:38 | args |
45
| tst.js:16:13:16:13 | a |
56
| tst.js:32:12:32:12 | b |
67
| tst.js:87:11:87:24 | { p: x, ...o } |
78
| tst.js:98:11:98:24 | [ x, ...rest ] |
8-
| tst.ts:13:39:13:38 | args |

javascript/ql/test/library-tests/DataFlow/sources.expected

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@
1919
| sources.js:10:12:10:14 | key |
2020
| sources.js:11:12:11:18 | { key } |
2121
| sources.js:11:14:11:16 | key |
22+
| tst2.ts:1:1:1:0 | this |
23+
| tst2.ts:3:3:3:8 | setX() |
24+
| tst2.ts:7:1:7:0 | this |
25+
| tst2.ts:7:1:9:1 | functio ... = 23;\\n} |
26+
| tst2.ts:8:3:8:5 | A.x |
27+
| tst2.ts:11:11:11:13 | A.x |
28+
| tst2.ts:13:1:13:40 | class S ... ing> {} |
29+
| tst2.ts:13:26:13:29 | List |
30+
| tst2.ts:13:39:13:38 | (...arg ... rgs); } |
31+
| tst2.ts:13:39:13:38 | args |
32+
| tst2.ts:13:39:13:38 | super(...args) |
33+
| tst2.ts:13:39:13:38 | this |
2234
| tst.js:1:1:1:0 | this |
2335
| tst.js:1:1:1:24 | import ... m 'fs'; |
2436
| tst.js:1:10:1:11 | fs |
@@ -105,15 +117,3 @@
105117
| tst.js:115:1:115:10 | Array.call |
106118
| tst.js:115:1:115:12 | Array.call() |
107119
| tst.js:115:1:115:12 | reflective call |
108-
| tst.ts:1:1:1:0 | this |
109-
| tst.ts:3:3:3:8 | setX() |
110-
| tst.ts:7:1:7:0 | this |
111-
| tst.ts:7:1:9:1 | functio ... = 23;\\n} |
112-
| tst.ts:8:3:8:5 | A.x |
113-
| tst.ts:11:11:11:13 | A.x |
114-
| tst.ts:13:1:13:40 | class S ... ing> {} |
115-
| tst.ts:13:26:13:29 | List |
116-
| tst.ts:13:39:13:38 | (...arg ... rgs); } |
117-
| tst.ts:13:39:13:38 | args |
118-
| tst.ts:13:39:13:38 | super(...args) |
119-
| tst.ts:13:39:13:38 | this |

0 commit comments

Comments
 (0)