Skip to content

Instantly share code, notes, and snippets.

@pranaygp
Created November 11, 2018 19:05
Show Gist options
  • Save pranaygp/c131e2c5145f5a0513c8eeddd4747cd8 to your computer and use it in GitHub Desktop.
Save pranaygp/c131e2c5145f5a0513c8eeddd4747cd8 to your computer and use it in GitHub Desktop.
tree-sitter-error-repro

setup

import repro.js from the main process of an electron app

output

(program)
Typing a
(program (expression_statement (identifier)))
Typing
(program (expression_statement (identifier)))
Typing =
(program (expression_statement (identifier)) (ERROR))
Typing
(program (ERROR (identifier)))
Typing 1
(program (expression_statement (assignment_expression (identifier) (number))))
Typing

(program (expression_statement (assignment_expression (identifier) (number))))
Typing b
(program (expression_statement (assignment_expression (identifier) (number))) (expression_statement (identifier)))
Typing
(program (expression_statement (assignment_expression (identifier) (number))) (expression_statement (identifier)))
Typing =
(program (expression_statement (assignment_expression (identifier) (number))) (expression_statement (identifier)) (ERROR))
Typing
(program (expression_statement (assignment_expression (identifier) (number))) (expression_statement (identifier)) (ERROR))
Typing 2
(program (expression_statement (assignment_expression (identifier) (number))) (expression_statement (identifier)) (ERROR) (expression_statement (number)))
import Parser from "tree-sitter";
import JavaScript from "tree-sitter-javascript";
let src = ``;
const dest = `a = 1
b = 2`;
const edits = [
{
startIndex: 0,
oldEndIndex: 0,
newEndIndex: 1,
startPosition: { row: 0, column: 0 },
oldEndPosition: { row: 0, column: 0 },
newEndPosition: { row: 0, column: 1 }
},
{
startIndex: 1,
oldEndIndex: 1,
newEndIndex: 2,
startPosition: { row: 0, column: 1 },
oldEndPosition: { row: 0, column: 1 },
newEndPosition: { row: 0, column: 2 }
},
{
startIndex: 2,
oldEndIndex: 2,
newEndIndex: 3,
startPosition: { row: 0, column: 2 },
oldEndPosition: { row: 0, column: 2 },
newEndPosition: { row: 0, column: 3 }
},
{
startIndex: 3,
oldEndIndex: 3,
newEndIndex: 4,
startPosition: { row: 0, column: 3 },
oldEndPosition: { row: 0, column: 3 },
newEndPosition: { row: 0, column: 4 }
},
{
startIndex: 4,
oldEndIndex: 4,
newEndIndex: 5,
startPosition: { row: 0, column: 4 },
oldEndPosition: { row: 0, column: 4 },
newEndPosition: { row: 0, column: 5 }
},
{
startIndex: 5,
oldEndIndex: 5,
newEndIndex: 6,
startPosition: { row: 0, column: 5 },
oldEndPosition: { row: 0, column: 5 },
newEndPosition: { row: 1, column: 0 }
},
{
startIndex: 6,
oldEndIndex: 6,
newEndIndex: 7,
startPosition: { row: 1, column: 0 },
oldEndPosition: { row: 1, column: 0 },
newEndPosition: { row: 1, column: 1 }
},
{
startIndex: 7,
oldEndIndex: 7,
newEndIndex: 8,
startPosition: { row: 1, column: 1 },
oldEndPosition: { row: 1, column: 1 },
newEndPosition: { row: 1, column: 2 }
},
{
startIndex: 8,
oldEndIndex: 8,
newEndIndex: 9,
startPosition: { row: 1, column: 2 },
oldEndPosition: { row: 1, column: 2 },
newEndPosition: { row: 1, column: 3 }
},
{
startIndex: 9,
oldEndIndex: 9,
newEndIndex: 10,
startPosition: { row: 1, column: 3 },
oldEndPosition: { row: 1, column: 3 },
newEndPosition: { row: 1, column: 4 }
},
{
startIndex: 10,
oldEndIndex: 10,
newEndIndex: 11,
startPosition: { row: 1, column: 4 },
oldEndPosition: { row: 1, column: 4 },
newEndPosition: { row: 1, column: 5 }
}
];
const parser = new Parser();
parser.setLanguage(JavaScript);
let tree = parser.parse(src);
console.log(tree.rootNode.toString());
edits.forEach((e, i) => {
const c = dest[i];
console.log(`Typing ${c}`);
src += c;
tree.edit(e);
tree = parser.parse(src, tree);
console.log(tree.rootNode.toString());
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment