-
-
Notifications
You must be signed in to change notification settings - Fork 94
Expand file tree
/
Copy pathFallbackScopeHandler.ts
More file actions
64 lines (56 loc) · 1.63 KB
/
Copy pathFallbackScopeHandler.ts
File metadata and controls
64 lines (56 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import {
type Direction,
type Position,
type TextEditor,
} from "@cursorless/lib-common";
import { BaseScopeHandler } from "./BaseScopeHandler";
import type { ScopeHandlerFactory } from "./ScopeHandlerFactory";
import type { TargetScope } from "./scope.types";
import type {
FallbackScopeType,
ScopeHandler,
ScopeIteratorRequirements,
} from "./scopeHandler.types";
export class FallbackScopeHandler extends BaseScopeHandler {
public scopeType = undefined;
protected isHierarchical = true;
static maybeCreate(
scopeHandlerFactory: ScopeHandlerFactory,
scopeType: FallbackScopeType,
languageId: string,
): ScopeHandler | undefined {
const scopeHandlers = scopeType.scopeTypes
.map((scopeType) =>
scopeHandlerFactory.maybeCreate(scopeType, languageId),
)
.filter(
(scopeHandler): scopeHandler is ScopeHandler => scopeHandler != null,
);
if (scopeHandlers.length === 0) {
return undefined;
}
if (scopeHandlers.length === 1) {
return scopeHandlers[0];
}
return new FallbackScopeHandler(scopeHandlers);
}
constructor(private scopeHandlers: ScopeHandler[]) {
super();
}
get iterationScopeType(): FallbackScopeType {
return {
type: "fallback",
scopeTypes: this.scopeHandlers.map((s) => s.iterationScopeType),
};
}
*generateScopeCandidates(
editor: TextEditor,
position: Position,
direction: Direction,
hints: ScopeIteratorRequirements,
): Iterable<TargetScope> {
for (const scopeHandler of this.scopeHandlers) {
yield* scopeHandler.generateScopes(editor, position, direction, hints);
}
}
}