@@ -15,43 +15,6 @@ const debug = require("./debug-helpers");
15
15
// Helpers
16
16
//------------------------------------------------------------------------------
17
17
18
- /**
19
- * Replaces unused segments with the previous segments of each unused segment.
20
- *
21
- * @param {CodePathSegment[] } segments - An array of segments to replace.
22
- * @returns {CodePathSegment[] } The replaced array.
23
- */
24
- function flattenUnusedSegments ( segments ) {
25
- const done = Object . create ( null ) ;
26
- const retv = [ ] ;
27
-
28
- for ( let i = 0 ; i < segments . length ; ++ i ) {
29
- const segment = segments [ i ] ;
30
-
31
- // Ignores duplicated.
32
- if ( done [ segment . id ] ) {
33
- continue ;
34
- }
35
-
36
- // Use previous segments if unused.
37
- if ( ! segment . internal . used ) {
38
- for ( let j = 0 ; j < segment . allPrevSegments . length ; ++ j ) {
39
- const prevSegment = segment . allPrevSegments [ j ] ;
40
-
41
- if ( ! done [ prevSegment . id ] ) {
42
- done [ prevSegment . id ] = true ;
43
- retv . push ( prevSegment ) ;
44
- }
45
- }
46
- } else {
47
- done [ segment . id ] = true ;
48
- retv . push ( segment ) ;
49
- }
50
- }
51
-
52
- return retv ;
53
- }
54
-
55
18
/**
56
19
* Checks whether or not a given segment is reachable.
57
20
*
@@ -163,7 +126,7 @@ class CodePathSegment {
163
126
static newNext ( id , allPrevSegments ) {
164
127
return new CodePathSegment (
165
128
id ,
166
- flattenUnusedSegments ( allPrevSegments ) ,
129
+ CodePathSegment . flattenUnusedSegments ( allPrevSegments ) ,
167
130
allPrevSegments . some ( isReachable )
168
131
) ;
169
132
}
@@ -176,7 +139,7 @@ class CodePathSegment {
176
139
* @returns {CodePathSegment } The created segment.
177
140
*/
178
141
static newUnreachable ( id , allPrevSegments ) {
179
- const segment = new CodePathSegment ( id , flattenUnusedSegments ( allPrevSegments ) , false ) ;
142
+ const segment = new CodePathSegment ( id , CodePathSegment . flattenUnusedSegments ( allPrevSegments ) , false ) ;
180
143
181
144
// In `if (a) return a; foo();` case, the unreachable segment preceded by
182
145
// the return statement is not used but must not be remove.
@@ -238,6 +201,43 @@ class CodePathSegment {
238
201
static markPrevSegmentAsLooped ( segment , prevSegment ) {
239
202
segment . internal . loopedPrevSegments . push ( prevSegment ) ;
240
203
}
204
+
205
+ /**
206
+ * Replaces unused segments with the previous segments of each unused segment.
207
+ *
208
+ * @param {CodePathSegment[] } segments - An array of segments to replace.
209
+ * @returns {CodePathSegment[] } The replaced array.
210
+ */
211
+ static flattenUnusedSegments ( segments ) {
212
+ const done = Object . create ( null ) ;
213
+ const retv = [ ] ;
214
+
215
+ for ( let i = 0 ; i < segments . length ; ++ i ) {
216
+ const segment = segments [ i ] ;
217
+
218
+ // Ignores duplicated.
219
+ if ( done [ segment . id ] ) {
220
+ continue ;
221
+ }
222
+
223
+ // Use previous segments if unused.
224
+ if ( ! segment . internal . used ) {
225
+ for ( let j = 0 ; j < segment . allPrevSegments . length ; ++ j ) {
226
+ const prevSegment = segment . allPrevSegments [ j ] ;
227
+
228
+ if ( ! done [ prevSegment . id ] ) {
229
+ done [ prevSegment . id ] = true ;
230
+ retv . push ( prevSegment ) ;
231
+ }
232
+ }
233
+ } else {
234
+ done [ segment . id ] = true ;
235
+ retv . push ( segment ) ;
236
+ }
237
+ }
238
+
239
+ return retv ;
240
+ }
241
241
}
242
242
243
243
module . exports = CodePathSegment ;
0 commit comments