From 2fa858542f6e078934ea98ed34cbce58b3022c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Mon, 10 Oct 2022 22:26:43 +0200 Subject: [PATCH 1/2] Strip Java case insensitive flags --- src/language/javaLanguage.ts | 5 +++-- test/language/javaLanguage.test.ts | 18 ++++++++++++++++++ test/language/rubyLanguage.test.ts | 4 ++-- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test/language/javaLanguage.test.ts diff --git a/src/language/javaLanguage.ts b/src/language/javaLanguage.ts index 58a2ba88..63025817 100644 --- a/src/language/javaLanguage.ts +++ b/src/language/javaLanguage.ts @@ -116,9 +116,10 @@ export const javaLanguage: Language = { `, } -function stringLiteral(node: TreeSitterSyntaxNode | null): string { +export function stringLiteral(node: TreeSitterSyntaxNode | null): string { if (node === null) throw new Error('node cannot be null') - return unescapeString(node.text.slice(1, -1)) + const string = node.text.slice(1, -1) + return unescapeString(string.replace('(?i)', '')) } // Java escapes \ as \\. Turn \\ back to \. diff --git a/test/language/javaLanguage.test.ts b/test/language/javaLanguage.test.ts new file mode 100644 index 00000000..00bc1989 --- /dev/null +++ b/test/language/javaLanguage.test.ts @@ -0,0 +1,18 @@ +import assert from 'assert' + +import { stringLiteral } from '../../src/language/javaLanguage.js' +import { TreeSitterSyntaxNode } from '../../src/language/types.js' + +describe('javaLanguage', () => { + it('should remove (?i) from regexp strings', () => { + const node: TreeSitterSyntaxNode = { + type: 'string_literal', + text: '"(?i)(day|hour)s?"', + startPosition: { row: 1, column: 19 }, + endPosition: { row: 1, column: 37 }, + children: [], + } + const result = stringLiteral(node) + assert.deepStrictEqual(result, '(day|hour)s?') + }) +}) diff --git a/test/language/rubyLanguage.test.ts b/test/language/rubyLanguage.test.ts index 4b9c4319..091f0cf4 100644 --- a/test/language/rubyLanguage.test.ts +++ b/test/language/rubyLanguage.test.ts @@ -5,7 +5,7 @@ import { TreeSitterSyntaxNode } from '../../src/language/types.js' describe('rubyLanguage', () => { it('should preserve regexp flags in step definitions', () => { - const regex: TreeSitterSyntaxNode = { + const node: TreeSitterSyntaxNode = { type: 'regex', text: '/^a regexp$/i', startPosition: { row: 0, column: 6 }, @@ -20,7 +20,7 @@ describe('rubyLanguage', () => { }, ], } - const result = toStringOrRegExp(regex) + const result = toStringOrRegExp(node) assert.deepStrictEqual(result, /^a regexp$/i) }) }) From 5d0bf4ead193c9c3b03890a7f54f96454e26d5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Mon, 10 Oct 2022 22:30:41 +0200 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3c445c3..01274c9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Add support for [document symbols](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentSymbol) ([#98](https://github.com/cucumber/language-service/issues/98), [#106](https://github.com/cucumber/language-service/pull/106)) +- (Java) Recognise regexps with `(?i)`, with the caveat that the resulting JavaScript `RegExp` is *not* case insensitive ([#100](https://github.com/cucumber/language-service/issues/100), [#108](https://github.com/cucumber/language-service/pull/108)) ## [1.0.1] - 2022-10-10