mirror of
https://github.com/atom/atom.git
synced 2026-01-24 06:18:03 -05:00
Rename Highlighter -> LanguageMode
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
FoldSuggester = require 'fold-suggester'
|
||||
Buffer = require 'buffer'
|
||||
Highlighter = require 'highlighter'
|
||||
LanguageMode = require 'language-mode'
|
||||
|
||||
describe "FoldSuggester", ->
|
||||
foldSuggester = null
|
||||
@@ -8,8 +8,8 @@ describe "FoldSuggester", ->
|
||||
describe "javascript", ->
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve 'fixtures/sample.js')
|
||||
highlighter = new Highlighter(buffer)
|
||||
foldSuggester = new FoldSuggester(highlighter)
|
||||
languageMode = new LanguageMode(buffer)
|
||||
foldSuggester = new FoldSuggester(languageMode)
|
||||
|
||||
describe ".isBufferRowFoldable(bufferRow)", ->
|
||||
it "returns true only when the buffer row starts a foldable region", ->
|
||||
@@ -28,8 +28,8 @@ describe "FoldSuggester", ->
|
||||
describe "coffeescript", ->
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve 'fixtures/coffee.coffee')
|
||||
highlighter = new Highlighter(buffer)
|
||||
foldSuggester = new FoldSuggester(highlighter)
|
||||
languageMode = new LanguageMode(buffer)
|
||||
foldSuggester = new FoldSuggester(languageMode)
|
||||
|
||||
describe ".isBufferRowFoldable(bufferRow)", ->
|
||||
it "returns true only when the buffer row starts a foldable region", ->
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
Highlighter = require 'highlighter'
|
||||
Buffer = require 'buffer'
|
||||
Range = require 'range'
|
||||
|
||||
describe "Highlighter", ->
|
||||
[highlighter, buffer] = []
|
||||
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve('fixtures/sample.js'))
|
||||
highlighter = new Highlighter(buffer)
|
||||
|
||||
describe "constructor", ->
|
||||
it "tokenizes all the lines in the buffer", ->
|
||||
expect(highlighter.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
expect(highlighter.lineForScreenRow(11).tokens[1]).toEqual(type: 'keyword', value: 'return')
|
||||
|
||||
describe "when the buffer changes", ->
|
||||
changeHandler = null
|
||||
|
||||
beforeEach ->
|
||||
changeHandler = jasmine.createSpy('changeHandler')
|
||||
highlighter.on "change", changeHandler
|
||||
|
||||
describe "when lines are updated, but none are added or removed", ->
|
||||
it "updates tokens for each of the changed lines", ->
|
||||
range = new Range([0, 0], [2, 0])
|
||||
buffer.change(range, "foo()\nbar()\n")
|
||||
|
||||
expect(highlighter.lineForScreenRow(0).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(highlighter.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'bar')
|
||||
|
||||
# line 2 is unchanged
|
||||
expect(highlighter.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'if')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([0, 0], [2,0])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.insert([2, 0], '/*')
|
||||
expect(highlighter.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(5).tokens[0].type).toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(5).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [5, buffer.lineForRow(5).length])
|
||||
|
||||
it "resumes highlighting with the state of the previous line", ->
|
||||
buffer.insert([0, 0], '/*')
|
||||
buffer.insert([5, 0], '*/')
|
||||
|
||||
buffer.insert([1, 0], 'var ')
|
||||
expect(highlighter.lineForScreenRow(1).tokens[0].type).toBe 'comment'
|
||||
|
||||
describe "when lines are both updated and removed", ->
|
||||
it "updates tokens to reflect the removed lines", ->
|
||||
range = new Range([1, 0], [3, 0])
|
||||
buffer.change(range, "foo()")
|
||||
|
||||
# previous line 0 remains
|
||||
expect(highlighter.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
|
||||
# previous line 3 should be combined with input to form line 1
|
||||
expect(highlighter.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(highlighter.lineForScreenRow(1).tokens[6]).toEqual(type: 'identifier', value: 'pivot')
|
||||
|
||||
# lines below deleted regions should be shifted upward
|
||||
expect(highlighter.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'while')
|
||||
expect(highlighter.lineForScreenRow(3).tokens[1]).toEqual(type: 'identifier', value: 'current')
|
||||
expect(highlighter.lineForScreenRow(4).tokens[3]).toEqual(type: 'keyword.operator', value: '<')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([1, 0], [1, 5])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.change(new Range([2, 0], [3, 0]), '/*')
|
||||
expect(highlighter.lineForScreenRow(2).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(4).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [4, buffer.lineForRow(4).length])
|
||||
|
||||
describe "when lines are both updated and inserted", ->
|
||||
it "updates tokens to reflect the inserted lines", ->
|
||||
range = new Range([1, 0], [2, 0])
|
||||
buffer.change(range, "foo()\nbar()\nbaz()\nquux()")
|
||||
|
||||
# previous line 0 remains
|
||||
expect(highlighter.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
|
||||
# 3 new lines inserted
|
||||
expect(highlighter.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(highlighter.lineForScreenRow(2).tokens[0]).toEqual(type: 'identifier', value: 'bar')
|
||||
expect(highlighter.lineForScreenRow(3).tokens[0]).toEqual(type: 'identifier', value: 'baz')
|
||||
|
||||
# previous line 2 is joined with quux() on line 4
|
||||
expect(highlighter.lineForScreenRow(4).tokens[0]).toEqual(type: 'identifier', value: 'quux')
|
||||
expect(highlighter.lineForScreenRow(4).tokens[4]).toEqual(type: 'keyword', value: 'if')
|
||||
|
||||
# previous line 3 is pushed down to become line 5
|
||||
expect(highlighter.lineForScreenRow(5).tokens[3]).toEqual(type: 'identifier', value: 'pivot')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([1, 0], [4, 6])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.insert([2, 0], '/*\nabcde\nabcder')
|
||||
expect(highlighter.lineForScreenRow(2).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(5).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(6).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(7).tokens[0].type).toBe 'comment'
|
||||
expect(highlighter.lineForScreenRow(8).tokens[0].type).not.toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(7).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [7, buffer.lineForRow(7).length])
|
||||
|
||||
describe "when the buffer contains tab characters", ->
|
||||
tabText = null
|
||||
|
||||
beforeEach ->
|
||||
tabText = ' '
|
||||
buffer = new Buffer(require.resolve('fixtures/sample-with-tabs.coffee'))
|
||||
highlighter = new Highlighter(buffer, tabText)
|
||||
|
||||
it "always renders each tab as its own atomic token containing tabText", ->
|
||||
screenLine0 = highlighter.lineForScreenRow(0)
|
||||
expect(screenLine0.text).toBe "# Econ 101#{tabText}"
|
||||
{ tokens } = screenLine0
|
||||
expect(tokens.length).toBe 2
|
||||
expect(tokens[0].value).toBe "# Econ 101"
|
||||
expect(tokens[1].value).toBe tabText
|
||||
expect(tokens[1].type).toBe tokens[0].type
|
||||
expect(tokens[1].isAtomic).toBeTruthy()
|
||||
|
||||
expect(highlighter.lineForScreenRow(2).text).toBe "#{tabText} buy()#{tabText}while supply > demand"
|
||||
|
||||
describe ".findClosingBracket(startBracketPosition)", ->
|
||||
describe "when called with a bracket type of '{'", ->
|
||||
it "returns the position of the matching bracket, skipping any nested brackets", ->
|
||||
expect(highlighter.findClosingBracket([1, 29])).toEqual [9, 2]
|
||||
|
||||
165
spec/app/language-mode-spec.coffee
Normal file
165
spec/app/language-mode-spec.coffee
Normal file
@@ -0,0 +1,165 @@
|
||||
LanguageMode = require 'language-mode'
|
||||
Buffer = require 'buffer'
|
||||
Range = require 'range'
|
||||
|
||||
describe "LanguageMode", ->
|
||||
[languageMode, buffer] = []
|
||||
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve('fixtures/sample.js'))
|
||||
languageMode = new LanguageMode(buffer)
|
||||
|
||||
describe ".findClosingBracket(startBracketPosition)", ->
|
||||
describe "when called with a bracket type of '{'", ->
|
||||
it "returns the position of the matching bracket, skipping any nested brackets", ->
|
||||
expect(languageMode.findClosingBracket([1, 29])).toEqual [9, 2]
|
||||
|
||||
describe "tokenization", ->
|
||||
it "tokenizes all the lines in the buffer on construction", ->
|
||||
expect(languageMode.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
expect(languageMode.lineForScreenRow(11).tokens[1]).toEqual(type: 'keyword', value: 'return')
|
||||
|
||||
describe "when the buffer changes", ->
|
||||
changeHandler = null
|
||||
|
||||
beforeEach ->
|
||||
changeHandler = jasmine.createSpy('changeHandler')
|
||||
languageMode.on "change", changeHandler
|
||||
|
||||
describe "when lines are updated, but none are added or removed", ->
|
||||
it "updates tokens for each of the changed lines", ->
|
||||
range = new Range([0, 0], [2, 0])
|
||||
buffer.change(range, "foo()\nbar()\n")
|
||||
|
||||
expect(languageMode.lineForScreenRow(0).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(languageMode.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'bar')
|
||||
|
||||
# line 2 is unchanged
|
||||
expect(languageMode.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'if')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([0, 0], [2,0])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.insert([2, 0], '/*')
|
||||
expect(languageMode.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(5).tokens[0].type).toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(5).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [5, buffer.lineForRow(5).length])
|
||||
|
||||
it "resumes highlighting with the state of the previous line", ->
|
||||
buffer.insert([0, 0], '/*')
|
||||
buffer.insert([5, 0], '*/')
|
||||
|
||||
buffer.insert([1, 0], 'var ')
|
||||
expect(languageMode.lineForScreenRow(1).tokens[0].type).toBe 'comment'
|
||||
|
||||
describe "when lines are both updated and removed", ->
|
||||
it "updates tokens to reflect the removed lines", ->
|
||||
range = new Range([1, 0], [3, 0])
|
||||
buffer.change(range, "foo()")
|
||||
|
||||
# previous line 0 remains
|
||||
expect(languageMode.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
|
||||
# previous line 3 should be combined with input to form line 1
|
||||
expect(languageMode.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(languageMode.lineForScreenRow(1).tokens[6]).toEqual(type: 'identifier', value: 'pivot')
|
||||
|
||||
# lines below deleted regions should be shifted upward
|
||||
expect(languageMode.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'while')
|
||||
expect(languageMode.lineForScreenRow(3).tokens[1]).toEqual(type: 'identifier', value: 'current')
|
||||
expect(languageMode.lineForScreenRow(4).tokens[3]).toEqual(type: 'keyword.operator', value: '<')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([1, 0], [1, 5])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.change(new Range([2, 0], [3, 0]), '/*')
|
||||
expect(languageMode.lineForScreenRow(2).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(4).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [4, buffer.lineForRow(4).length])
|
||||
|
||||
describe "when lines are both updated and inserted", ->
|
||||
it "updates tokens to reflect the inserted lines", ->
|
||||
range = new Range([1, 0], [2, 0])
|
||||
buffer.change(range, "foo()\nbar()\nbaz()\nquux()")
|
||||
|
||||
# previous line 0 remains
|
||||
expect(languageMode.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
|
||||
|
||||
# 3 new lines inserted
|
||||
expect(languageMode.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
|
||||
expect(languageMode.lineForScreenRow(2).tokens[0]).toEqual(type: 'identifier', value: 'bar')
|
||||
expect(languageMode.lineForScreenRow(3).tokens[0]).toEqual(type: 'identifier', value: 'baz')
|
||||
|
||||
# previous line 2 is joined with quux() on line 4
|
||||
expect(languageMode.lineForScreenRow(4).tokens[0]).toEqual(type: 'identifier', value: 'quux')
|
||||
expect(languageMode.lineForScreenRow(4).tokens[4]).toEqual(type: 'keyword', value: 'if')
|
||||
|
||||
# previous line 3 is pushed down to become line 5
|
||||
expect(languageMode.lineForScreenRow(5).tokens[3]).toEqual(type: 'identifier', value: 'pivot')
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual range
|
||||
expect(event.newRange).toEqual new Range([1, 0], [4, 6])
|
||||
|
||||
it "updates tokens for lines beyond the changed lines if needed", ->
|
||||
buffer.insert([5, 30], '/* */')
|
||||
changeHandler.reset()
|
||||
|
||||
buffer.insert([2, 0], '/*\nabcde\nabcder')
|
||||
expect(languageMode.lineForScreenRow(2).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(3).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(4).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(5).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(6).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(7).tokens[0].type).toBe 'comment'
|
||||
expect(languageMode.lineForScreenRow(8).tokens[0].type).not.toBe 'comment'
|
||||
|
||||
expect(changeHandler).toHaveBeenCalled()
|
||||
[event] = changeHandler.argsForCall[0]
|
||||
expect(event.oldRange).toEqual new Range([2, 0], [5, buffer.lineForRow(7).length])
|
||||
expect(event.newRange).toEqual new Range([2, 0], [7, buffer.lineForRow(7).length])
|
||||
|
||||
describe "when the buffer contains tab characters", ->
|
||||
tabText = null
|
||||
|
||||
beforeEach ->
|
||||
tabText = ' '
|
||||
buffer = new Buffer(require.resolve('fixtures/sample-with-tabs.coffee'))
|
||||
languageMode = new LanguageMode(buffer, tabText)
|
||||
|
||||
it "always renders each tab as its own atomic token containing tabText", ->
|
||||
screenLine0 = languageMode.lineForScreenRow(0)
|
||||
expect(screenLine0.text).toBe "# Econ 101#{tabText}"
|
||||
{ tokens } = screenLine0
|
||||
expect(tokens.length).toBe 2
|
||||
expect(tokens[0].value).toBe "# Econ 101"
|
||||
expect(tokens[1].value).toBe tabText
|
||||
expect(tokens[1].type).toBe tokens[0].type
|
||||
expect(tokens[1].isAtomic).toBeTruthy()
|
||||
|
||||
expect(languageMode.lineForScreenRow(2).text).toBe "#{tabText} buy()#{tabText}while supply > demand"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Buffer = require 'buffer'
|
||||
Highlighter = require 'highlighter'
|
||||
LanguageMode = require 'language-mode'
|
||||
LineCommenter = require 'line-commenter'
|
||||
|
||||
describe "LineCommenter", ->
|
||||
@@ -7,8 +7,8 @@ describe "LineCommenter", ->
|
||||
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve('fixtures/sample.js'))
|
||||
highlighter = new Highlighter(buffer)
|
||||
lineCommenter = new LineCommenter(highlighter)
|
||||
languageMode = new LanguageMode(buffer)
|
||||
lineCommenter = new LineCommenter(languageMode)
|
||||
|
||||
describe "toggleLineCommentsInRange", ->
|
||||
it "comments/uncomments lines in the given range", ->
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
LineMap = require 'line-map'
|
||||
ScreenLine = require 'screen-line'
|
||||
Buffer = require 'buffer'
|
||||
Highlighter = require 'highlighter'
|
||||
LanguageMode = require 'language-mode'
|
||||
Point = require 'point'
|
||||
|
||||
describe "LineMap", ->
|
||||
[highlighter, map] = []
|
||||
[languageMode, map] = []
|
||||
[line0, line1, line2, line3, line4] = []
|
||||
|
||||
beforeEach ->
|
||||
buffer = new Buffer(require.resolve 'fixtures/sample.js')
|
||||
highlighter = new Highlighter(buffer)
|
||||
languageMode = new LanguageMode(buffer)
|
||||
map = new LineMap
|
||||
[line0, line1, line2, line3, line4] = highlighter.screenLinesForRows(0, 4)
|
||||
[line0, line1, line2, line3, line4] = languageMode.screenLinesForRows(0, 4)
|
||||
|
||||
describe ".insertAtBufferRow(row, lineFragments)", ->
|
||||
it "inserts the given line fragments before the specified buffer row", ->
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
_ = require 'underscore'
|
||||
Buffer = require 'buffer'
|
||||
Highlighter = require 'highlighter'
|
||||
LanguageMode = require 'language-mode'
|
||||
|
||||
describe "ScreenLine", ->
|
||||
[buffer, tabText, screenLine, highlighter] = []
|
||||
[buffer, tabText, screenLine, languageMode] = []
|
||||
|
||||
beforeEach ->
|
||||
tabText = ' '
|
||||
buffer = new Buffer(require.resolve 'fixtures/sample.js')
|
||||
highlighter = new Highlighter(buffer, tabText)
|
||||
screenLine = highlighter.lineForScreenRow(3)
|
||||
languageMode = new LanguageMode(buffer, tabText)
|
||||
screenLine = languageMode.lineForScreenRow(3)
|
||||
|
||||
describe ".splitAt(column)", ->
|
||||
it "breaks the line fragment into two fragments", ->
|
||||
@@ -70,7 +70,7 @@ describe "ScreenLine", ->
|
||||
[left, right] = screenLine.splitAt(14)
|
||||
expect(left.concat(right)).toEqual screenLine
|
||||
|
||||
concatenated = screenLine.concat(highlighter.lineForScreenRow(4))
|
||||
concatenated = screenLine.concat(languageMode.lineForScreenRow(4))
|
||||
expect(concatenated.text).toBe ' var pivot = items.shift(), current, left = [], right = []; while(items.length > 0) {'
|
||||
expect(tokensText concatenated.tokens).toBe concatenated.text
|
||||
expect(concatenated.screenDelta).toEqual [2, 0]
|
||||
@@ -80,7 +80,7 @@ describe "ScreenLine", ->
|
||||
beforeEach ->
|
||||
buffer.insert([0, 13], '\t')
|
||||
buffer.insert([0, 0], '\t\t')
|
||||
screenLine = highlighter.lineForScreenRow(0)
|
||||
screenLine = languageMode.lineForScreenRow(0)
|
||||
|
||||
describe "when translating from buffer to screen coordinates", ->
|
||||
it "accounts for tab characters being wider on screen", ->
|
||||
|
||||
@@ -2,8 +2,8 @@ module.exports =
|
||||
class AceFoldAdaptor
|
||||
foldWidgets: {}
|
||||
|
||||
constructor: (@highlighter) ->
|
||||
@buffer = @highlighter.buffer
|
||||
constructor: (@languageMode) ->
|
||||
@buffer = @languageMode.buffer
|
||||
|
||||
getLine: (bufferRow) ->
|
||||
@buffer.lineForRow(bufferRow)
|
||||
@@ -12,5 +12,5 @@ class AceFoldAdaptor
|
||||
@buffer.getLineCount()
|
||||
|
||||
$findClosingBracket: (bracketType, bufferPosition) ->
|
||||
@highlighter.findClosingBracket([bufferPosition.row, bufferPosition.column - 1])
|
||||
@languageMode.findClosingBracket([bufferPosition.row, bufferPosition.column - 1])
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@ AceFoldAdaptor = require 'ace-fold-adaptor'
|
||||
|
||||
module.exports =
|
||||
class FoldSuggester
|
||||
constructor: (@highlighter) ->
|
||||
@buffer = @highlighter.buffer
|
||||
constructor: (@languageMode) ->
|
||||
@buffer = @languageMode.buffer
|
||||
@aceFoldMode = @buffer.getMode().foldingRules
|
||||
@aceFoldAdaptor = new AceFoldAdaptor(@highlighter)
|
||||
@aceFoldAdaptor = new AceFoldAdaptor(@languageMode)
|
||||
|
||||
isBufferRowFoldable: (bufferRow) ->
|
||||
@aceFoldMode?.getFoldWidget(@aceFoldAdaptor, null, bufferRow) == "start"
|
||||
|
||||
@@ -6,7 +6,7 @@ Range = require 'range'
|
||||
Point = require 'point'
|
||||
|
||||
module.exports =
|
||||
class Highlighter
|
||||
class LanguageMode
|
||||
@idCounter: 1
|
||||
buffer: null
|
||||
screenLines: []
|
||||
@@ -14,7 +14,7 @@ class Highlighter
|
||||
constructor: (@buffer, @tabText) ->
|
||||
@id = @constructor.idCounter++
|
||||
@screenLines = @buildScreenLinesForRows('start', 0, @buffer.getLastRow())
|
||||
@buffer.on "change.highlighter#{@id}", (e) => @handleBufferChange(e)
|
||||
@buffer.on "change.languageMode#{@id}", (e) => @handleBufferChange(e)
|
||||
|
||||
handleBufferChange: (e) ->
|
||||
oldRange = e.oldRange.copy()
|
||||
@@ -75,7 +75,7 @@ class Highlighter
|
||||
@screenLines[row]?.state ? 'start'
|
||||
|
||||
destroy: ->
|
||||
@buffer.off ".highlighter#{@id}"
|
||||
@buffer.off ".languageMode#{@id}"
|
||||
|
||||
iterateTokensInBufferRange: (bufferRange, iterator) ->
|
||||
bufferRange = Range.fromObject(bufferRange)
|
||||
@@ -107,4 +107,4 @@ class Highlighter
|
||||
stop()
|
||||
position
|
||||
|
||||
_.extend(Highlighter.prototype, EventEmitter)
|
||||
_.extend(LanguageMode.prototype, EventEmitter)
|
||||
@@ -3,15 +3,15 @@ AceLineCommentAdaptor = require 'ace-line-comment-adaptor'
|
||||
|
||||
module.exports =
|
||||
class LineCommenter
|
||||
highlighter: null
|
||||
languageMode: null
|
||||
buffer: null
|
||||
aceMode: null
|
||||
|
||||
constructor: (@highlighter) ->
|
||||
@buffer = @highlighter.buffer
|
||||
constructor: (@languageMode) ->
|
||||
@buffer = @languageMode.buffer
|
||||
@aceMode = @buffer.getMode()
|
||||
@adaptor = new AceLineCommentAdaptor(@buffer)
|
||||
|
||||
toggleLineCommentsInRange: (range) ->
|
||||
range = Range.fromObject(range)
|
||||
@aceMode.toggleCommentLines(@highlighter.stateForRow(range.start.row), @adaptor, range.start.row, range.end.row)
|
||||
@aceMode.toggleCommentLines(@languageMode.stateForRow(range.start.row), @adaptor, range.start.row, range.end.row)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
_ = require 'underscore'
|
||||
Highlighter = require 'highlighter'
|
||||
LanguageMode = require 'language-mode'
|
||||
FoldSuggester = require 'fold-suggester'
|
||||
LineMap = require 'line-map'
|
||||
Point = require 'point'
|
||||
@@ -14,22 +14,22 @@ module.exports =
|
||||
class Renderer
|
||||
@idCounter: 1
|
||||
lineMap: null
|
||||
highlighter: null
|
||||
languageMode: null
|
||||
activeFolds: null
|
||||
lineCommenter: null
|
||||
foldsById: null
|
||||
lastHighlighterChangeEvent: null
|
||||
lastLanguageModeChangeEvent: null
|
||||
|
||||
constructor: (@buffer, options={}) ->
|
||||
@id = @constructor.idCounter++
|
||||
@highlighter = new Highlighter(@buffer, options.tabText ? ' ')
|
||||
@lineCommenter = new LineCommenter(@highlighter)
|
||||
@foldSuggester = new FoldSuggester(@highlighter)
|
||||
@languageMode = new LanguageMode(@buffer, options.tabText ? ' ')
|
||||
@lineCommenter = new LineCommenter(@languageMode)
|
||||
@foldSuggester = new FoldSuggester(@languageMode)
|
||||
@softWrapColumn = options.softWrapColumn ? Infinity
|
||||
@activeFolds = {}
|
||||
@foldsById = {}
|
||||
@buildLineMap()
|
||||
@highlighter.on 'change', (e) => @lastHighlighterChangeEvent = e
|
||||
@languageMode.on 'change', (e) => @lastLanguageModeChangeEvent = e
|
||||
@buffer.on "change.renderer#{@id}", (e) => @handleBufferChange(e)
|
||||
|
||||
buildLineMap: ->
|
||||
@@ -163,7 +163,7 @@ class Renderer
|
||||
@lineMap.bufferPositionForScreenPosition(position, options)
|
||||
|
||||
stateForScreenRow: (screenRow) ->
|
||||
@highlighter.stateForRow(screenRow)
|
||||
@languageMode.stateForRow(screenRow)
|
||||
|
||||
clipScreenPosition: (position, options) ->
|
||||
@lineMap.clipScreenPosition(position, options)
|
||||
@@ -173,9 +173,9 @@ class Renderer
|
||||
allFolds.push(folds...) for row, folds of @activeFolds
|
||||
fold.handleBufferChange(e) for fold in allFolds
|
||||
|
||||
@handleHighlighterChange(@lastHighlighterChangeEvent)
|
||||
@handleLanguageModeChange(@lastLanguageModeChangeEvent)
|
||||
|
||||
handleHighlighterChange: (e) ->
|
||||
handleLanguageModeChange: (e) ->
|
||||
newRange = e.newRange.copy()
|
||||
newRange.start.row = @bufferRowForScreenRow(@screenRowForBufferRow(newRange.start.row))
|
||||
|
||||
@@ -202,7 +202,7 @@ class Renderer
|
||||
|
||||
startBufferColumn = 0
|
||||
while currentBufferRow <= endBufferRow
|
||||
screenLine = @highlighter.lineForScreenRow(currentBufferRow)
|
||||
screenLine = @languageMode.lineForScreenRow(currentBufferRow)
|
||||
screenLine.foldable = @foldSuggester.isBufferRowFoldable(currentBufferRow)
|
||||
|
||||
if fold = @largestFoldForBufferRow(currentBufferRow)
|
||||
@@ -256,7 +256,7 @@ class Renderer
|
||||
new Range([0, 0], @clipScreenPosition([Infinity, Infinity]))
|
||||
|
||||
destroy: ->
|
||||
@highlighter.destroy()
|
||||
@languageMode.destroy()
|
||||
@buffer.off ".renderer#{@id}"
|
||||
|
||||
logLines: (start, end) ->
|
||||
|
||||
Reference in New Issue
Block a user