-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
javaLanguage.ts
128 lines (123 loc) · 3.27 KB
/
javaLanguage.ts
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { Language, TreeSitterSyntaxNode } from './types.js'
export const javaLanguage: Language = {
toParameterTypeName(node) {
switch (node.type) {
case 'string_literal': {
return stringLiteral(node)
}
case 'identifier': {
return node.text
}
default: {
throw new Error(`Unsupported node type ${node.type}`)
}
}
},
toParameterTypeRegExps(node) {
return stringLiteral(node)
},
toStepDefinitionExpression(node) {
const text = stringLiteral(node)
const hasRegExpAnchors = text[0] == '^' || text[text.length - 1] == '$'
return hasRegExpAnchors ? new RegExp(text) : text
},
defineParameterTypeQueries: [
`
(method_declaration
(modifiers
(annotation
name: (identifier) @annotation-name
arguments: (annotation_argument_list
[
(string_literal) @expression
]
)
)
)
name: (identifier) @name
(#eq? @annotation-name "ParameterType")
) @root
`,
`
(method_declaration
(modifiers
(annotation
name: (identifier) @annotation-name
arguments: (annotation_argument_list
[
(
(element_value_pair
key: (identifier) @name-key
value: (string_literal) @name
)
(element_value_pair
key: (identifier) @value-key
value: (string_literal) @expression
)
)
(
(element_value_pair
key: (identifier) @value-key
value: (string_literal) @expression
)
(element_value_pair
key: (identifier) @name-key
value: (string_literal) @name
)
)
]
)
)
)
(#eq? @annotation-name "ParameterType")
(#eq? @name-key "name")
(#eq? @value-key "value")
) @root
`,
],
defineStepDefinitionQueries: [
`
(method_declaration
(modifiers
(annotation
name: (identifier) @annotation-name
arguments: (annotation_argument_list
[
(string_literal) @expression
]
)
)
)
(#match? @annotation-name "Given|When|Then")
) @root
`,
],
snippetParameters: {
int: { type: 'int', name: 'i' },
float: { type: 'float', name: 'f' },
word: { type: 'String' },
string: { type: 'String', name: 's' },
double: { type: 'double', name: 'd' },
bigdecimal: { type: 'java.math.BigDecimal', name: 'bigDecimal' },
byte: { type: 'byte', name: 'b' },
short: { type: 'short', name: 's' },
long: { type: 'long', name: 'l' },
biginteger: { type: 'java.math.BigInteger', name: 'bigInteger' },
'': { type: 'Object', name: 'arg' },
},
defaultSnippetTemplate: `
@{{ keyword }}("{{ expression }}")
public void {{ #underscore }}{{ expression }}{{ /underscore }}({{ #parameters }}{{ #seenParameter }}, {{ /seenParameter }}{{ type }} {{ name }}{{ /parameters }}) {
// {{ blurb }}
}
`,
}
export function stringLiteral(node: TreeSitterSyntaxNode | null): string {
if (node === null) throw new Error('node cannot be null')
const string = node.text.slice(1, -1)
return unescapeString(string.replace('(?i)', ''))
}
// Java escapes \ as \\. Turn \\ back to \.
function unescapeString(s: string): string {
return s.replace(/\\\\/g, '\\')
}