Skip to content

Commit 2381881

Browse files
committed
feat: scala support + tree-sitter 0.21.1 bump
1 parent 9bb66a1 commit 2381881

File tree

13 files changed

+2163
-1786
lines changed

13 files changed

+2163
-1786
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
- Python
4444
- Ruby
4545
- Rust
46+
- Scala
4647
- TypeScript
4748
- TypeScript JSX (TSX)
4849
- 🗂 Document symbols (Display document outline tree)

package-lock.json

Lines changed: 2001 additions & 1770 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,20 @@
7474
"js-search": "2.0.1",
7575
"mustache": "4.2.0",
7676
"vscode-languageserver-types": "3.17.5",
77-
"web-tree-sitter": "0.20.8"
77+
"web-tree-sitter": "^0.24.7"
7878
},
7979
"optionalDependencies": {
80-
"tree-sitter": "0.20.6",
81-
"tree-sitter-c-sharp": "0.20.0",
82-
"tree-sitter-cli": "0.20.8",
83-
"tree-sitter-go": "0.20.0",
84-
"tree-sitter-java": "0.20.2",
85-
"tree-sitter-php": "0.20.0",
86-
"tree-sitter-python": "0.20.4",
87-
"tree-sitter-ruby": "0.19.0",
88-
"tree-sitter-rust": "0.20.4",
89-
"tree-sitter-typescript": "0.20.5"
80+
"tree-sitter": "^0.21.1",
81+
"tree-sitter-c-sharp": "0.23.1",
82+
"tree-sitter-cli": "0.24.4",
83+
"tree-sitter-go": "0.23.4",
84+
"tree-sitter-java": "0.23.4",
85+
"tree-sitter-php": "0.23.11",
86+
"tree-sitter-python": "0.23.4",
87+
"tree-sitter-ruby": "0.23.1",
88+
"tree-sitter-rust": "0.23.1",
89+
"tree-sitter-typescript": "0.23.2",
90+
"tree-sitter-scala": "^0.23.4"
9091
},
9192
"devDependencies": {
9293
"@cucumber/cucumber": "^10.0.0",

scripts/build.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ const languages = [
4545
dir: '',
4646
wasm: 'go',
4747
},
48+
{
49+
npm: 'tree-sitter-scala',
50+
dir: '',
51+
wasm: 'scala',
52+
},
4853
]
4954

