Skip to content

Commit 79b4d59

Browse files
authored
Migrate Typescript "type" to next-gen; fix value removal (#1925)
Note that the first commit moves `typescript.scm` to `typescript.core.scm`, because we now have some patterns that shouldn't be defined for TSX (cast assertions eg `<foo>bar`). I made it its own commit because otherwise the diff is confusing. Might be easier to review https://github.com/cursorless-dev/cursorless/pull/1925/files/dbb4e5ea4135dad6bcff272f6bc85752a650013e..a2ced3b3ad14a27b4d47d344ddacfebba65c0915, which excludes that commit ## Checklist - [x] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [-] I have updated the [docs](https://github.com/cursorless-dev/cursorless/tree/main/docs) and [cheatsheet](https://github.com/cursorless-dev/cursorless/tree/main/cursorless-talon/src/cheatsheet) - [-] I have not broken the cheatsheet
1 parent 4a2091e commit 79b4d59

File tree

17 files changed

+966
-195
lines changed

17 files changed

+966
-195
lines changed

packages/cursorless-engine/src/languages/typescript.ts

Lines changed: 1 addition & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
import { SimpleScopeTypeType } from "@cursorless/common";
22
import type { SyntaxNode } from "web-tree-sitter";
3-
import {
4-
NodeMatcher,
5-
NodeMatcherAlternative,
6-
SelectionWithEditor,
7-
} from "../typings/Types";
3+
import { NodeMatcherAlternative, SelectionWithEditor } from "../typings/Types";
84
import { patternFinder } from "../util/nodeFinders";
95
import {
106
argumentMatcher,
@@ -20,9 +16,6 @@ import {
2016
extendForwardPastOptional,
2117
getNodeInternalRange,
2218
getNodeRange,
23-
pairSelectionExtractor,
24-
selectWithLeadingDelimiter,
25-
simpleSelectionExtractor,
2619
unwrapSelectionExtractor,
2720
} from "../util/nodeSelectors";
2821
import { branchMatcher } from "./branchMatcher";
@@ -69,61 +62,6 @@ const STATEMENT_TYPES = [
6962
"with_statement",
7063
];
7164

72-
function typeMatcher(): NodeMatcher {
73-
const delimiterSelector = selectWithLeadingDelimiter(":");
74-
return function (selection: SelectionWithEditor, node: SyntaxNode) {
75-
if (
76-
node.parent?.type === "new_expression" &&
77-
node.type !== "new" &&
78-
node.type !== "arguments"
79-
) {
80-
const identifierNode = node.parent.children.find(
81-
(n) => n.type === "identifier",
82-
);
83-
const argsNode = node.parent.children.find(
84-
(n) => n.type === "type_arguments",
85-
);
86-
if (identifierNode && argsNode) {
87-
return [
88-
{
89-
node,
90-
selection: pairSelectionExtractor(
91-
selection.editor,
92-
identifierNode,
93-
argsNode,
94-
),
95-
},
96-
];
97-
} else if (identifierNode) {
98-
return [
99-
{
100-
node: identifierNode,
101-
selection: simpleSelectionExtractor(
102-
selection.editor,
103-
identifierNode,
104-
),
105-
},
106-
];
107-
}
108-
}
109-
110-
const typeAnnotationNode = node.children.find((child) =>
111-
["type_annotation", "opting_type_annotation"].includes(child.type),
112-
);
113-
const targetNode = typeAnnotationNode?.lastChild;
114-
115-
if (targetNode) {
116-
return [
117-
{
118-
node: targetNode,
119-
selection: delimiterSelector(selection.editor, targetNode),
120-
},
121-
];
122-
}
123-
return null;
124-
};
125-
}
126-
12765
const mapTypes = ["object", "object_pattern"];
12866
const listTypes = ["array", "array_pattern"];
12967

@@ -194,25 +132,6 @@ const nodeMatchers: Partial<
194132
"export_statement?.abstract_class_declaration", // export abstract class | abstract class
195133
"export_statement.class", // export default class
196134
],
197-
type: cascadingMatcher(
198-
// Typed parameters, properties, and functions
199-
typeMatcher(),
200-
// matcher(findTypeNode, selectWithLeadingDelimiter(":")),
201-
patternMatcher(
202-
// Type alias/interface declarations
203-
"export_statement?.type_alias_declaration",
204-
"export_statement?.interface_declaration",
205-
// as type declarations
206-
"as_expression.generic_type!",
207-
"as_expression.predefined_type!",
208-
// satisfies type declaration
209-
"satisfies_expression.generic_type!",
210-
"satisfies_expression.predefined_type!",
211-
// <type> declaration
212-
"type_assertion.type_arguments.generic_type!",
213-
"type_assertion.type_arguments.predefined_type!",
214-
),
215-
),
216135
argumentOrParameter: argumentMatcher("formal_parameters", "arguments"),
217136
// XML, JSX
218137
attribute: ["jsx_attribute"],
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: change every type
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: everyScope
11+
scopeType: {type: type}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: |-
15+
const aaa: number = 0;
16+
const bbb: number = 0;
17+
selections:
18+
- anchor: {line: 1, character: 22}
19+
active: {line: 1, character: 22}
20+
marks: {}
21+
finalState:
22+
documentContents: |-
23+
const aaa: = 0;
24+
const bbb: = 0;
25+
selections:
26+
- anchor: {line: 0, character: 11}
27+
active: {line: 0, character: 11}
28+
- anchor: {line: 1, character: 11}
29+
active: {line: 1, character: 11}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: change every type
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: everyScope
11+
scopeType: {type: type}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: |-
15+
function ccc() {
16+
const aaa: number = 0;
17+
const bbb: number = 0;
18+
}
19+
selections:
20+
- anchor: {line: 2, character: 26}
21+
active: {line: 2, character: 26}
22+
marks: {}
23+
finalState:
24+
documentContents: |-
25+
function ccc() {
26+
const aaa: = 0;
27+
const bbb: = 0;
28+
}
29+
selections:
30+
- anchor: {line: 1, character: 15}
31+
active: {line: 1, character: 15}
32+
- anchor: {line: 2, character: 15}
33+
active: {line: 2, character: 15}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: change every type
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: everyScope
11+
scopeType: {type: type}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: "function ccc(aaa: string, bbb: string) {}"
15+
selections:
16+
- anchor: {line: 0, character: 13}
17+
active: {line: 0, character: 13}
18+
marks: {}
19+
finalState:
20+
documentContents: "function ccc(aaa: , bbb: ) {}"
21+
selections:
22+
- anchor: {line: 0, character: 18}
23+
active: {line: 0, character: 18}
24+
- anchor: {line: 0, character: 25}
25+
active: {line: 0, character: 25}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: change type
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: containingScope
11+
scopeType: {type: type}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: |-
15+
const aaa: number = 0;
16+
let bbb: number = 0;
17+
var hhh: number = 0;
18+
const ddd: number = 0, eee: number = 0;
19+
let fff: number = 0, ggg: number = 0;
20+
var iii: number = 0;
21+
export const jjj: number = 0;
22+
export let kkk: number = 0;
23+
export var lll: number = 0;
24+
export const mmm: number = 0, nnn: number = 0;
25+
export let ooo: number = 0, ppp: number = 0;
26+
let qqq: number;
27+
var rrr: number;
28+
let sss: number, ttt: number;
29+
selections:
30+
- anchor: {line: 0, character: 22}
31+
active: {line: 0, character: 22}
32+
- anchor: {line: 1, character: 20}
33+
active: {line: 1, character: 20}
34+
- anchor: {line: 2, character: 20}
35+
active: {line: 2, character: 20}
36+
- anchor: {line: 3, character: 39}
37+
active: {line: 3, character: 39}
38+
- anchor: {line: 4, character: 37}
39+
active: {line: 4, character: 37}
40+
- anchor: {line: 5, character: 20}
41+
active: {line: 5, character: 20}
42+
- anchor: {line: 6, character: 29}
43+
active: {line: 6, character: 29}
44+
- anchor: {line: 7, character: 27}
45+
active: {line: 7, character: 27}
46+
- anchor: {line: 8, character: 27}
47+
active: {line: 8, character: 27}
48+
- anchor: {line: 9, character: 46}
49+
active: {line: 9, character: 46}
50+
- anchor: {line: 10, character: 44}
51+
active: {line: 10, character: 44}
52+
- anchor: {line: 11, character: 16}
53+
active: {line: 11, character: 16}
54+
- anchor: {line: 12, character: 16}
55+
active: {line: 12, character: 16}
56+
- anchor: {line: 13, character: 29}
57+
active: {line: 13, character: 29}
58+
marks: {}
59+
finalState:
60+
documentContents: |-
61+
const aaa: = 0;
62+
let bbb: = 0;
63+
var hhh: = 0;
64+
const ddd: = 0, eee: = 0;
65+
let fff: = 0, ggg: = 0;
66+
var iii: = 0;
67+
export const jjj: = 0;
68+
export let kkk: = 0;
69+
export var lll: = 0;
70+
export const mmm: = 0, nnn: = 0;
71+
export let ooo: = 0, ppp: = 0;
72+
let qqq: ;
73+
var rrr: ;
74+
let sss: , ttt: ;
75+
selections:
76+
- anchor: {line: 0, character: 11}
77+
active: {line: 0, character: 11}
78+
- anchor: {line: 1, character: 9}
79+
active: {line: 1, character: 9}
80+
- anchor: {line: 2, character: 9}
81+
active: {line: 2, character: 9}
82+
- anchor: {line: 3, character: 11}
83+
active: {line: 3, character: 11}
84+
- anchor: {line: 3, character: 22}
85+
active: {line: 3, character: 22}
86+
- anchor: {line: 4, character: 9}
87+
active: {line: 4, character: 9}
88+
- anchor: {line: 4, character: 20}
89+
active: {line: 4, character: 20}
90+
- anchor: {line: 5, character: 9}
91+
active: {line: 5, character: 9}
92+
- anchor: {line: 6, character: 18}
93+
active: {line: 6, character: 18}
94+
- anchor: {line: 7, character: 16}
95+
active: {line: 7, character: 16}
96+
- anchor: {line: 8, character: 16}
97+
active: {line: 8, character: 16}
98+
- anchor: {line: 9, character: 18}
99+
active: {line: 9, character: 18}
100+
- anchor: {line: 9, character: 29}
101+
active: {line: 9, character: 29}
102+
- anchor: {line: 10, character: 16}
103+
active: {line: 10, character: 16}
104+
- anchor: {line: 10, character: 27}
105+
active: {line: 10, character: 27}
106+
- anchor: {line: 11, character: 9}
107+
active: {line: 11, character: 9}
108+
- anchor: {line: 12, character: 9}
109+
active: {line: 12, character: 9}
110+
- anchor: {line: 13, character: 9}
111+
active: {line: 13, character: 9}
112+
- anchor: {line: 13, character: 16}
113+
active: {line: 13, character: 16}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: change type
5+
action:
6+
name: clearAndSetSelection
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: containingScope
11+
scopeType: {type: type}
12+
usePrePhraseSnapshot: true
13+
initialState:
14+
documentContents: |-
15+
const ddd: number = 0, eee: number = 0;
16+
let fff: number = 0, ggg: number = 0;
17+
export const mmm: number = 0, nnn: number = 0;
18+
export let ooo: number = 0, ppp: number = 0;
19+
selections:
20+
- anchor: {line: 0, character: 38}
21+
active: {line: 0, character: 38}
22+
- anchor: {line: 1, character: 36}
23+
active: {line: 1, character: 36}
24+
- anchor: {line: 2, character: 45}
25+
active: {line: 2, character: 45}
26+
- anchor: {line: 3, character: 43}
27+
active: {line: 3, character: 43}
28+
marks: {}
29+
finalState:
30+
documentContents: |-
31+
const ddd: number = 0, eee: = 0;
32+
let fff: number = 0, ggg: = 0;
33+
export const mmm: number = 0, nnn: = 0;
34+
export let ooo: number = 0, ppp: = 0;
35+
selections:
36+
- anchor: {line: 0, character: 28}
37+
active: {line: 0, character: 28}
38+
- anchor: {line: 1, character: 26}
39+
active: {line: 1, character: 26}
40+
- anchor: {line: 2, character: 35}
41+
active: {line: 2, character: 35}
42+
- anchor: {line: 3, character: 33}
43+
active: {line: 3, character: 33}

0 commit comments

Comments
 (0)