All files / commands inline-blank-nodes.ts

85.71% Statements 30/35
83.33% Branches 10/12
100% Functions 2/2
85.29% Lines 29/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77                  1x     4x   4x 1x 1x     3x   3x 3x   3x 1x 1x     2x         2x   2x         2x 2x   2x 1x 1x     1x 1x   1x 1x   1x 1x           1x         1x 1x   1x            
import * as vscode from 'vscode';
import { container } from 'tsyringe';
import { TurtleParser, TurtleReader } from '@faubulous/mentor-rdf-parsers';
import { QuadContextSerializer, TurtleSerializer } from '@faubulous/mentor-rdf-serializers';
import { ServiceToken } from '@src/services/tokens';
import { IDocumentContextService } from '@src/services/document';
import { WorkspaceUri } from '@src/providers/workspace-uri';
import { TurtleDocument } from '@src/languages';
 
export const inlineBlankNodes = {
	id: 'mentor.command.inlineBlankNodes',
	handler: async (documentUri?: vscode.Uri) => {
		documentUri = documentUri ?? vscode.window.activeTextEditor?.document.uri;
		
		if (!documentUri) {
			vscode.window.showErrorMessage('Invalid document URI.');
			return;
		}
 
		const targetUri = WorkspaceUri.toCanonicalString(documentUri);
 
		const contextService = container.resolve<IDocumentContextService>(ServiceToken.DocumentContextService);
		const context = contextService.contexts[targetUri] as TurtleDocument | undefined;
 
		if (!context) {
			vscode.window.showErrorMessage('The document context could not be retrieved.');
			return;
		}
 
		Iif (!(context instanceof TurtleDocument)) {
			vscode.window.showErrorMessage('Unsupported language for inlining blank nodes.');
			return;
		}
 
		const document = context.getTextDocument();
 
		Iif (!document) {
			vscode.window.showErrorMessage('The document could not be retrieved from the context.');
			return;
		}
 
		const diagnostics = vscode.languages.getDiagnostics(document.uri);
		const hasErrors = diagnostics.some((d) => d.severity === vscode.DiagnosticSeverity.Error);
 
		if (hasErrors) {
			await vscode.window.showErrorMessage('This document has syntax errors and cannot be refactored.');
			return;
		}
 
		try {
			const cst = new TurtleParser().parse(context.tokens);
 
			const reader = new TurtleReader();
			const quadContexts = reader.readQuadContexts(cst, context.tokens);
 
			const serializer = new TurtleSerializer();
			const output = serializer.serialize(quadContexts, {
				prefixes: context.namespaces,
				baseIri: context.baseIri,
				inlineSingleUseBlankNodes: true,
			});
 
			const fullRange = new vscode.Range(
				document.positionAt(0),
				document.positionAt(document.getText().length)
			);
 
			const edit = new vscode.WorkspaceEdit();
			edit.replace(document.uri, fullRange, output);
 
			await vscode.workspace.applyEdit(edit);
		} catch (error) {
			vscode.window.showErrorMessage(`Error inlining blank nodes: ${error}`);
		}
	}
};