From 9f299be6f1f07cbb9c1ecfd96c7806f7b5941463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Thu, 16 Feb 2023 11:39:27 -0300 Subject: [PATCH 01/11] Added a new generic matcher --- vendor/jasmine.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/vendor/jasmine.js b/vendor/jasmine.js index 716fbeb7ed..be2eae8bcd 100644 --- a/vendor/jasmine.js +++ b/vendor/jasmine.js @@ -1448,6 +1448,13 @@ jasmine.Matchers.prototype.toContain = function(expected) { return this.env.contains_(this.actual, expected); }; +jasmine.Matchers.prototype.toSatisfy = function(fn) { + const msgFun = (string) => { + this.message = () => string + } + return fn(this.actual, msgFun) +}; + /** * Matcher that checks that the expected item is NOT an element in the actual Array. * From bc833ad7df0fb9a6e801594808dde39e01f38d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Sat, 18 Feb 2023 17:36:15 -0300 Subject: [PATCH 02/11] POC of a better grammar test --- .../spec/fixtures/classes-wasm-ts.rb | 33 +++++++++ .../spec/wasm-tree-sitter-spec.js | 72 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 packages/language-ruby/spec/fixtures/classes-wasm-ts.rb create mode 100644 packages/language-ruby/spec/wasm-tree-sitter-spec.js diff --git a/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb b/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb new file mode 100644 index 0000000000..9b065d1488 --- /dev/null +++ b/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb @@ -0,0 +1,33 @@ +require "a" +# ^ function.method.builtin + +class Car < Vehicle + # <- keyword.other + # ^ entity.name.type.class + + def init(id) + # <- keyword + # ^ function.method + + @id = id + # <- property + # ^ variable.parameter + + yield + # <- keyword + return + # <- keyword + next + # <- keyword + end + + private + # ^ keyword + + public + # ^ keyword + + protected + # ^ keyword +end +# <- keyword diff --git a/packages/language-ruby/spec/wasm-tree-sitter-spec.js b/packages/language-ruby/spec/wasm-tree-sitter-spec.js new file mode 100644 index 0000000000..5e83542bb8 --- /dev/null +++ b/packages/language-ruby/spec/wasm-tree-sitter-spec.js @@ -0,0 +1,72 @@ +const dedent = require('dedent'); +const path = require('path'); +const { Point } = require('atom'); + +describe('WASM Tree-sitter Ruby grammar', () => { + + beforeEach(async () => { + await atom.packages.activatePackage('language-ruby'); + atom.config.set('core.languageParser', 'wasm-tree-sitter'); + }); + + it('tokenizes symbols', async () => { + const editor = await openDocument('classes-node-ts.rb'); + console.log('I', editor.scopeDescriptorForBufferPosition([0, 0])) + + let allMatches = [], lastNonComment = 0 + editor.getBuffer().getLines().forEach((row, i) => { + const m = row.match(/#/) + if(m) { + const scope = editor.scopeDescriptorForBufferPosition([i, m.index]) + if(scope.scopes.find(s => s.match(/comment/))) { + allMatches.push({row: lastNonComment, text: row, col: m.index}) + return + } + } + lastNonComment = i + }) + expect(allMatches).toSatisfy((matches, reason) => { + reason("Tokenizer wasn't able to run") + return matches.length > 0 + }) + + allMatches.forEach(({text, row, col}) => { + const exactPos = text.match(/\^\s+(.*)/) + if(exactPos) { + console.log(`finds ${exactPos[1]} on row ${row+1} and column ${exactPos.index+1}`) + expect(editor.scopeDescriptorForBufferPosition([row, exactPos.index]).scopes).toSatisfy((scopes, reason) => { + const expected = exactPos[1] + reason(dedent` + Expected to find scope "${expected}" but found "${scopes}" + at class-node.ts.rb:${row+1}:${exactPos.index+1} + `) + return scopes.indexOf(expected) !== -1 + }) + } else { + const pos = text.match(/\<-\s+(.*)/) + // console.log('Finding Scope', pos[1], 'on', [row, col], 'and scopes:', editor.scopeDescriptorForBufferPosition([row, col])) + expect(editor.scopeDescriptorForBufferPosition([row, col]).scopes).toSatisfy((scopes, reason) => { + const expected = pos[1] + reason(dedent` + Expected to find scope "${expected}" but found "${scopes}" + at class-node.ts.rb:${row+1}:${col+1} + `) + return scopes.indexOf(expected) !== -1 + }) + } + }) + const mode = editor.languageMode + }); +}); + +async function openDocument(fileName) { + const fullPath = path.join(__dirname, 'fixtures', fileName) + const editor = await atom.workspace.open(fullPath) + await editor.languageMode.ready + // editor.languageMode.buildHighlightIterator().seek({row: 0, column: 0} ) + // await new Promise(resolve => { + // console.log("WAT") + // editor.languageMode.onDidTokenize(resolve) + // }) + return editor +} From a1d7f0df9167d1f96611f6da25b30db2bf362e90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Mon, 20 Feb 2023 16:05:59 -0300 Subject: [PATCH 03/11] First test for WASM-Tree-Sitter --- .../spec/wasm-tree-sitter-spec.js | 10 +-- src/wasm-tree-sitter-language-mode.js | 71 ++++++++++++------- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/packages/language-ruby/spec/wasm-tree-sitter-spec.js b/packages/language-ruby/spec/wasm-tree-sitter-spec.js index 5e83542bb8..9bbdf7b602 100644 --- a/packages/language-ruby/spec/wasm-tree-sitter-spec.js +++ b/packages/language-ruby/spec/wasm-tree-sitter-spec.js @@ -10,8 +10,7 @@ describe('WASM Tree-sitter Ruby grammar', () => { }); it('tokenizes symbols', async () => { - const editor = await openDocument('classes-node-ts.rb'); - console.log('I', editor.scopeDescriptorForBufferPosition([0, 0])) + const editor = await openDocument('classes-wasm-ts.rb'); let allMatches = [], lastNonComment = 0 editor.getBuffer().getLines().forEach((row, i) => { @@ -33,12 +32,15 @@ describe('WASM Tree-sitter Ruby grammar', () => { allMatches.forEach(({text, row, col}) => { const exactPos = text.match(/\^\s+(.*)/) if(exactPos) { - console.log(`finds ${exactPos[1]} on row ${row+1} and column ${exactPos.index+1}`) + console.log( + 'Scopes:', + editor.scopeDescriptorForBufferPosition([row, exactPos.index]).toString() + ) expect(editor.scopeDescriptorForBufferPosition([row, exactPos.index]).scopes).toSatisfy((scopes, reason) => { const expected = exactPos[1] reason(dedent` Expected to find scope "${expected}" but found "${scopes}" - at class-node.ts.rb:${row+1}:${exactPos.index+1} + at class-was-ts.rb:${row+1}:${exactPos.index+1} `) return scopes.indexOf(expected) !== -1 }) diff --git a/src/wasm-tree-sitter-language-mode.js b/src/wasm-tree-sitter-language-mode.js index c28444ad64..5b4bc85aa8 100644 --- a/src/wasm-tree-sitter-language-mode.js +++ b/src/wasm-tree-sitter-language-mode.js @@ -19,6 +19,8 @@ class WASMTreeSitterLanguageMode { this.injectionsMarkerLayer = buffer.addMarkerLayer(); this.newRanges = [] this.oldNodeTexts = new Set() + let resolve + this.ready = new Promise(r => resolve = r) initPromise.then(() => Parser.Language.load('/tmp/grammars/ruby/grammar.wasm') @@ -38,6 +40,7 @@ class WASMTreeSitterLanguageMode { const startRange = new Range([0, 0], [0, 0]) const range = buffer.getRange() buffer.emitDidChangeEvent({oldRange: startRange, newRange: range, oldText: ""}) + resolve(true) global.mode = this }) @@ -103,43 +106,45 @@ class WASMTreeSitterLanguageMode { } oldScopes = oldScopes || [] - syntax.forEach(capture => { - const node = capture.node - const names = capture.name.split('.') - - names.forEach(name => { - if(!this.scopeNames.get(name)) { - this.lastId += 2 - const newId = this.lastId; - this.scopeNames.set(name, newId) - this.scopeIds.set(newId, name) - } - }) + syntax.forEach(({node, name}) => { + // const node = capture.node + // const names = capture.name.split('.') + + // names.forEach(name => { + let id = this.scopeNames.get(name) + if(!id) { + this.lastId += 2 + id = this.lastId + const newId = this.lastId; + this.scopeNames.set(name, newId) + this.scopeIds.set(newId, name) + } + // }) - const ids = names.map(name => this.scopeNames.get(name)) + // const ds = names.map(name => this.scopeNames.get(name)) let old = this.boundaries.get(node.startPosition) if(old) { old.openNode = node if(old.openScopeIds.length === 0) { - old.openScopeIds = [...ids] + old.openScopeIds = [id] } } else { this.boundaries = this.boundaries.insert(node.startPosition, { closeScopeIds: [...oldScopes], - openScopeIds: [...ids], + openScopeIds: [id], openNode: node, position: node.startPosition }) - oldScopes = ids + oldScopes = [id] } old = this.boundaries.get(node.endPosition) if(old) { old.closeNode = node - if(old.closeScopeIds.length === 0) old.closeScopeIds = ids.reverse() + if(old.closeScopeIds.length === 0) old.closeScopeIds = [id] } else { this.boundaries = this.boundaries.insert(node.endPosition, { - closeScopeIds: ids.reverse(), + closeScopeIds: [id], openScopeIds: [], closeNode: node, position: node.endPosition @@ -284,7 +289,6 @@ class WASMTreeSitterLanguageMode { }, seek(start, endRow) { - // debugger const end = {row: endRow + 1, column: 0} iterator = updateBoundaries(start, end).ge(start) return [] @@ -293,19 +297,36 @@ class WASMTreeSitterLanguageMode { } classNameForScopeId(scopeId) { - // console.log('classNameForScopeId', scopeId, this.scopeIds) const scope = this.scopeIds.get(scopeId) - if(scope) return `syntax--${scope}` - // // console.log("classNameForScopeId", scopeId) - // if(scopeId === 259) { - // return "syntax--keyword" - // } + if(scope) return `syntax--${scope.replace(/\./g, ' syntax--')}` } scopeForId(scopeId) { return this.scopeIds[scopeId] } + scopeDescriptorForPosition(position) { + if(!this.tree) return new ScopeDescriptor({scopes: ['text']}) + const current = Point.fromObject(position) + let begin = Point.fromObject(position) + begin.column = 0 + const end = Point.fromObject([begin.row+1, 0]) + this._updateBoundaries(begin, end) + const it = this.boundaries.ge(begin) + if(!it.value) return new ScopeDescriptor({scopes: ['text']}) + + let scopeIds = [] + while(comparePoints(it.key, current) <= 0) { + const closing = new Set(it.value.closeScopeIds) + scopeIds = scopeIds.filter(s => !closing.has(s)) + scopeIds.push(...it.value.openScopeIds) + if(!it.hasNext) break + it.next() + } + + const scopes = scopeIds.map(id => this.classNameForScopeId(id).replace(/^syntax--/, '').replace(/\s?syntax--/g, '.')) + return new ScopeDescriptor({scopes}) + } } module.exports = WASMTreeSitterLanguageMode; From bd88f23d4fae72dd07f0d5de1f44d196b56dbbb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Mon, 20 Feb 2023 16:36:07 -0300 Subject: [PATCH 04/11] Typo --- packages/language-ruby/spec/wasm-tree-sitter-spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-ruby/spec/wasm-tree-sitter-spec.js b/packages/language-ruby/spec/wasm-tree-sitter-spec.js index 9bbdf7b602..e96d8532a8 100644 --- a/packages/language-ruby/spec/wasm-tree-sitter-spec.js +++ b/packages/language-ruby/spec/wasm-tree-sitter-spec.js @@ -40,7 +40,7 @@ describe('WASM Tree-sitter Ruby grammar', () => { const expected = exactPos[1] reason(dedent` Expected to find scope "${expected}" but found "${scopes}" - at class-was-ts.rb:${row+1}:${exactPos.index+1} + at class-wasm-ts.rb:${row+1}:${exactPos.index+1} `) return scopes.indexOf(expected) !== -1 }) @@ -51,7 +51,7 @@ describe('WASM Tree-sitter Ruby grammar', () => { const expected = pos[1] reason(dedent` Expected to find scope "${expected}" but found "${scopes}" - at class-node.ts.rb:${row+1}:${col+1} + at class-wasm-ts.rb:${row+1}:${col+1} `) return scopes.indexOf(expected) !== -1 }) From ef24d20b2f321bd3578eccd32965c1e1f8c2dd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:22:19 -0300 Subject: [PATCH 05/11] Adding WASMTreeSitter config for Ruby --- .../grammars/tree-sitter-2-ruby.cson | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 packages/language-ruby/grammars/tree-sitter-2-ruby.cson diff --git a/packages/language-ruby/grammars/tree-sitter-2-ruby.cson b/packages/language-ruby/grammars/tree-sitter-2-ruby.cson new file mode 100644 index 0000000000..f72972528b --- /dev/null +++ b/packages/language-ruby/grammars/tree-sitter-2-ruby.cson @@ -0,0 +1,98 @@ +name: 'Ruby' +scopeName: 'source.ruby' +type: 'tree-sitter-2' +parser: 'tree-sitter-ruby' + +injectionRegex: 'rb|ruby' +treeSitter: + grammar: 'ts/grammar.wasm' + syntaxQuery: 'ts/highlights.scm' + localsQuery: 'ts/locals.scm' + +firstLineRegex: [ + # shebang line + '^#!.*\\b(\w*ruby|rake)\\r?\\n' + + # vim modeline + 'vim\\b.*\\bset\\b.*\\b(filetype|ft|syntax)=ruby' +] + +fileTypes: [ + 'rb', + 'rake', + 'Podfile', + 'Brewfile', + 'Rakefile', + 'Gemfile' +] + +comments: + start: '# ' + +folds: [ + { + type: ['block', 'do_block'] + start: {type: 'block_parameters'} + end: {index: -1} + } + { + type: 'begin' + start: {index: 0} + end: {type: 'rescue'} + } + { + type: 'heredoc_body', + end: {type: 'heredoc_end'} + } + { + type: [ + 'hash' + 'array' + 'begin' + 'block' + 'do_block' + ] + start: {index: 0} + end: {index: -1} + } + { + type: 'argument_list' + start: {index: 0, type: '('} + end: {index: -1} + } + { + type: 'class' + start: {type: 'superclass'} + end: {index: -1} + } + { + type: 'class' + start: {index: 1} + end: {index: -1} + } + { + type: ['method', 'singleton_method'] + start: {type: 'method_parameters'} + end: {index: -1} + } + { + type: ['method', 'singleton_method'] + start: {index: 1} + end: {index: -1} + } + { + type: 'then', + start: {index: 0, type: '"then"'} + } + { + type: 'then' + } + { + type: 'case', + end: {index: -1} + } + { + type: 'else' + start: {index: 0} + } +] From e620291b9a4fc10d811cdb6a00465d1fec8dde71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:22:38 -0300 Subject: [PATCH 06/11] Adding a WASMTreeSitterGrammar --- src/wasm-tree-sitter-grammar.js | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/wasm-tree-sitter-grammar.js diff --git a/src/wasm-tree-sitter-grammar.js b/src/wasm-tree-sitter-grammar.js new file mode 100644 index 0000000000..9759ce0fde --- /dev/null +++ b/src/wasm-tree-sitter-grammar.js @@ -0,0 +1,43 @@ +const fs = require('fs'); +const path = require('path'); +const Parser = require('web-tree-sitter'); + +module.exports = class WASMTreeSitterGrammar { + constructor(registry, grammarPath, params) { + this.scopeName = params.scopeName + const dirName = path.dirname(grammarPath) + const qPath = path.join(dirName, params.treeSitter.syntaxQuery) + this.syntaxQuery = fs.readFileSync(qPath, 'utf-8') + if(params.treeSitter.localsQuery) { + const lPath = path.join(dirName, params.treeSitter.localsQuery) + this.localsQuery = fs.readFileSync(lPath, 'utf-8') + } + this.grammarPath = path.join(dirName, params.treeSitter.grammar) + this.contentRegex = buildRegex(params.contentRegex); + this.firstLineRegex = buildRegex(params.firstLineRegex); + this.fileTypes = params.fileTypes || []; + this.registry = registry + } + + // TODO: Why is this here? + activate() { + this.registration = this.registry.addGrammar(this); + } + + // TODO: Why is this here? + deactivate() { + this.registration?.dispose(); + } + + inspect() { + return `TreeSitterGrammar {scopeName: ${this.scopeName}}`; + } +} + +function buildRegex(value) { + // Allow multiple alternatives to be specified via an array, for + // readability of the grammar file + if (Array.isArray(value)) value = value.map(_ => `(${_})`).join('|'); + if (typeof value === 'string') return new RegExp(value); + return null; +} From 11c8e093ebe12efcdd3f2e18721179104696bded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:22:46 -0300 Subject: [PATCH 07/11] Wiring up new grammar kind --- src/grammar-registry.js | 92 ++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 24 deletions(-) diff --git a/src/grammar-registry.js b/src/grammar-registry.js index 4b633a5ac9..fabb37b064 100644 --- a/src/grammar-registry.js +++ b/src/grammar-registry.js @@ -7,6 +7,7 @@ const TextMateLanguageMode = require('./text-mate-language-mode'); const NodeTreeSitterLanguageMode = require('./tree-sitter-language-mode'); const WASMTreeSitterLanguageMode = require('./wasm-tree-sitter-language-mode'); const TreeSitterGrammar = require('./tree-sitter-grammar'); +const WASMTreeSitterGrammar = require('./wasm-tree-sitter-grammar'); const ScopeDescriptor = require('./scope-descriptor'); const Token = require('./token'); const fs = require('fs-plus'); @@ -30,6 +31,7 @@ module.exports = class GrammarRegistry { clear() { this.textmateRegistry.clear(); + this.wasmTreeSitterGrammarsById = {}; this.treeSitterGrammarsById = {}; if (this.subscriptions) this.subscriptions.dispose(); this.subscriptions = new CompositeDisposable(); @@ -197,8 +199,12 @@ module.exports = class GrammarRegistry { } languageModeForGrammarAndBuffer(grammar, buffer) { - if(grammar === 'tree-sitter') { - return new WASMTreeSitterLanguageMode(buffer, this.config); + if (grammar instanceof WASMTreeSitterGrammar) { + return new WASMTreeSitterLanguageMode( + buffer, + this.config, + grammar + ); } else if (grammar instanceof TreeSitterGrammar) { return new NodeTreeSitterLanguageMode({ grammar, @@ -227,18 +233,15 @@ module.exports = class GrammarRegistry { selectGrammarWithScore(filePath, fileContents) { let bestMatch = null; let highestScore = -Infinity; - if(this.config.get('core.languageParser') === 'wasm-tree-sitter') { - return {grammar: "tree-sitter", score: 10} - } else { - this.forEachGrammar(grammar => { - const score = this.getGrammarScore(grammar, filePath, fileContents); - if (score > highestScore || bestMatch == null) { - bestMatch = grammar; - highestScore = score; - } - }); - return { grammar: bestMatch, score: highestScore }; - } + this.forEachGrammar(grammar => { + const score = this.getGrammarScore(grammar, filePath, fileContents); + if (score > highestScore || bestMatch == null) { + bestMatch = grammar; + highestScore = score; + } + }); + return { grammar: bestMatch, score: highestScore }; + // } } // Extended: Returns a {Number} representing how well the grammar matches the @@ -255,11 +258,23 @@ module.exports = class GrammarRegistry { // If multiple grammars match by one of the above criteria, break ties. if (score > 0) { - const isTreeSitter = grammar instanceof TreeSitterGrammar; + const isNewTreeSitter = grammar instanceof WASMTreeSitterGrammar; + const isOldTreeSitter = grammar instanceof TreeSitterGrammar; + const isTreeSitter = isNewTreeSitter || isOldTreeSitter; + const config = () => + this.config.get('core.languageParser', { + scope: new ScopeDescriptor({ scopes: [grammar.scopeName] }) + }) // Prefer either TextMate or Tree-sitter grammars based on the user's settings. - if (isTreeSitter) { - if (this.shouldUseOldTreeSitterParser(grammar.scopeName)) { + if (isNewTreeSitter) { + if( config() === 'wasm-tree-sitter') { + score += 0.1; + } else { + score = -Infinity + } + } else if (isTreeSitter) { + if ( config() === 'node-tree-sitter' ) { score += 0.1; } else { return -Infinity; @@ -362,7 +377,16 @@ module.exports = class GrammarRegistry { grammarForId(languageId) { if (!languageId) return null; - if (this.shouldUseOldTreeSitterParser(languageId)) { + const config = this.config.get('core.languageParser', { + scope: new ScopeDescriptor({ scopes: [languageId] }) + }) + + if ( config === 'wasm-tree-sitter') { + return ( + this.wasmTreeSitterGrammarsById[languageId] || + this.textmateRegistry.grammarForScopeName(languageId) + ); + } else if ( config === 'node-tree-sitter' ) { return ( this.treeSitterGrammarsById[languageId] || this.textmateRegistry.grammarForScopeName(languageId) @@ -370,6 +394,7 @@ module.exports = class GrammarRegistry { } else { return ( this.textmateRegistry.grammarForScopeName(languageId) || + this.wasmTreeSitterGrammarsById[languageId] || this.treeSitterGrammarsById[languageId] ); } @@ -520,7 +545,19 @@ module.exports = class GrammarRegistry { } addGrammar(grammar) { - if (grammar instanceof TreeSitterGrammar) { + if (grammar instanceof WASMTreeSitterGrammar) { + const existingParams = + this.wasmTreeSitterGrammarsById[grammar.scopeName] || {}; + if (grammar.scopeName) + this.wasmTreeSitterGrammarsById[grammar.scopeName] = grammar; + if (existingParams.injectionPoints) { + for (const injectionPoint of existingParams.injectionPoints) { + grammar.addInjectionPoint(injectionPoint); + } + } + this.grammarAddedOrUpdated(grammar); + return new Disposable(() => this.removeGrammar(grammar)); + } else if (grammar instanceof TreeSitterGrammar) { const existingParams = this.treeSitterGrammarsById[grammar.scopeName] || {}; if (grammar.scopeName) @@ -538,7 +575,9 @@ module.exports = class GrammarRegistry { } removeGrammar(grammar) { - if (grammar instanceof TreeSitterGrammar) { + if (grammar instanceof WASMTreeSitterGrammar) { + delete this.wasmTreeSitterGrammarsById[grammar.scopeName]; + } else if (grammar instanceof TreeSitterGrammar) { delete this.treeSitterGrammarsById[grammar.scopeName]; } else { return this.textmateRegistry.removeGrammar(grammar); @@ -604,10 +643,12 @@ module.exports = class GrammarRegistry { grammarPath, CSON.readFileSync(grammarPath) || {} ); - } +} createGrammar(grammarPath, params) { - if (params.type === 'tree-sitter') { + if (params.type === 'tree-sitter-2') { + return new WASMTreeSitterGrammar(this, grammarPath, params) + } else if (params.type === 'tree-sitter') { return new TreeSitterGrammar(this, grammarPath, params); } else { if ( @@ -633,16 +674,20 @@ module.exports = class GrammarRegistry { let tmGrammars = this.textmateRegistry.getGrammars(); if (!(params && params.includeTreeSitter)) return tmGrammars; + const tsGrammars2 = Object.values(this.wasmTreeSitterGrammarsById).filter( + g => g.scopeName + ); const tsGrammars = Object.values(this.treeSitterGrammarsById).filter( g => g.scopeName ); - return tmGrammars.concat(tsGrammars); // NullGrammar is expected to be first + return tmGrammars.concat(tsGrammars).concat(tsGrammars2); // NullGrammar is expected to be first } scopeForId(id) { return this.textmateRegistry.scopeForId(id); } + // TODO: why is this being used? Can we remove it soon? treeSitterGrammarForLanguageString(languageString) { let longestMatchLength = 0; let grammarWithLongestMatch = null; @@ -663,7 +708,6 @@ module.exports = class GrammarRegistry { } shouldUseOldTreeSitterParser(languageId) { - return false return this.config.get('core.languageParser', { scope: new ScopeDescriptor({ scopes: [languageId] }) }) === 'node-tree-sitter'; From 843700e17eef6431719b8ad5656f396edb9ea4d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:23:02 -0300 Subject: [PATCH 08/11] Re-wiring things so language-mode considers new grammar --- .../language-ruby/spec/wasm-tree-sitter-spec.js | 4 ---- src/wasm-tree-sitter-language-mode.js | 14 ++++++-------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/language-ruby/spec/wasm-tree-sitter-spec.js b/packages/language-ruby/spec/wasm-tree-sitter-spec.js index e96d8532a8..ed6075d390 100644 --- a/packages/language-ruby/spec/wasm-tree-sitter-spec.js +++ b/packages/language-ruby/spec/wasm-tree-sitter-spec.js @@ -32,10 +32,6 @@ describe('WASM Tree-sitter Ruby grammar', () => { allMatches.forEach(({text, row, col}) => { const exactPos = text.match(/\^\s+(.*)/) if(exactPos) { - console.log( - 'Scopes:', - editor.scopeDescriptorForBufferPosition([row, exactPos.index]).toString() - ) expect(editor.scopeDescriptorForBufferPosition([row, exactPos.index]).scopes).toSatisfy((scopes, reason) => { const expected = exactPos[1] reason(dedent` diff --git a/src/wasm-tree-sitter-language-mode.js b/src/wasm-tree-sitter-language-mode.js index 5b4bc85aa8..f16c583cb2 100644 --- a/src/wasm-tree-sitter-language-mode.js +++ b/src/wasm-tree-sitter-language-mode.js @@ -9,7 +9,7 @@ createTree = require("./rb-tree") const VAR_ID = 257 class WASMTreeSitterLanguageMode { - constructor( buffer, config) { + constructor(buffer, config, grammar) { this.emitter = new Emitter(); this.lastId = 259 this.scopeNames = new Map([["variable", VAR_ID]]) @@ -23,14 +23,12 @@ class WASMTreeSitterLanguageMode { this.ready = new Promise(r => resolve = r) initPromise.then(() => - Parser.Language.load('/tmp/grammars/ruby/grammar.wasm') + Parser.Language.load(grammar.grammarPath) ).then(lang => { - const syntaxQuery = fs.readFileSync('/tmp/grammars/ruby/queries/highlights.scm', 'utf-8') - if(fs.existsSync('/tmp/grammars/ruby/queries/locals.scm')) { - const localsQuery = fs.readFileSync('/tmp/grammars/ruby/queries/locals.scm', 'utf-8') - this.localsQuery = lang.query(localsQuery) + this.syntaxQuery = lang.query(grammar.syntaxQuery) + if(grammar.localsQuery) { + this.localsQuery = lang.query(grammar.localsQuery) } - this.syntaxQuery = lang.query(syntaxQuery) this.parser = new Parser() this.parser.setLanguage(lang) @@ -45,7 +43,7 @@ class WASMTreeSitterLanguageMode { }) this.rootScopeDescriptor = new ScopeDescriptor({ - scopes: ['ruby'] + scopes: [grammar.scopeName] }); } From a3701ba2c406029c7cca14660f08190aaaabeaa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:23:16 -0300 Subject: [PATCH 09/11] Fixing test (for now) --- packages/language-ruby/spec/fixtures/classes-wasm-ts.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb b/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb index 9b065d1488..f5aa258cfc 100644 --- a/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb +++ b/packages/language-ruby/spec/fixtures/classes-wasm-ts.rb @@ -2,8 +2,8 @@ # ^ function.method.builtin class Car < Vehicle - # <- keyword.other - # ^ entity.name.type.class + # <- keyword + # ^ constructor def init(id) # <- keyword From f8692b2dc3c9bf7e201efc4dcd7005367bceea99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 01:23:34 -0300 Subject: [PATCH 10/11] Adding tree-sitter files for Ruby/WASM --- .../language-ruby/grammars/ts/grammar.wasm | Bin 0 -> 997072 bytes .../language-ruby/grammars/ts/highlights.scm | 146 ++++++++++++++++++ packages/language-ruby/grammars/ts/locals.scm | 27 ++++ packages/language-ruby/grammars/ts/tags.scm | 64 ++++++++ 4 files changed, 237 insertions(+) create mode 100755 packages/language-ruby/grammars/ts/grammar.wasm create mode 100644 packages/language-ruby/grammars/ts/highlights.scm create mode 100644 packages/language-ruby/grammars/ts/locals.scm create mode 100644 packages/language-ruby/grammars/ts/tags.scm diff --git a/packages/language-ruby/grammars/ts/grammar.wasm b/packages/language-ruby/grammars/ts/grammar.wasm new file mode 100755 index 0000000000000000000000000000000000000000..8e4e91632f3a6e5dd9d81f9c7a7325fbeb44df13 GIT binary patch literal 997072 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

q~UZ{}aq#(&Qhe@59=k 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 literal 0 HcmV?d00001 diff --git a/packages/language-ruby/grammars/ts/highlights.scm b/packages/language-ruby/grammars/ts/highlights.scm new file mode 100644 index 0000000000..7f296f3bd8 --- /dev/null +++ b/packages/language-ruby/grammars/ts/highlights.scm @@ -0,0 +1,146 @@ +; Keywords + +[ + "alias" + "and" + "begin" + "break" + "case" + "class" + "def" + "do" + "else" + "elsif" + "end" + "ensure" + "for" + "if" + "in" + "module" + "next" + "or" + "rescue" + "retry" + "return" + "then" + "unless" + "until" + "when" + "while" + "yield" +] @keyword + +((identifier) @keyword + (#match? @keyword "^(private|protected|public)$")) + +; Function calls + +((identifier) @function.method.builtin + (#eq? @function.method.builtin "require")) + +"defined?" @function.method.builtin + +(call + method: [(identifier) (constant)] @function.method) + +; Function definitions + +(alias (identifier) @function.method) +(setter (identifier) @function.method) +(method name: [(identifier) (constant)] @function.method) +(singleton_method name: [(identifier) (constant)] @function.method) + +; Identifiers + +[ + (class_variable) + (instance_variable) +] @property + +((identifier) @constant.builtin + (#match? @constant.builtin "^__(FILE|LINE|ENCODING)__$")) + +((constant) @constant + (#match? @constant "^[A-Z\\d_]+$")) + +(constant) @constructor + +(self) @variable.builtin +(super) @variable.builtin + +(block_parameter (identifier) @variable.parameter) +(block_parameters (identifier) @variable.parameter) +(destructured_parameter (identifier) @variable.parameter) +(hash_splat_parameter (identifier) @variable.parameter) +(lambda_parameters (identifier) @variable.parameter) +(method_parameters (identifier) @variable.parameter) +(splat_parameter (identifier) @variable.parameter) + +(keyword_parameter name: (identifier) @variable.parameter) +(optional_parameter name: (identifier) @variable.parameter) + +((identifier) @function.method + (#is-not? local)) +(identifier) @variable + +; Literals + +[ + (string) + (bare_string) + (subshell) + (heredoc_body) + (heredoc_beginning) +] @string + +[ + (simple_symbol) + (delimited_symbol) + (hash_key_symbol) + (bare_symbol) +] @string.special.symbol + +(regex) @string.special.regex +(escape_sequence) @escape + +[ + (integer) + (float) +] @number + +[ + (nil) + (true) + (false) +]@constant.builtin + +(interpolation + "#{" @punctuation.special + "}" @punctuation.special) @embedded + +(comment) @comment + +; Operators + +[ +"=" +"=>" +"->" +] @operator + +[ + "," + ";" + "." +] @punctuation.delimiter + +[ + "(" + ")" + "[" + "]" + "{" + "}" + "%w(" + "%i(" +] @punctuation.bracket diff --git a/packages/language-ruby/grammars/ts/locals.scm b/packages/language-ruby/grammars/ts/locals.scm new file mode 100644 index 0000000000..393caafd92 --- /dev/null +++ b/packages/language-ruby/grammars/ts/locals.scm @@ -0,0 +1,27 @@ +((method) @local.scope + (#set! local.scope-inherits false)) + +[ + (lambda) + (block) + (do_block) +] @local.scope + +(block_parameter (identifier) @local.definition) +(block_parameters (identifier) @local.definition) +(destructured_parameter (identifier) @local.definition) +(hash_splat_parameter (identifier) @local.definition) +(lambda_parameters (identifier) @local.definition) +(method_parameters (identifier) @local.definition) +(splat_parameter (identifier) @local.definition) + +(keyword_parameter name: (identifier) @local.definition) +(optional_parameter name: (identifier) @local.definition) + +(identifier) @local.reference + +(assignment left: (identifier) @local.definition) +(operator_assignment left: (identifier) @local.definition) +(left_assignment_list (identifier) @local.definition) +(rest_assignment (identifier) @local.definition) +(destructured_left_assignment (identifier) @local.definition) diff --git a/packages/language-ruby/grammars/ts/tags.scm b/packages/language-ruby/grammars/ts/tags.scm new file mode 100644 index 0000000000..47ba1eb584 --- /dev/null +++ b/packages/language-ruby/grammars/ts/tags.scm @@ -0,0 +1,64 @@ +; Method definitions + +( + (comment)* @doc + . + [ + (method + name: (_) @name) @definition.method + (singleton_method + name: (_) @name) @definition.method + ] + (#strip! @doc "^#\\s*") + (#select-adjacent! @doc @definition.method) +) + +(alias + name: (_) @name) @definition.method + +(setter + (identifier) @ignore) + +; Class definitions + +( + (comment)* @doc + . + [ + (class + name: [ + (constant) @name + (scope_resolution + name: (_) @name) + ]) @definition.class + (singleton_class + value: [ + (constant) @name + (scope_resolution + name: (_) @name) + ]) @definition.class + ] + (#strip! @doc "^#\\s*") + (#select-adjacent! @doc @definition.class) +) + +; Module definitions + +( + (module + name: [ + (constant) @name + (scope_resolution + name: (_) @name) + ]) @definition.module +) + +; Calls + +(call method: (identifier) @name) @reference.call + +( + [(identifier) (constant)] @name @reference.call + (#is-not? local) + (#not-match? @name "^(lambda|load|require|require_relative|__FILE__|__LINE__)$") +) From 00185e8672f92a59519993105dae96f30d38c707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 22 Feb 2023 12:01:56 -0300 Subject: [PATCH 11/11] Missing setup node? --- .github/workflows/package-tests-linux.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/package-tests-linux.yml b/.github/workflows/package-tests-linux.yml index 933ab177b9..9691674859 100644 --- a/.github/workflows/package-tests-linux.yml +++ b/.github/workflows/package-tests-linux.yml @@ -145,6 +145,11 @@ jobs: - name: Checkout the latest code uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2-beta + with: + node-version: 16 + - name: Install Dependencies run: yarn install || yarn install