Skip to content

Commit

Permalink
Rename LanguageMode to TokenizedBuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
probablycorey-and-nathan committed Jun 14, 2012
1 parent 470f469 commit 291886b
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 97 deletions.
8 changes: 4 additions & 4 deletions spec/app/line-map-spec.coffee
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
LineMap = require 'line-map'
ScreenLine = require 'screen-line'
Buffer = require 'buffer'
LanguageMode = require 'language-mode'
TokenizedBuffer = require 'tokenized-buffer'
Point = require 'point'

describe "LineMap", ->
[languageMode, map] = []
[tokenizedBuffer, map] = []
[line0, line1, line2, line3, line4] = []

beforeEach ->
buffer = new Buffer(require.resolve 'fixtures/sample.js')
languageMode = new LanguageMode(buffer)
tokenizedBuffer = new TokenizedBuffer(buffer)
map = new LineMap
[line0, line1, line2, line3, line4] = languageMode.linesForScreenRows(0, 4)
[line0, line1, line2, line3, line4] = tokenizedBuffer.linesForScreenRows(0, 4)

describe ".insertAtBufferRow(row, lineFragments)", ->
it "inserts the given line fragments before the specified buffer row", ->
Expand Down
12 changes: 6 additions & 6 deletions spec/app/screen-line-spec.coffee
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
_ = require 'underscore'
Buffer = require 'buffer'
LanguageMode = require 'language-mode'
TokenizedBuffer = require 'tokenized-buffer'

describe "ScreenLine", ->
[buffer, tabText, screenLine, languageMode] = []
[buffer, tabText, screenLine, tokenizedBuffer] = []

beforeEach ->
tabText = ' '
buffer = new Buffer(require.resolve 'fixtures/sample.js')
languageMode = new LanguageMode(buffer, tabText)
screenLine = languageMode.lineForScreenRow(3)
tokenizedBuffer = new TokenizedBuffer(buffer, tabText)
screenLine = tokenizedBuffer.lineForScreenRow(3)

describe ".splitAt(column)", ->
it "breaks the line fragment into two fragments", ->
Expand Down Expand Up @@ -70,7 +70,7 @@ describe "ScreenLine", ->
[left, right] = screenLine.splitAt(14)
expect(left.concat(right)).toEqual screenLine

concatenated = screenLine.concat(languageMode.lineForScreenRow(4))
concatenated = screenLine.concat(tokenizedBuffer.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]
Expand All @@ -80,7 +80,7 @@ describe "ScreenLine", ->
beforeEach ->
buffer.insert([0, 13], '\t')
buffer.insert([0, 0], '\t\t')
screenLine = languageMode.lineForScreenRow(0)
screenLine = tokenizedBuffer.lineForScreenRow(0)

describe "when translating from buffer to screen coordinates", ->
it "accounts for tab characters being wider on screen", ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
LanguageMode = require 'language-mode'
TokenizedBuffer = require 'tokenized-buffer'
Buffer = require 'buffer'
Range = require 'range'

describe "LanguageMode", ->
[languageMode, buffer] = []
describe "TokenizedBuffer", ->
[tokenizedBuffer, buffer] = []

beforeEach ->
buffer = new Buffer(require.resolve('fixtures/sample.js'))
languageMode = new LanguageMode(buffer, ' ')
tokenizedBuffer = new TokenizedBuffer(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]
expect(tokenizedBuffer.findClosingBracket([1, 29])).toEqual [9, 2]

describe ".toggleLineCommentsInRange(range)", ->
it "comments/uncomments lines in the given range", ->
languageMode.toggleLineCommentsInRange([[4, 5], [7, 8]])
tokenizedBuffer.toggleLineCommentsInRange([[4, 5], [7, 8]])
expect(buffer.lineForRow(4)).toBe "// while(items.length > 0) {"
expect(buffer.lineForRow(5)).toBe "// current = items.shift();"
expect(buffer.lineForRow(6)).toBe "// current < pivot ? left.push(current) : right.push(current);"
expect(buffer.lineForRow(7)).toBe "// }"

