From 760d4e69db247f2c1becd409af8b0841ee7a6a13 Mon Sep 17 00:00:00 2001 From: g2384 Date: Mon, 12 Feb 2018 23:24:39 +0000 Subject: [PATCH] refactor --- VHDLFormatter.js | 61 ++++++++++++++++++--------------------- VHDLFormatter.ts | 60 ++++++++++++++++++-------------------- VHDLFormatterUnitTests.js | 11 +++++++ VHDLFormatterUnitTests.ts | 12 ++++++++ 4 files changed, 79 insertions(+), 65 deletions(-) diff --git a/VHDLFormatter.js b/VHDLFormatter.js index 6b7e15a..f15c369 100644 --- a/VHDLFormatter.js +++ b/VHDLFormatter.js @@ -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; diff --git a/VHDLFormatter.ts b/VHDLFormatter.ts index d6003d3..0c18286 100644 --- a/VHDLFormatter.ts +++ b/VHDLFormatter.ts @@ -289,8 +289,8 @@ let KeyWords: Array = ["ABS", "ACCESS", "AFTER", "ALIAS", "ALL", "AND", let TypeNames: Array = ["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, 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 = (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: 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 = (result[lineIndex]).Line; + (result[lineIndex]).Line = line.substring(0, symbolIndex) + + (Array(maxSymbolIndex - symbolIndex + 1).join(" ")) + + line.substring(symbolIndex); } } diff --git a/VHDLFormatterUnitTests.js b/VHDLFormatterUnitTests.js index bb6265c..1e582a2 100644 --- a/VHDLFormatterUnitTests.js +++ b/VHDLFormatterUnitTests.js @@ -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", ";"]; diff --git a/VHDLFormatterUnitTests.ts b/VHDLFormatterUnitTests.ts index 0d3aa8f..b7969b4 100644 --- a/VHDLFormatterUnitTests.ts +++ b/VHDLFormatterUnitTests.ts @@ -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", ";"];