1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
16 | return new (P || (P = Promise))(function (resolve, reject) {
|
17 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
18 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
19 | function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
|
20 | step((generator = generator.apply(thisArg, _arguments || [])).next());
|
21 | });
|
22 | };
|
23 | Object.defineProperty(exports, "__esModule", { value: true });
|
24 | function scan(document, scanners) {
|
25 | return __awaiter(this, void 0, void 0, function* () {
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | let batchDone;
|
33 |
|
34 | let visitorsPromise;
|
35 |
|
36 | let visitors;
|
37 |
|
38 | const nestedFeatures = [];
|
39 | const warnings = [];
|
40 |
|
41 | let runner = null;
|
42 | let visitError;
|
43 | let visitErrorFound = false;
|
44 |
|
45 | function setup() {
|
46 | visitorsPromise = new Promise((resolve, _) => {
|
47 | batchDone = resolve;
|
48 | });
|
49 | visitors = [];
|
50 | runner = null;
|
51 | }
|
52 |
|
53 | function runVisitors() {
|
54 |
|
55 |
|
56 | const currentVisitors = visitors;
|
57 | const currentDoneCallback = batchDone;
|
58 | setup();
|
59 | try {
|
60 | document.visit(currentVisitors);
|
61 | }
|
62 | finally {
|
63 |
|
64 | currentDoneCallback();
|
65 | }
|
66 | }
|
67 |
|
68 | function visit(visitor) {
|
69 | visitors.push(visitor);
|
70 | if (!runner) {
|
71 | runner = Promise.resolve().then(runVisitors).catch((error) => {
|
72 | visitErrorFound = true;
|
73 | visitError = visitError || error;
|
74 | });
|
75 | }
|
76 | return visitorsPromise;
|
77 | }
|
78 |
|
79 | setup();
|
80 | const scannerPromises = scanners.map((f) => f.scan(document, visit));
|
81 |
|
82 | const nestedResults = yield Promise.all(scannerPromises);
|
83 | if (visitErrorFound || !nestedResults) {
|
84 | throw visitError;
|
85 | }
|
86 | for (const { features, warnings: w } of nestedResults) {
|
87 | nestedFeatures.push(features);
|
88 | if (w !== undefined) {
|
89 | warnings.push(...w);
|
90 | }
|
91 | }
|
92 | return { features: sortFeatures(nestedFeatures), warnings };
|
93 | });
|
94 | }
|
95 | exports.scan = scan;
|
96 | function compareFeaturesBySourceLocation(ent1, ent2) {
|
97 | const range1 = ent1.sourceRange;
|
98 | const range2 = ent2.sourceRange;
|
99 | if (range1 === range2) {
|
100 |
|
101 | return 0;
|
102 | }
|
103 | if (range2 == null) {
|
104 |
|
105 | return -1;
|
106 | }
|
107 | if (range1 == null) {
|
108 |
|
109 | return 1;
|
110 | }
|
111 | const position1 = range1.start;
|
112 | const position2 = range2.start;
|
113 | if (position1.line < position2.line) {
|
114 | return -1;
|
115 | }
|
116 | if (position1.line > position2.line) {
|
117 | return 1;
|
118 | }
|
119 |
|
120 | return position1.column - position2.column;
|
121 | }
|
122 | function sortFeatures(unorderedFeatures) {
|
123 | const allFeatures = [];
|
124 | for (const subArray of unorderedFeatures) {
|
125 | allFeatures.push(...subArray);
|
126 | }
|
127 | return allFeatures.sort(compareFeaturesBySourceLocation);
|
128 | }
|
129 |
|
\ | No newline at end of file |