5055
// Build wasm parsers for supported languages
@@ -69,11 +74,19 @@ if (!fs.existsSync(treeSitterCli)) {
6974
let command
7075
if (process.env.CI) {
7176
console.log(`Compiling ${module}`)
72-
command = `node_modules/.bin/tree-sitter build-wasm ${module}`
77+
if (module.endsWith('tree-sitter-php')) {
78+
command = `node_modules/.bin/tree-sitter build --wasm ${module}/php`
79+
} else {
80+
command = `node_modules/.bin/tree-sitter build --wasm ${module}`
81+
}
7382
} else {
7483
console.log(`Compiling ${module} inside docker`)
7584
// https://github.com/tree-sitter/tree-sitter/issues/1560
76-
command = `node_modules/.bin/tree-sitter build-wasm ${module} --docker`
85+
if (module.endsWith('tree-sitter-php')) {
86+
command = `node_modules/.bin/tree-sitter build --wasm ${module}/php --docker`
87+
} else {
88+
command = `node_modules/.bin/tree-sitter build --wasm ${module} --docker`
89+
}
7790
}
7891
exec(command, (err) => {
7992
if (err) {

src/language/csharpLanguage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export const csharpLanguage: Language = {
5959
)?
6060
)
6161
)
62-
type: (identifier) @name
62+
returns: (identifier) @name
6363
(#eq? @attribute-name "StepArgumentTransformation")
6464
) @root
6565
`,

src/language/languages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { phpLanguage } from './phpLanguage.js'
66
import { pythonLanguage } from './pythonLanguage.js'
77
import { rubyLanguage } from './rubyLanguage.js'
88
import { rustLanguage } from './rustLanguage.js'
9+
import { scalaLanguage } from './scalaLanguage.js'
910
import { tsxLanguage } from './tsxLanguage.js'
1011
import { Language, LanguageName } from './types.js'
1112

@@ -19,6 +20,7 @@ const languageByName: Record<LanguageName, Language> = {
1920
python: pythonLanguage,
2021
javascript: javascriptLanguage,
2122
go: goLanguage,
23+
scala: scalaLanguage,
2224
}
2325

2426
export function getLanguage(languageName: LanguageName): Language {

src/language/scalaLanguage.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { Language, TreeSitterSyntaxNode } from './types.js'
2+
3+
export const scalaLanguage: Language = {
4+
toParameterTypeName(node) {
5+
switch (node.type) {
6+
case 'string': {
7+
return stringLiteral(node)
8+
}
9+
case 'identifier': {
10+
return node.text
11+
}
12+
default: {
13+
throw new Error(`Unsupported node type ${node.type}`)
14+
}
15+
}
16+
},
17+
toParameterTypeRegExps(node) {
18+
if (node === null) {
19+
return /.*/
20+
}
21+
return stringLiteral(node)
22+
},
23+
toStepDefinitionExpression(node) {
24+
if (node.type === 'string') {
25+
const text = stringLiteral(node)
26+
const hasRegExpAnchors = text[0] == '^' || text[text.length - 1] == '$'
27+
return hasRegExpAnchors ? new RegExp(text) : text
28+
}
29+
throw new Error(`Unsupported node type ${node.type}`)
30+
},
31+
32+
defineParameterTypeQueries: [
33+
`
34+
(call_expression
35+
function: (identifier) @function-name
36+
arguments: (arguments
37+
(
38+
(string) @name
39+
(string)
40+
)
41+
)
42+
(#match? @function-name "ParameterType")
43+
) @root
44+
`,
45+
],
46+
defineStepDefinitionQueries: [
47+
`
48+
(call_expression
49+
function: (identifier) @function-name
50+
arguments: (arguments
51+
(
52+
(string) @expression
53+
)
54+
)
55+
(#match? @function-name "Given|When|Then|And|But")
56+
) @root
57+
`,
58+
],
59+
snippetParameters: {
60+
int: { type: 'Int', name: 'i' },
61+
float: { type: 'Float', name: 'f' },
62+
word: { type: 'String' },
63+
string: { type: 'String', name: 's' },
64+
double: { type: 'Double', name: 'd' },
65+
bigdecimal: { type: 'scala.math.BigDecimal', name: 'bigDecimal' },
66+
byte: { type: 'Byte', name: 'b' },
67+
short: { type: 'Short', name: 's' },
68+
long: { type: 'Long', name: 'l' },
69+
biginteger: { type: 'scala.math.BigInteger', name: 'bigInteger' },
70+
'': { type: 'Any', name: 'arg' },
71+
},
72+
defaultSnippetTemplate: `
73+
{{ keyword }}("""{{ expression }}""") { ({{ #parameters }}{{ #seenParameter }}, {{ /seenParameter }}{{ name }}: {{ type }}{{ /parameters }}) =>
74+
// {{ blurb }}
75+
}
76+
`,
77+
}
78+
79+
export function stringLiteral(node: TreeSitterSyntaxNode | null): string {
80+
if (node === null) throw new Error('node cannot be null')
81+
if (node.text.startsWith('"""')) {
82+
return node.text.slice(3, -3)
83+
}
84+
return node.text.slice(1, -1)
85+
}

src/language/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export const LanguageNames = [
4545
'rust',
4646
'javascript',
4747
'go',
48+
'scala',
4849
] as const
4950
export type LanguageName = (typeof LanguageNames)[number]
5051

src/tree-sitter-node/NodeParserAdapter.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import Ruby from 'tree-sitter-ruby'
1515
// @ts-ignore
1616
import Rust from 'tree-sitter-rust'
1717
// @ts-ignore
18+
import Scala from 'tree-sitter-scala'
19+
// @ts-ignore
1820
import TypeScript from 'tree-sitter-typescript'
1921

2022
import { LanguageName, ParserAdapter } from '../language/types.js'
@@ -39,7 +41,7 @@ export class NodeParserAdapter implements ParserAdapter {
3941
this.parser.setLanguage(Csharp)
4042
break
4143
case 'php':
42-
this.parser.setLanguage(Php)
44+
this.parser.setLanguage(Php.php)
4345
break
4446
case 'ruby':
4547
this.parser.setLanguage(Ruby)
@@ -53,6 +55,9 @@ export class NodeParserAdapter implements ParserAdapter {
5355
case 'go':
5456
this.parser.setLanguage(Go)
5557
break
58+
case 'scala':
59+
this.parser.setLanguage(Scala)
60+
break
5661
default:
5762
throw new Error(`Unsupported language: ${languageName}`)
5863
}

test/language/ExpressionBuilder.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const cucumberExpressionsSupport: Set<LanguageName> = new Set([
1818
'ruby',
1919
'rust',
2020
'tsx',
21+
'scala',
2122
])
2223

2324
function defineContract(makeParserAdapter: () => ParserAdapter) {

0 commit comments

Comments
 (0)