Browse Source

refactor

master
g2384 6 years ago
parent
commit
760d4e69db
4 changed files with 79 additions and 65 deletions
  1. +28
    -33
      VHDLFormatter.js
  2. +28
    -32
      VHDLFormatter.ts
  3. +11
    -0
      VHDLFormatterUnitTests.js
  4. +12
    -0
      VHDLFormatterUnitTests.ts

+ 28
- 33
VHDLFormatter.js View File

@ -252,8 +252,8 @@ exports.BeautifierSettings = BeautifierSettings;
let KeyWords = ["ABS", "ACCESS", "AFTER", "ALIAS", "ALL", "AND", "ARCHITECTURE", "ARRAY", "ASSERT", "ATTRIBUTE", "BEGIN", "BLOCK", "BODY", "BUFFER", "BUS", "CASE", "COMPONENT", "CONFIGURATION", "CONSTANT", "CONTEXT", "COVER", "DISCONNECT", "DOWNTO", "DEFAULT", "ELSE", "ELSIF", "END", "ENTITY", "EXIT", "FAIRNESS", "FILE", "FOR", "FORCE", "FUNCTION", "GENERATE", "GENERIC", "GROUP", "GUARDED", "IF", "IMPURE", "IN", "INERTIAL", "INOUT", "IS", "LABEL", "LIBRARY", "LINKAGE", "LITERAL", "LOOP", "MAP", "MOD", "NAND", "NEW", "NEXT", "NOR", "NOT", "NULL", "OF", "ON", "OPEN", "OR", "OTHERS", "OUT", "PACKAGE", "PORT", "POSTPONED", "PROCEDURE", "PROCESS", "PROPERTY", "PROTECTED", "PURE", "RANGE", "RECORD", "REGISTER", "REJECT", "RELEASE", "REM", "REPORT", "RESTRICT", "RESTRICT_GUARANTEE", "RETURN", "ROL", "ROR", "SELECT", "SEQUENCE", "SEVERITY", "SHARED", "SIGNAL", "SLA", "SLL", "SRA", "SRL", "STRONG", "SUBTYPE", "THEN", "TO", "TRANSPORT", "TYPE", "UNAFFECTED", "UNITS", "UNTIL", "USE", "VARIABLE", "VMODE", "VPROP", "VUNIT", "WAIT", "WHEN", "WHILE", "WITH", "XNOR", "XOR"];
let TypeNames = ["BOOLEAN", "BIT", "CHARACTER", "INTEGER", "TIME", "NATURAL", "POSITIVE", "STRING"];
function beautify(input, settings) {
input = input.replace("\r\n", "\n");
input = input.replace("\n", "\r\n");
input = input.replace(/\r\n/g, "\n");
input = input.replace(/\n/g, "\r\n");
var arr = input.split("\r\n");
var comments = [], commentsIndex = 0;
commentsIndex = EscapeComments(arr, comments, commentsIndex);
@ -405,49 +405,44 @@ function beautifyPortGenericBlock(inputs, result, settings, startIndex, indent,
}
if (settings.SignAlignRegional) {
blockBodyStartIndex++;
SignAlignRegional(result, blockBodyStartIndex, blockBodyEndIndex);
SignsAlignRegional(result, blockBodyStartIndex, blockBodyEndIndex);
}
return i;
}
exports.beautifyPortGenericBlock = beautifyPortGenericBlock;
function SignAlignRegional(result, startIndex, endIndex) {
let maxSymbolIndex = {};
function SignsAlignRegional(result, startIndex, endIndex) {
SignAlignRegional(result, startIndex, endIndex, ":");
SignAlignRegional(result, startIndex, endIndex, ":=");
SignAlignRegional(result, startIndex, endIndex, "=>");
}
exports.SignsAlignRegional = SignsAlignRegional;
function SignAlignRegional(result, startIndex, endIndex, symbol) {
let maxSymbolIndex = -1;
let allSymbolIndex = {};
for (let i = startIndex; i <= endIndex; i++) {
let line = result[i].Line;
SetSymbolIndices(line, ":", maxSymbolIndex, allSymbolIndex, i);
SetSymbolIndices(line, ":=", maxSymbolIndex, allSymbolIndex, i);
SetSymbolIndices(line, "=>", maxSymbolIndex, allSymbolIndex, i);
}
for (let key in maxSymbolIndex) {
let maxIndex = maxSymbolIndex[key];
for (let lineIndex in allSymbolIndex[key]) {
let symbolIndex = allSymbolIndex[key][lineIndex];
if (symbolIndex == maxIndex) {
continue;
}
let line = result[lineIndex].Line;
result[lineIndex].Line = line.substring(0, symbolIndex)
+ (Array(maxIndex - symbolIndex + 1).join(" "))
+ line.substring(symbolIndex);
let regex = new RegExp("([\\s\\w]|^)" + symbol + "([\\s\\w]|$)");
let colonIndex = line.regexIndexOf(regex);
if (colonIndex > 0) {
maxSymbolIndex = Math.max(maxSymbolIndex, colonIndex);
allSymbolIndex[i] = colonIndex;
}
}
}
exports.SignAlignRegional = SignAlignRegional;
function SetSymbolIndices(line, symbol, maxSymbolIndex, allSymbolIndex, index) {
let regex = new RegExp("([\\s\\w]|^)" + symbol + "([\\s\\w]|$)");
let colonIndex = line.regexIndexOf(regex);
if (colonIndex > 0) {
if (maxSymbolIndex.hasOwnProperty(symbol)) {
maxSymbolIndex[symbol] = Math.max(maxSymbolIndex[symbol], colonIndex);
}
else {
maxSymbolIndex[symbol] = colonIndex;
allSymbolIndex[symbol] = {};
if (maxSymbolIndex < 0) {
return;
}
for (let lineIndex in allSymbolIndex) {
let symbolIndex = allSymbolIndex[lineIndex];
if (symbolIndex == maxSymbolIndex) {
continue;
}
allSymbolIndex[symbol][index] = colonIndex;
let line = result[lineIndex].Line;
result[lineIndex].Line = line.substring(0, symbolIndex)
+ (Array(maxSymbolIndex - symbolIndex + 1).join(" "))
+ line.substring(symbolIndex);
}
}
exports.SignAlignRegional = SignAlignRegional;
function beautifyCaseBlock(inputs, result, settings, startIndex, indent) {
if (!inputs[startIndex].regexStartsWith(/(.+:\s*)?(CASE)([\s]|$)/)) {
return startIndex;


+ 28
- 32
VHDLFormatter.ts View File

@ -289,8 +289,8 @@ let KeyWords: Array<string> = ["ABS", "ACCESS", "AFTER", "ALIAS", "ALL", "AND",
let TypeNames: Array<string> = ["BOOLEAN", "BIT", "CHARACTER", "INTEGER", "TIME", "NATURAL", "POSITIVE", "STRING"];
export function beautify(input: string, settings: BeautifierSettings) {
input = input.replace("\r\n", "\n");
input = input.replace("\n", "\r\n");
input = input.replace(/\r\n/g, "\n");
input = input.replace(/\n/g, "\r\n");
var arr = input.split("\r\n");
var comments = [],
commentsIndex = 0;
@ -454,47 +454,43 @@ export function beautifyPortGenericBlock(inputs: Array<string>, result: (Formatt
}
if (settings.SignAlignRegional) {
blockBodyStartIndex++;
SignAlignRegional(result, blockBodyStartIndex, blockBodyEndIndex);
SignsAlignRegional(result, blockBodyStartIndex, blockBodyEndIndex);
}
return i;
}
export function SignAlignRegional(result: (FormattedLine | FormattedLine[])[], startIndex: number, endIndex: number) {
let maxSymbolIndex = {};
export function SignsAlignRegional(result: (FormattedLine | FormattedLine[])[], startIndex: number, endIndex: number) {
SignAlignRegional(result, startIndex, endIndex, ":");
SignAlignRegional(result, startIndex, endIndex, ":=");
SignAlignRegional(result, startIndex, endIndex, "=>");
}
export function SignAlignRegional(result: (FormattedLine | FormattedLine[])[], startIndex: number, endIndex: number, symbol: string) {
let maxSymbolIndex: number = -1;
let allSymbolIndex = {};
for (let i = startIndex; i <= endIndex; i++) {
let line = (<FormattedLine>result[i]).Line;
SetSymbolIndices(line, ":", maxSymbolIndex, allSymbolIndex, i);
SetSymbolIndices(line, ":=", maxSymbolIndex, allSymbolIndex, i);
SetSymbolIndices(line, "=>", maxSymbolIndex, allSymbolIndex, i);
}
for (let key in maxSymbolIndex) {
let maxIndex = maxSymbolIndex[key];
for (let lineIndex in allSymbolIndex[key]) {
let symbolIndex = allSymbolIndex[key][lineIndex];
if (symbolIndex == maxIndex) {
continue;
}
let line = (<FormattedLine>result[lineIndex]).Line;
(<FormattedLine>result[lineIndex]).Line = line.substring(0, symbolIndex)
+ (Array(maxIndex - symbolIndex + 1).join(" "))
+ line.substring(symbolIndex);
let regex: RegExp = new RegExp("([\\s\\w]|^)" + symbol + "([\\s\\w]|$)");
let colonIndex = line.regexIndexOf(regex);
if (colonIndex > 0) {
maxSymbolIndex = Math.max(maxSymbolIndex, colonIndex);
allSymbolIndex[i] = colonIndex;
}
}
}
function SetSymbolIndices(line: string, symbol: string, maxSymbolIndex: {}, allSymbolIndex: {}, index: number) {
let regex: RegExp = new RegExp("([\\s\\w]|^)" + symbol + "([\\s\\w]|$)");
let colonIndex = line.regexIndexOf(regex);
if (colonIndex > 0) {
if (maxSymbolIndex.hasOwnProperty(symbol)) {
maxSymbolIndex[symbol] = Math.max(maxSymbolIndex[symbol], colonIndex);
}
else {
maxSymbolIndex[symbol] = colonIndex;
allSymbolIndex[symbol] = {};
if (maxSymbolIndex < 0) {
return;
}
for (let lineIndex in allSymbolIndex) {
let symbolIndex = allSymbolIndex[lineIndex];
if (symbolIndex == maxSymbolIndex) {
continue;
}
allSymbolIndex[symbol][index] = colonIndex;
let line = (<FormattedLine>result[lineIndex]).Line;
(<FormattedLine>result[lineIndex]).Line = line.substring(0, symbolIndex)
+ (Array(maxSymbolIndex - symbolIndex + 1).join(" "))
+ line.substring(symbolIndex);
}
}


+ 11
- 0
VHDLFormatterUnitTests.js View File

@ -594,6 +594,7 @@ function UnitTest() {
assert("ENTITY ARCHITECTURE", expected, actual);
IntegrationTest5();
IntegrationTest6();
IntegrationTest7();
input = 'if a(3 downto 0) > "0100" then\r\na(3 downto 0) := a(3 downto 0) + "0011" ;\r\nend if ;';
expected = 'IF a(3 DOWNTO 0) > "0100" THEN\r\n a(3 DOWNTO 0) := a(3 DOWNTO 0) + "0011";\r\nEND IF;';
actual = VHDLFormatter_1.beautify(input, settings);
@ -675,6 +676,16 @@ function IntegrationTest6() {
let actual = VHDLFormatter_1.beautify(input, settings);
assert("Sign align in PORT & new line after MAP", expected, actual);
}
function IntegrationTest7() {
let new_line_after_symbols = new VHDLFormatter_3.NewLineSettings();
new_line_after_symbols.newLineAfter = ["then", ";"];
let settings = new VHDLFormatter_4.BeautifierSettings(false, false, false, false, false, "uppercase", " ", new_line_after_symbols);
settings.SignAlignRegional = true;
let input = "entity p is\r\n generic\r\n (\r\n -- INCLK\r\n INCLK0_INPUT_FREQUENCY : natural;\r\n\r\n -- CLK1\r\n CLK1_DIVIDE_BY : natural := 1;\r\n CLK1_MULTIPLY_BY : unnatural:= 1;\r\n CLK1_PHASE_SHIFT : string := \"0\"\r\n );\r\n port\r\n (\r\n inclk0 : in std_logic := '0';\r\n c0 : out std_logic ;\r\n c1 : out std_logic \r\n );\r\nEND pll;";
let expected = "ENTITY p IS\r\n GENERIC (\r\n -- INCLK\r\n INCLK0_INPUT_FREQUENCY : NATURAL;\r\n\r\n -- CLK1\r\n CLK1_DIVIDE_BY : NATURAL := 1;\r\n CLK1_MULTIPLY_BY : unnatural := 1;\r\n CLK1_PHASE_SHIFT : STRING := \"0\"\r\n );\r\n PORT (\r\n inclk0 : IN std_logic := '0';\r\n c0 : OUT std_logic;\r\n c1 : OUT std_logic\r\n );\r\nEND pll;";
let actual = VHDLFormatter_1.beautify(input, settings);
assert("Sign align in PORT & GENERIC", expected, actual);
}
function IntegrationTest2() {
let new_line_after_symbols = new VHDLFormatter_3.NewLineSettings();
new_line_after_symbols.newLineAfter = ["then", ";"];


+ 12
- 0
VHDLFormatterUnitTests.ts View File

@ -651,6 +651,7 @@ function UnitTest() {
IntegrationTest5();
IntegrationTest6();
IntegrationTest7();
input = 'if a(3 downto 0) > "0100" then\r\na(3 downto 0) := a(3 downto 0) + "0011" ;\r\nend if ;';
expected = 'IF a(3 DOWNTO 0) > "0100" THEN\r\n a(3 DOWNTO 0) := a(3 DOWNTO 0) + "0011";\r\nEND IF;';
@ -747,6 +748,17 @@ function IntegrationTest6() {
assert("Sign align in PORT & new line after MAP", expected, actual);
}
function IntegrationTest7() {
let new_line_after_symbols: NewLineSettings = new NewLineSettings();
new_line_after_symbols.newLineAfter = ["then", ";"];
let settings: BeautifierSettings = new BeautifierSettings(false, false, false, false, false, "uppercase", " ", new_line_after_symbols);
settings.SignAlignRegional = true;
let input = "entity p is\r\n generic\r\n (\r\n -- INCLK\r\n INCLK0_INPUT_FREQUENCY : natural;\r\n\r\n -- CLK1\r\n CLK1_DIVIDE_BY : natural := 1;\r\n CLK1_MULTIPLY_BY : unnatural:= 1;\r\n CLK1_PHASE_SHIFT : string := \"0\"\r\n );\r\n port\r\n (\r\n inclk0 : in std_logic := '0';\r\n c0 : out std_logic ;\r\n c1 : out std_logic \r\n );\r\nEND pll;";
let expected = "ENTITY p IS\r\n GENERIC (\r\n -- INCLK\r\n INCLK0_INPUT_FREQUENCY : NATURAL;\r\n\r\n -- CLK1\r\n CLK1_DIVIDE_BY : NATURAL := 1;\r\n CLK1_MULTIPLY_BY : unnatural := 1;\r\n CLK1_PHASE_SHIFT : STRING := \"0\"\r\n );\r\n PORT (\r\n inclk0 : IN std_logic := '0';\r\n c0 : OUT std_logic;\r\n c1 : OUT std_logic\r\n );\r\nEND pll;";
let actual = beautify(input, settings);
assert("Sign align in PORT & GENERIC", expected, actual);
}
function IntegrationTest2() {
let new_line_after_symbols: NewLineSettings = new NewLineSettings();
new_line_after_symbols.newLineAfter = ["then", ";"];


Loading…
Cancel
Save