Skip to content

Commit

Permalink
Update to 0.25.2 web-tree-sitter
Browse files Browse the repository at this point in the history
  • Loading branch information
adeas31 committed Feb 26, 2025
1 parent 3790ee7 commit 4f7765b
Show file tree
Hide file tree
Showing 14 changed files with 73 additions and 61 deletions.
8 changes: 4 additions & 4 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"tree-sitter": "^0.22.4",
"vscode-languageserver": "^9.0.1",
"vscode-languageserver-textdocument": "^1.0.11",
"web-tree-sitter": "^0.22.5",
"web-tree-sitter": "^0.25.2",
"shx": "^0.3.4"
},
"scripts": {
Expand Down
16 changes: 9 additions & 7 deletions server/src/analyzer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
import * as LSP from 'vscode-languageserver/node';
import { TextDocument } from 'vscode-languageserver-textdocument';

import Parser from 'web-tree-sitter';
import * as Parser from 'web-tree-sitter';

import { getAllDeclarationsInTree } from './util/declarations';
import { getDiagnosticsFromTree } from './util/diagnostics';
Expand Down Expand Up @@ -85,7 +85,7 @@ export class MetaModelicaQueries {
* @param node Node.
* @returns Identifier
*/
public getIdentifier(node: Parser.SyntaxNode): string | undefined {
public getIdentifier(node: Parser.Node): string | undefined {
const captures = this.identifier.captures(node);
if (captures.length > 0) {
return captures[0].node.text;
Expand All @@ -100,7 +100,7 @@ export class MetaModelicaQueries {
* @param node Node.
* @returns Class type
*/
public getClassType(node: Parser.SyntaxNode): string | undefined {
public getClassType(node: Parser.Node): string | undefined {
const captures = this.classType.captures(node);
if (captures.length > 0) {
return captures[0].node.text;
Expand All @@ -111,13 +111,15 @@ export class MetaModelicaQueries {
}

export default class Analyzer {
private parser: Parser;
private parser: Parser.Parser;
private language: Parser.Language;
private uriToAnalyzedDocument: Record<string, AnalyzedDocument | undefined> = {};
private queries: MetaModelicaQueries;

constructor (parser: Parser) {
constructor (parser: Parser.Parser, language: Parser.Language) {
this.parser = parser;
this.queries = new MetaModelicaQueries(parser.getLanguage());
this.language = language;
this.queries = new MetaModelicaQueries(language);
}

public analyze(document: TextDocument): LSP.Diagnostic[] {
Expand All @@ -126,7 +128,7 @@ export default class Analyzer {
const fileContent = document.getText();
const uri = document.uri;

const tree = this.parser.parse(fileContent);
const tree = <Parser.Tree>(this.parser.parse(fileContent));
logger.debug(tree.rootNode.toString());

// Get declarations
Expand Down
14 changes: 7 additions & 7 deletions server/src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,26 @@
* -----------------------------------------------------------------------------
*/

import Parser from 'web-tree-sitter';
import { Parser, Language } from 'web-tree-sitter';
import * as fs from 'fs';
import * as path from 'path';

/**
* Initialize tree-sitter parser and load MetaModelica language.
*
* @returns tree-sitter-metamodelica parser
* @returns [tree-sitter-metamodelica parser, MetaModelica language]
*/
export async function initializeParser(): Promise<Parser> {
export async function initializeParser(): Promise<[Parser, Language]> {
await Parser.init();
const parser = new Parser;
const parser = new Parser();

const metamodelicaWasmFile = path.join(__dirname, 'tree-sitter-metamodelica.wasm');
if (!fs.existsSync(metamodelicaWasmFile)) {
throw new Error(`Can't find 'tree-sitter-metamodelica.wasm' at ${metamodelicaWasmFile}`);
}

const MetaModelica = await Parser.Language.load(metamodelicaWasmFile);
parser.setLanguage(MetaModelica);
const metaModelicaLanguage = await Language.load(metamodelicaWasmFile);
parser.setLanguage(metaModelicaLanguage);

return parser;
return [parser, metaModelicaLanguage];
}
4 changes: 2 additions & 2 deletions server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ export class MetaModelicaServer {
setLogLevel('debug');
logger.debug('Initializing...');

const parser = await initializeParser();
const analyzer = new Analyzer(parser);
const [parser, metaModelicaLanguage] = await initializeParser();
const analyzer = new Analyzer(parser, metaModelicaLanguage);

const server = new MetaModelicaServer(analyzer, capabilities, connection);

Expand Down
8 changes: 5 additions & 3 deletions server/src/test/server.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,11 @@ describe('MetaModelica tree-sitter parser', () => {
});

it('Parse string', async () => {
const parser = await initializeParser();
const [parser, metaModelicaLanguage] = await initializeParser();
const tree = parser.parse(metaModelicaTestString);
const parsedString = tree.rootNode.toString();
assert.equal(parsedString, parsedMetaModelicaTestString);
if (tree) {
const parsedString = tree.rootNode.toString();
assert.equal(parsedString, parsedMetaModelicaTestString);
}
});
});
4 changes: 2 additions & 2 deletions server/src/util/declarations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export function getAllDeclarationsInTree(tree: Parser.Tree, queries: MetaModelic
* @param children DocumentSymbol children.
* @returns Symbol information from node.
*/
export function nodeToDocumentSymbol(node: Parser.SyntaxNode, queries: MetaModelicaQueries, children: LSP.DocumentSymbol[] ): LSP.DocumentSymbol | null {
export function nodeToDocumentSymbol(node: Parser.Node, queries: MetaModelicaQueries, children: LSP.DocumentSymbol[] ): LSP.DocumentSymbol | null {
const name = queries.getIdentifier(node);
if (name === undefined || isEmpty(name)) {
return null;
Expand Down Expand Up @@ -155,7 +155,7 @@ export function nodeToDocumentSymbol(node: Parser.SyntaxNode, queries: MetaModel
* @param node Node containing class_definition
* @returns Symbol kind or `undefined`.
*/
function getKind(node: Parser.SyntaxNode, queries: MetaModelicaQueries): LSP.SymbolKind | undefined {
function getKind(node: Parser.Node, queries: MetaModelicaQueries): LSP.SymbolKind | undefined {

const classType = queries.getClassType(node);
if (classType === undefined) {
Expand Down
2 changes: 1 addition & 1 deletion server/src/util/diagnostics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ export function getDiagnosticsFromTree(tree: Parser.Tree, queries: MetaModelicaQ
* @param node Syntax node
* @returns Diagnostic
*/
function nodeToDiagnostic(node: Parser.SyntaxNode, severity: LSP.DiagnosticSeverity, message: string): LSP.Diagnostic {
function nodeToDiagnostic(node: Parser.Node, severity: LSP.DiagnosticSeverity, message: string): LSP.Diagnostic {
const diagnostic: LSP.Diagnostic = {
range: TreeSitterUtil.range(node),
severity: severity,
Expand Down
24 changes: 13 additions & 11 deletions server/src/util/test/declarations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,23 +101,25 @@ const expectedSymbols = [

describe('nodeToDocumentSymbol', () => {
it('type to TypeParameter', async () => {
const parser = await initializeParser();
const [parser, metaModelicaLanguage] = await initializeParser();
const tree = parser.parse("type Temperature = Real(unit = \"K \");");
const queries = new MetaModelicaQueries(parser.getLanguage());
const symbol = nodeToDocumentSymbol(tree.rootNode.childForFieldName("classDefinitionList")!, queries, []);

assert.equal(symbol?.name, 'Temperature');
assert.equal(symbol?.kind, LSP.SymbolKind.TypeParameter);
const queries = new MetaModelicaQueries(metaModelicaLanguage);
if (tree) {
const symbol = nodeToDocumentSymbol(tree.rootNode.childForFieldName("classDefinitionList")!, queries, []);
assert.equal(symbol?.name, 'Temperature');
assert.equal(symbol?.kind, LSP.SymbolKind.TypeParameter);
}
});
});

describe('getAllDeclarationsInTree', () => {
it('Definitions and types', async () => {
const parser = await initializeParser();
const [parser, metaModelicaLanguage] = await initializeParser();
const tree = parser.parse(metaModelicaTestString);
const queries = new MetaModelicaQueries(parser.getLanguage());
const symbols = getAllDeclarationsInTree(tree, queries);

assert.deepEqual(symbols, expectedSymbols);
if (tree) {
const queries = new MetaModelicaQueries(metaModelicaLanguage);
const symbols = getAllDeclarationsInTree(tree, queries);
assert.deepEqual(symbols, expectedSymbols);
}
});
});
11 changes: 6 additions & 5 deletions server/src/util/test/diagnostics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,12 @@ const expectedDiagnostics: LSP.Diagnostic[] = [

describe('getAllDeclarationsInTree', () => {
it('Definitions and types', async () => {
const parser = await initializeParser();
const [parser, metaModelicaLanguage] = await initializeParser();
const tree = parser.parse(metaModelicaTestString);
const queries = new MetaModelicaQueries(parser.getLanguage());
const diagnostics = getDiagnosticsFromTree(tree, queries);

assert.deepEqual(diagnostics, expectedDiagnostics);
const queries = new MetaModelicaQueries(metaModelicaLanguage);
if (tree) {
const diagnostics = getDiagnosticsFromTree(tree, queries);
assert.deepEqual(diagnostics, expectedDiagnostics);
}
});
});
13 changes: 7 additions & 6 deletions server/src/util/test/util.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@ import * as TreeSitterUtil from '../tree-sitter';

describe('getIdentifier', () => {
it('Identifier of type class', async () => {
const parser = await initializeParser();
const [parser, metaModelicaLanguage] = await initializeParser();
const tree = parser.parse("type Temperature = Real(unit = \"K \");");
const classNode = tree.rootNode.childForFieldName("classDefinitionList")!;
const queries = new MetaModelicaQueries(parser.getLanguage());
const name = queries.getIdentifier(classNode);

assert.equal(name, 'Temperature');
if (tree) {
const classNode = tree.rootNode.childForFieldName("classDefinitionList")!;
const queries = new MetaModelicaQueries(metaModelicaLanguage);
const name = queries.getIdentifier(classNode);
assert.equal(name, 'Temperature');
}
});
});
24 changes: 14 additions & 10 deletions server/src/util/tree-sitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
*/

import * as LSP from 'vscode-languageserver/node';
import { SyntaxNode } from 'web-tree-sitter';
import { Node } from 'web-tree-sitter';

import { logger } from './logger';

Expand All @@ -50,10 +50,14 @@ import { logger } from './logger';
* @param node The node to start iterating from
* @param callback The callback to call for each node. Return false to stop following children.
*/
export function forEach(node: SyntaxNode, callback: (n: SyntaxNode) => void | boolean) {
export function forEach(node: Node, callback: (n: Node) => void | boolean) {
const followChildren = callback(node) !== false;
if (followChildren && node.children.length) {
node.children.forEach((n) => forEach(n, callback));
node.children.forEach((n) => {
if (n !== null) {
forEach(n, callback);
}
});
}
}

Expand All @@ -65,7 +69,7 @@ export function forEach(node: SyntaxNode, callback: (n: SyntaxNode) => void | bo
* @param start The node to start iterating from
* @param callback Callback returning true if node is searched node.
*/
export function findFirst(start: SyntaxNode, callback: (n: SyntaxNode) => boolean): SyntaxNode | null {
export function findFirst(start: Node, callback: (n: Node) => boolean): Node | null {

const cursor = start.walk();
let reachedRoot = false;
Expand Down Expand Up @@ -101,7 +105,7 @@ export function findFirst(start: SyntaxNode, callback: (n: SyntaxNode) => boolea
return null;
}

export function range(n: SyntaxNode): LSP.Range {
export function range(n: Node): LSP.Range {
return LSP.Range.create(
n.startPosition.row,
n.startPosition.column,
Expand All @@ -116,7 +120,7 @@ export function range(n: SyntaxNode): LSP.Range {
* @param n Node of tree
* @returns `true` if node is a definition, `false` otherwise.
*/
export function isDefinition(n: SyntaxNode): boolean {
export function isDefinition(n: Node): boolean {
switch (n.type) {
case 'class_definition':
return true;
Expand All @@ -126,9 +130,9 @@ export function isDefinition(n: SyntaxNode): boolean {
}

export function findParent(
start: SyntaxNode,
predicate: (n: SyntaxNode) => boolean,
): SyntaxNode | null {
start: Node,
predicate: (n: Node) => boolean,
): Node | null {
let node = start.parent;
while (node !== null) {
if (predicate(node)) {
Expand All @@ -145,7 +149,7 @@ export function findParent(
* @param node Class definition node.
* @returns String with class prefixes or `null` if no `class_type` can be found.
*/
export function getClassType(node: SyntaxNode): string | null {
export function getClassType(node: Node): string | null {

if (node.type !== 'class_definition') {
return null;
Expand Down
2 changes: 1 addition & 1 deletion server/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@
"src/test",
"src/util/test"
]
}
}
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@
"path": "./server"
}
]
}
}

0 comments on commit 4f7765b

Please sign in to comment.