Skip to content

Commit 214e018

Browse files
Fix memory access error on autocomplete-html specs
1 parent e8961b2 commit 214e018

File tree

5 files changed

+52
-26
lines changed

5 files changed

+52
-26
lines changed

packages/autocomplete-html/spec/.eslintrc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module.exports = {
22
env: { jasmine: true },
33
globals: {
4-
"waitsForPromise": true
4+
"waitsForPromise": true,
5+
"advanceClock": true
56
},
67
rules: {
78
"node/no-unpublished-require": "off",

packages/autocomplete-html/spec/provider-spec.js

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,21 @@ describe('HTML autocompletions', () => {
3232
return -1;
3333
}
3434

35-
beforeEach(() => {
36-
waitsForPromise(() => atom.packages.activatePackage('autocomplete-html'))
37-
waitsForPromise(() => atom.packages.activatePackage('language-html'))
38-
waitsForPromise(() => atom.workspace.open('test.html'))
39-
waitsForPromise(() => {
40-
let editor = atom.workspace.getActiveTextEditor()
41-
let languageMode = editor.getBuffer().getLanguageMode()
42-
return languageMode.ready
43-
})
35+
beforeEach(async () => {
36+
await atom.packages.activatePackage('autocomplete-html')
37+
await atom.packages.activatePackage('language-html')
38+
await atom.workspace.open('test.html')
39+
editor = atom.workspace.getActiveTextEditor()
40+
languageMode = editor.getBuffer().getLanguageMode()
41+
languageMode.useAsyncParsing = false
42+
languageMode.useAsyncIndent = false
43+
await languageMode.ready
44+
45+
provider = atom.packages.getActivePackage('autocomplete-html').mainModule.getProvider()
46+
})
4447

45-
runs(() => provider = atom.packages.getActivePackage('autocomplete-html').mainModule.getProvider())
46-
runs(() => editor = atom.workspace.getActiveTextEditor())
47-
runs(() => languageMode = editor.getBuffer().getLanguageMode())
48+
afterEach(async () => {
49+
await languageMode.atTransactionEnd()
4850
})
4951

5052
it('returns no completions when not at the start of a tag', async () => {
@@ -591,13 +593,8 @@ describe('HTML autocompletions', () => {
591593
return languageMode.atTransactionEnd()
592594
})
593595

594-
waitsForPromise(() => {
595-
return atom.packages.activatePackage('language-javascript')
596-
})
597-
598-
runs(() => {
599-
editor.setCursorBufferPosition([0, editor.getText().indexOf('""') + 1])
600-
expect(() => getCompletions()).not.toThrow()
601-
})
596+
await atom.packages.activatePackage('language-javascript')
597+
editor.setCursorBufferPosition([0, editor.getText().indexOf('""') + 1])
598+
expect(() => getCompletions()).not.toThrow()
602599
})
603600
})

packages/bookmarks/spec/.eslintrc.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
env: { jasmine: true },
3+
rules: {
4+
"semi": ["error", "never"],
5+
"node/no-unpublished-require": "off",
6+
"node/no-extraneous-require": "off",
7+
"no-unused-vars": "off",
8+
"no-empty": "off"
9+
}
10+
}

spec/text-editor-spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ async function languageModeReady (editor) {
1616
}
1717
}
1818

19-
fdescribe('TextEditor', () => {
19+
describe('TextEditor', () => {
2020
let buffer, editor, lineLengths, languageMode;
2121

2222
beforeEach(async () => {

src/wasm-tree-sitter-language-mode.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4043,20 +4043,38 @@ class LanguageLayer {
40434043
class NodeRangeSet {
40444044
constructor(previous, nodes, injectionPoint) {
40454045
this.previous = previous;
4046-
this.nodes = nodes;
40474046
this.newlinesBetween = injectionPoint.newlinesBetween;
40484047
this.includeAdjacentWhitespace = injectionPoint.includeAdjacentWhitespace;
40494048
this.includeChildren = injectionPoint.includeChildren;
4049+
4050+
// We shouldn't retain references to nodes here because the tree might get
4051+
// disposed of layer. Let's compile the information we need now while we're
4052+
// sure the tree is fresh.
4053+
this.nodeSpecs = [];
4054+
for (let node of nodes) {
4055+
this.nodeSpecs.push(this.getNodeSpec(node, true));
4056+
}
4057+
}
4058+
4059+
getNodeSpec (node, getChildren) {
4060+
let { startIndex, endIndex, startPosition, endPosition, id } = node;
4061+
let result = { startIndex, endIndex, startPosition, endPosition, id };
4062+
if (node.children && getChildren) {
4063+
result.children = [];
4064+
for (let child of node.children) {
4065+
result.children.push(this.getNodeSpec(child, false));
4066+
}
4067+
}
4068+
return result;
40504069
}
40514070

40524071
getRanges(buffer) {
40534072
const previousRanges = this.previous && this.previous.getRanges(buffer);
40544073
let result = [];
40554074

4056-
for (const node of this.nodes) {
4075+
for (const node of this.nodeSpecs) {
40574076
let position = node.startPosition, index = node.startIndex;
4058-
4059-
if (!this.includeChildren) {
4077+
if (node.children && !this.includeChildren) {
40604078
// If `includeChildren` is `false`, we're effectively collecting all
40614079
// the disjoint text nodes that are direct descendants of this node.
40624080
for (const child of node.children) {

0 commit comments

Comments
 (0)