languageMode.toggleLineCommentsInRange([[4, 5], [5, 8]])
tokenizedBuffer.toggleLineCommentsInRange([[4, 5], [5, 8]])
expect(buffer.lineForRow(4)).toBe " while(items.length > 0) {"
expect(buffer.lineForRow(5)).toBe " current = items.shift();"
expect(buffer.lineForRow(6)).toBe "// current < pivot ? left.push(current) : right.push(current);"
Expand All @@ -32,64 +32,64 @@ describe "LanguageMode", ->
describe "javascript", ->
beforeEach ->
buffer = new Buffer(require.resolve 'fixtures/sample.js')
languageMode = new LanguageMode(buffer)
tokenizedBuffer = new TokenizedBuffer(buffer)

describe ".isBufferRowFoldable(bufferRow)", ->
it "returns true only when the buffer row starts a foldable region", ->
expect(languageMode.isBufferRowFoldable(0)).toBeTruthy()
expect(languageMode.isBufferRowFoldable(1)).toBeTruthy()
expect(languageMode.isBufferRowFoldable(2)).toBeFalsy()
expect(languageMode.isBufferRowFoldable(3)).toBeFalsy()
expect(tokenizedBuffer.isBufferRowFoldable(0)).toBeTruthy()
expect(tokenizedBuffer.isBufferRowFoldable(1)).toBeTruthy()
expect(tokenizedBuffer.isBufferRowFoldable(2)).toBeFalsy()
expect(tokenizedBuffer.isBufferRowFoldable(3)).toBeFalsy()

describe ".rowRangeForFoldAtBufferRow(bufferRow)", ->
it "returns the start/end rows of the foldable region starting at the given row", ->
expect(languageMode.rowRangeForFoldAtBufferRow(0)).toEqual [0, 12]
expect(languageMode.rowRangeForFoldAtBufferRow(1)).toEqual [1, 9]
expect(languageMode.rowRangeForFoldAtBufferRow(2)).toBeNull()
expect(languageMode.rowRangeForFoldAtBufferRow(4)).toEqual [4, 7]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(0)).toEqual [0, 12]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(1)).toEqual [1, 9]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(2)).toBeNull()
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(4)).toEqual [4, 7]

describe "coffeescript", ->
beforeEach ->
buffer = new Buffer(require.resolve 'fixtures/coffee.coffee')
languageMode = new LanguageMode(buffer)
tokenizedBuffer = new TokenizedBuffer(buffer)

describe ".isBufferRowFoldable(bufferRow)", ->
it "returns true only when the buffer row starts a foldable region", ->
expect(languageMode.isBufferRowFoldable(0)).toBeTruthy()
expect(languageMode.isBufferRowFoldable(1)).toBeTruthy()
expect(languageMode.isBufferRowFoldable(2)).toBeFalsy()
expect(languageMode.isBufferRowFoldable(3)).toBeFalsy()
expect(languageMode.isBufferRowFoldable(19)).toBeTruthy()
expect(tokenizedBuffer.isBufferRowFoldable(0)).toBeTruthy()
expect(tokenizedBuffer.isBufferRowFoldable(1)).toBeTruthy()
expect(tokenizedBuffer.isBufferRowFoldable(2)).toBeFalsy()
expect(tokenizedBuffer.isBufferRowFoldable(3)).toBeFalsy()
expect(tokenizedBuffer.isBufferRowFoldable(19)).toBeTruthy()

