137 lines
4.6 KiB
JavaScript
137 lines
4.6 KiB
JavaScript
/* eslint-disable @typescript-eslint/naming-convention */
|
|
"use strict";
|
|
const os = require('os');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const vscode = require('vscode');
|
|
const temp = require("temp");
|
|
|
|
const vlogFormatter = require("./vlogFormatter.js");
|
|
const vhdlFormatter = require("./vhdlFormatter.js");
|
|
|
|
class Formatter {
|
|
constructor() {
|
|
this.vlogFormatter = new VlogFormatter();
|
|
this.vhdlFormatter = new VhdlFormatter();
|
|
}
|
|
|
|
async provideDocumentFormattingEdits(document, options, token) {
|
|
const edits = [];
|
|
//Get document code
|
|
let code_document = document.getText();
|
|
let selection_document = this.getDocumentRange(document);
|
|
//Get selected text
|
|
let editor = vscode.window.activeTextEditor;
|
|
let selection_selected_text = '';
|
|
let code_selected_text = '';
|
|
if (editor !== undefined) {
|
|
selection_selected_text = editor.selection;
|
|
code_selected_text = editor.document.getText(editor.selection);
|
|
}
|
|
//Code to format
|
|
let code_to_format = '';
|
|
let selection_to_format = '';
|
|
if (code_selected_text !== '') {
|
|
code_to_format = code_selected_text;
|
|
selection_to_format = selection_selected_text;
|
|
} else {
|
|
code_to_format = code_document;
|
|
selection_to_format = selection_document;
|
|
}
|
|
|
|
let code_format = await this.format(document.languageId, code_to_format);
|
|
if (code_format === null) {
|
|
console.log("Error format code.");
|
|
return edits;
|
|
} else {
|
|
const replacement = vscode.TextEdit.replace(selection_to_format, code_format);
|
|
edits.push(replacement);
|
|
return edits;
|
|
}
|
|
}
|
|
|
|
async format(language, code) {
|
|
let options = null;
|
|
let formatted_code = '';
|
|
try {
|
|
if (language === "vhdl") {
|
|
options = this.get_vhdl_config();
|
|
formatted_code = await this.vhdlFormatter.format_from_code(code, options);
|
|
}
|
|
else {
|
|
options = this.get_vlog_config();
|
|
formatted_code = await this.vlogFormatter.format_from_code(code, options);
|
|
}
|
|
return formatted_code;
|
|
} catch (error) {
|
|
return code;
|
|
}
|
|
}
|
|
|
|
get_vlog_config() {
|
|
let style = vscode.workspace.getConfiguration("function.lsp.formatter.vlog.default").get("style");
|
|
let args = vscode.workspace.getConfiguration("function.lsp.formatter.vlog.default").get("args");
|
|
return `--style=${style} ${args}`;
|
|
}
|
|
|
|
get_vhdl_config() {
|
|
let configuration = vscode.workspace.getConfiguration('function.lsp.formatter.vhdl.default');
|
|
let settings = {
|
|
"RemoveComments": false,
|
|
"RemoveAsserts": false,
|
|
"CheckAlias": false,
|
|
"AlignComments": configuration.get('align-comments'),
|
|
"SignAlignSettings": {
|
|
"isRegional": true,
|
|
"isAll": true,
|
|
"mode": 'local',
|
|
"keyWords": [
|
|
"FUNCTION",
|
|
"IMPURE FUNCTION",
|
|
"GENERIC",
|
|
"PORT",
|
|
"PROCEDURE"
|
|
]
|
|
},
|
|
"KeywordCase": configuration.get('keyword-case'),
|
|
"TypeNameCase": configuration.get('type-name-case'),
|
|
"Indentation": ' '.repeat(configuration.get('indentation')),
|
|
"NewLineSettings": {
|
|
"newLineAfter": [
|
|
";",
|
|
"then"
|
|
],
|
|
"noNewLineAfter": []
|
|
},
|
|
"EndOfLine": "\n"
|
|
};
|
|
return settings;
|
|
}
|
|
|
|
getDocumentRange(document) {
|
|
const lastLineId = document.lineCount - 1;
|
|
return new vscode.Range(0, 0, lastLineId, document.lineAt(lastLineId).text.length);
|
|
}
|
|
}
|
|
|
|
class VlogFormatter {
|
|
async format_from_code(code, options) {
|
|
let verilogFormatter = await vlogFormatter();
|
|
verilogFormatter.FS.writeFile("/share/FILE_IN.v", code, { encoding: 'utf8' });
|
|
verilogFormatter.ccall('run', '', ['string'], [`${options} finish`]);
|
|
let formatted_code = verilogFormatter.FS.readFile("/share/FILE_OUT.v", { encoding: 'utf8' });
|
|
return formatted_code;
|
|
}
|
|
}
|
|
|
|
class VhdlFormatter {
|
|
async format_from_code(code, options) {
|
|
let beautifuler = new vhdlFormatter.Beautifuler();
|
|
let formatted_code = beautifuler.beauty(code, options);
|
|
return formatted_code;
|
|
}
|
|
}
|
|
|
|
|
|
const hdlFormatterProvider = new Formatter();
|
|
module.exports = { hdlFormatterProvider }; |