8000 Suppress line measurement exceptions and gather data to solve them by nathansobo · Pull Request #7778 · atom/atom · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Mar 3, 2023. It is now read-only.

Suppress line measurement exceptions and gather data to solve them #7778

Merged
merged 3 commits into from
Jul 8, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
"deprecation-cop": "0.53.0",
"dev-live-reload": "0.46.0",
"encoding-selector": "0.21.0",
"exception-reporting": "0.34.0",
"exception-reporting": "0.35.0",
"find-and-replace": "0.174.2",
"fuzzy-finder": "0.87.0",
"git-diff": "0.55.0",
Expand Down
18 changes: 6 additions & 12 deletions spec/atom-spec.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ describe "the `atom` global", ->
column: 3
originalError: error

describe ".assert(condition, message, metadata)", ->
describe ".assert(condition, message, callback)", ->
errors = null

beforeEach ->
Expand All @@ -142,17 +142,11 @@ describe "the `atom` global", ->
expect(errors[0].message).toBe "Assertion failed: a == b"
expect(errors[0].stack).toContain('atom-spec')

describe "if metadata is an object", ->
it "assigns the object on the error as `metadata`", ->
metadata = {foo: 'bar'}
atom.assert(false, "a == b", metadata)
expect(errors[0].metadata).toBe metadata

describe "if metadata is a function", ->
it "assigns the function's return value on the error as `metadata`", ->
metadata = {foo: 'bar'}
atom.assert(false, "a == b", -> metadata)
expect(errors[0].metadata).toBe metadata
describe "if passed a callback function", ->
it "calls the callback with the assertion failure's error object", ->
error = null
atom.assert(false, "a == b", (e) -> error = e)
expect(error).toBe errors[0]

describe "if the condition is true", ->
it "does nothing", ->
Expand Down
9 changes: 2 additions & 7 deletions src/atom.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -721,17 +721,12 @@ class Atom extends Model
Section: Private
###

assert: (condition, message, metadata) ->
assert: (condition, message, callback) ->
return true if condition

error = new Error("Assertion failed: #{message}")
Error.captureStackTrace(error, @assert)

if metadata?
if typeof metadata is 'function'
error.metadata = metadata()
else
error.metadata = metadata
callback?(error)

@emitter.emit 'did-fail-assertion', error

Expand Down
29 changes: 28 additions & 1 deletion src/lines-tile-component.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -346,17 +346,44 @@ class LinesTileComponent
rangeForMeasurement ?= document.createRange()
iterator = document.createNodeIterator(lineNode, NodeFilter.SHOW_TEXT, AcceptFilter)
textNode = iterator.nextNode()
textNodeLength = textNode.length
textNodeIndex = 0
nextTextNodeIndex = textNode.textContent.length

while nextTextNodeIndex <= charIndex
textNode = iterator.nextNode()
textNodeLength = textNode.length
textNodeIndex = nextTextNodeIndex
nextTextNodeIndex = textNodeIndex + textNode.textContent.length

i = charIndex - textNodeIndex
rangeForMeasurement.setStart(textNode, i)
rangeForMeasurement.setEnd(textNode, i + charLength)

if i + charLength <= textNodeLength
rangeForMeasurement.setEnd(textNode, i + charLength)
else
rangeForMeasurement.setEnd(textNode, textNodeLength)
atom.assert false, "Expected index to be less than the length of text node while measuring", (error) =>
editor = @presenter.model
screenRow = tokenizedLine.screenRow
bufferRow = editor.bufferRowForScreenRow(screenRow)

error.metadata = {
grammarScopeName: editor.getGrammar().scopeName
screenRow: screenRow
bufferRow: bufferRow
softWrapped: editor.isSoftWrapped()
softTabs: editor.getSoftTabs()
i: i
charLength: charLength
textNodeLength: textNode.length
}
error.privateMetadataDescription = "The contents of line #{bufferRow + 1}."
error.privateMetadata = {
lineText: editor.lineTextForBufferRow(bufferRow)
}
error.privateMetadataRequestName = "measured-line-text"

charWidth = rangeForMeasurement.getBoundingClientRect().width
@presenter.setScopedCharacterWidth(scopes, char, charWidth)

Expand Down
6 changes: 4 additions & 2 deletions src/tokenized-buffer.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -296,10 +296,12 @@ class TokenizedBuffer extends Model
# undefined. This should paper over the problem but we want to figure out
# what is happening:
tokenizedLine = @tokenizedLineForRow(row)
atom.assert tokenizedLine?, "TokenizedLine is defined", =>
metadata:
atom.assert tokenizedLine?, "TokenizedLine is defined", (error) =>
error.metadata = {
row: row
rowCount: @tokenizedLines.length
}

return false unless tokenizedLine?

return false if @buffer.isRowBlank(row) or tokenizedLine.isComment()
Expand Down
0