describe ".rowRangeForFoldAtBufferRow(bufferRow)", ->
it "returns the start/end rows of the foldable region starting at the given row", ->
expect(languageMode.rowRangeForFoldAtBufferRow(0)).toEqual [0, 20]
expect(languageMode.rowRangeForFoldAtBufferRow(1)).toEqual [1, 17]
expect(languageMode.rowRangeForFoldAtBufferRow(2)).toBeNull()
expect(languageMode.rowRangeForFoldAtBufferRow(19)).toEqual [19, 20]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(0)).toEqual [0, 20]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(1)).toEqual [1, 17]
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(2)).toBeNull()
expect(tokenizedBuffer.rowRangeForFoldAtBufferRow(19)).toEqual [19, 20]

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')
expect(tokenizedBuffer.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
expect(tokenizedBuffer.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
tokenizedBuffer.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')
expect(tokenizedBuffer.lineForScreenRow(0).tokens[0]).toEqual(type: 'identifier', value: 'foo')
expect(tokenizedBuffer.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(tokenizedBuffer.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'if')

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -102,9 +102,9 @@ describe "LanguageMode", ->
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(tokenizedBuffer.lineForScreenRow(3).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(4).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(5).tokens[0].type).toBe 'comment'

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -116,24 +116,24 @@ describe "LanguageMode", ->
buffer.insert([5, 0], '*/')

buffer.insert([1, 0], 'var ')
expect(languageMode.lineForScreenRow(1).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.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')
expect(tokenizedBuffer.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')
expect(tokenizedBuffer.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
expect(tokenizedBuffer.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(tokenizedBuffer.lineForScreenRow(2).tokens[1]).toEqual(type: 'keyword', value: 'while')
expect(tokenizedBuffer.lineForScreenRow(3).tokens[1]).toEqual(type: 'identifier', value: 'current')
expect(tokenizedBuffer.lineForScreenRow(4).tokens[3]).toEqual(type: 'keyword.operator', value: '<')

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -145,9 +145,9 @@ describe "LanguageMode", ->
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(tokenizedBuffer.lineForScreenRow(2).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(3).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(4).tokens[0].type).toBe 'comment'

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -160,19 +160,19 @@ describe "LanguageMode", ->
buffer.change(range, "foo()\nbar()\nbaz()\nquux()")

# previous line 0 remains
expect(languageMode.lineForScreenRow(0).tokens[0]).toEqual(type: 'keyword.definition', value: 'var')
expect(tokenizedBuffer.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')
expect(tokenizedBuffer.lineForScreenRow(1).tokens[0]).toEqual(type: 'identifier', value: 'foo')
expect(tokenizedBuffer.lineForScreenRow(2).tokens[0]).toEqual(type: 'identifier', value: 'bar')
expect(tokenizedBuffer.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')
expect(tokenizedBuffer.lineForScreenRow(4).tokens[0]).toEqual(type: 'identifier', value: 'quux')
expect(tokenizedBuffer.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(tokenizedBuffer.lineForScreenRow(5).tokens[3]).toEqual(type: 'identifier', value: 'pivot')

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -184,13 +184,13 @@ describe "LanguageMode", ->
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(tokenizedBuffer.lineForScreenRow(2).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(3).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(4).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(5).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(6).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(7).tokens[0].type).toBe 'comment'
expect(tokenizedBuffer.lineForScreenRow(8).tokens[0].type).not.toBe 'comment'

expect(changeHandler).toHaveBeenCalled()
[event] = changeHandler.argsForCall[0]
Expand All @@ -203,10 +203,10 @@ describe "LanguageMode", ->
beforeEach ->
tabText = ' '
buffer = new Buffer(require.resolve('fixtures/sample-with-tabs.coffee'))
languageMode = new LanguageMode(buffer, tabText)
tokenizedBuffer = new TokenizedBuffer(buffer, tabText)

it "always renders each tab as its own atomic token containing tabText", ->
screenLine0 = languageMode.lineForScreenRow(0)
screenLine0 = tokenizedBuffer.lineForScreenRow(0)
expect(screenLine0.text).toBe "# Econ 101#{tabText}"
{ tokens } = screenLine0
expect(tokens.length).toBe 2
Expand All @@ -215,5 +215,5 @@ describe "LanguageMode", ->
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"
expect(tokenizedBuffer.lineForScreenRow(2).text).toBe "#{tabText} buy()#{tabText}while supply > demand"

8 changes: 4 additions & 4 deletions src/app/ace-adaptor.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ module.exports =
class AceAdaptor
foldWidgets: {}

constructor: (@languageMode) ->
@buffer = @languageMode.buffer
constructor: (@tokenizedBuffer) ->
@buffer = @tokenizedBuffer.buffer

getLine: (bufferRow) ->
@buffer.lineForRow(bufferRow)
Expand All @@ -12,7 +12,7 @@ class AceAdaptor
@buffer.getLineCount()

$findClosingBracket: (bracketType, bufferPosition) ->
@languageMode.findClosingBracket([bufferPosition.row, bufferPosition.column - 1])
@tokenizedBuffer.findClosingBracket([bufferPosition.row, bufferPosition.column - 1])

indentRows: (startRow, endRow, indentString) ->
for row in [startRow..endRow]
Expand All @@ -29,5 +29,5 @@ class AceAdaptor
# Does not actually replace text; always outdents one level
replace: (range, text) ->
start = range.start
end = {row: range.start.row, column: range.start.column + @languageMode.tabText.length}
end = {row: range.start.row, column: range.start.column + @tokenizedBuffer.tabText.length}
@buffer.change([start, end], "")
Loading

0 comments on commit 291886b

Please sign in to comment.