import * as vscode from 'vscode'
import {Command} from '../../command';
import {MLIRContext} from '../../mlirContext';
/**
* The parameters to the pdll/viewOutput command. These parameters are:
* - `uri`: The URI of the file to view.
* - `kind`: The kind of the output to generate.
*/
type ViewOutputParams = Partial<{uri : string, kind : string}>;
/**
* The output of the commands:
* - `output`: The output string of the command, e.g. a .mlir PDL string.
*/
type ViewOutputResult = Partial<{output : string}>;
/**
* A command that displays the output of the current PDLL document.
*/
export class ViewPDLLCommand extends Command {
constructor(context: MLIRContext) { super('mlir.viewPDLLOutput', context); }
async execute() {
const editor = vscode.window.activeTextEditor;
if (editor.document.languageId != 'pdll')
return;
// Check to see if a language client is active for this document.
const pdllClient =
this.context.getLanguageClient(editor.document.uri, "pdll");
if (!pdllClient) {
return;
}
// Ask the user for the desired output type.
const outputType =
await vscode.window.showQuickPick([ 'ast', 'mlir', 'cpp' ]);
if (!outputType) {
return;
}
// If we have the language client, ask it to try compiling the document.
let outputParams: ViewOutputParams = {
uri : editor.document.uri.toString(),
kind : outputType,
};
const result: ViewOutputResult|undefined =
await pdllClient.sendRequest('pdll/viewOutput', outputParams);
if (!result || result.output.length === 0) {
return;
}
// Display the output in a new editor.
let outputFileType = 'plaintext';
if (outputType == 'mlir') {
outputFileType = 'mlir';
} else if (outputType == 'cpp') {
outputFileType = 'cpp';
}
await vscode.workspace.openTextDocument(
{language : outputFileType, content : result.output});
}
}