From d1283fa69f019d7e1feaf376d76866f624e4ad27 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 21 Aug 2018 13:02:27 -0700 Subject: [PATCH] Fix TreeSitterLanguageMode.isRowCommented --- spec/text-editor-registry-spec.js | 40 +++++++++++++++++++++---------- src/tree-sitter-language-mode.js | 14 +++++++++-- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/spec/text-editor-registry-spec.js b/spec/text-editor-registry-spec.js index 4f4d1ee93..7fcbb757a 100644 --- a/spec/text-editor-registry-spec.js +++ b/spec/text-editor-registry-spec.js @@ -1,6 +1,7 @@ const TextEditorRegistry = require('../src/text-editor-registry') const TextEditor = require('../src/text-editor') const TextBuffer = require('text-buffer') +const {Point, Range} = TextBuffer const {it, fit, ffit, fffit} = require('./async-spec-helpers') const dedent = require('dedent') @@ -256,20 +257,29 @@ describe('TextEditorRegistry', function () { }) describe('when the "tabType" config setting is "auto"', function () { + function nextHighlightUpdatePromise (languageMode) { + return new Promise(resolve => { + const subscription = languageMode.onDidChangeHighlighting(() => { + subscription.dispose() + resolve() + }) + }) + } + it('enables or disables soft tabs based on the editor\'s content', async function () { await atom.packages.activatePackage('language-javascript') atom.grammars.assignLanguageMode(editor, 'source.js') atom.config.set('editor.tabType', 'auto') - - registry.maintainConfig(editor) await initialPackageActivation + const languageMode = editor.getBuffer().getLanguageMode() editor.setText(dedent` { hello; } `) - editor.getBuffer().getLanguageMode().retokenizeLines() + await nextHighlightUpdatePromise(languageMode) + let disposable = registry.maintainConfig(editor) expect(editor.getSoftTabs()).toBe(true) editor.setText(dedent` @@ -277,18 +287,19 @@ describe('TextEditorRegistry', function () { hello; } `) - editor.getBuffer().getLanguageMode().retokenizeLines() + await nextHighlightUpdatePromise(languageMode) + disposable.dispose() + disposable = registry.maintainConfig(editor) expect(editor.getSoftTabs()).toBe(false) - editor.setText(dedent` + editor.setTextInBufferRange(new Range(Point.ZERO, Point.ZERO), dedent` /* * Comment with a leading space. */ - { - ${'\t'}hello; - } - ` + editor.getText()) - editor.getBuffer().getLanguageMode().retokenizeLines() + ` + '\n') + await nextHighlightUpdatePromise(languageMode) + disposable.dispose() + disposable = registry.maintainConfig(editor) expect(editor.getSoftTabs()).toBe(false) editor.setText(dedent` @@ -300,8 +311,9 @@ describe('TextEditorRegistry', function () { hello; } `) - - editor.getBuffer().getLanguageMode().retokenizeLines() + await nextHighlightUpdatePromise(languageMode) + disposable.dispose() + disposable = registry.maintainConfig(editor) expect(editor.getSoftTabs()).toBe(false) editor.setText(dedent` @@ -313,7 +325,9 @@ describe('TextEditorRegistry', function () { hello; } `) - editor.getBuffer().getLanguageMode().retokenizeLines() + await nextHighlightUpdatePromise(languageMode) + disposable.dispose() + disposable = registry.maintainConfig(editor) expect(editor.getSoftTabs()).toBe(true) }) }) diff --git a/src/tree-sitter-language-mode.js b/src/tree-sitter-language-mode.js index c046cf776..3cebee88e 100644 --- a/src/tree-sitter-language-mode.js +++ b/src/tree-sitter-language-mode.js @@ -134,7 +134,15 @@ class TreeSitterLanguageMode { return this.grammar.commentStrings } - isRowCommented () { + isRowCommented (row) { + const firstNonWhitespaceRange = this.buffer.findInRangeSync( + /\S/, + new Range(new Point(row, 0), new Point(row, Infinity)) + ) + if (firstNonWhitespaceRange) { + const firstNode = this.getSyntaxNodeContainingRange(firstNonWhitespaceRange) + if (firstNode) return firstNode.type.includes('comment') + } return false } @@ -265,7 +273,9 @@ class TreeSitterLanguageMode { } _forEachTreeWithRange (range, callback) { - callback(this.rootLanguageLayer.tree, this.rootLanguageLayer.grammar) + if (this.rootLanguageLayer.tree) { + callback(this.rootLanguageLayer.tree, this.rootLanguageLayer.grammar) + } const injectionMarkers = this.injectionsMarkerLayer.findMarkers({ intersectsRange: range