Skip to content

Commit b12cc7a

Browse files
committed
Fix bug in unparser
1 parent c07a77d commit b12cc7a

File tree

1 file changed

+44
-24
lines changed

1 file changed

+44
-24
lines changed

src/prometheus/unparser.lua

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ function Unparser:isValidIdentifier(source)
5858
if(string.find(source, self.numberPattern)) then
5959
return false;
6060
end
61+
if self.keywordsLookup[source] then
62+
return false;
63+
end
6164
return #source > 0;
6265
end
6366

@@ -117,12 +120,19 @@ function Unparser:unparseBlock(block, tabbing)
117120
for i, statement in ipairs(block.statements) do
118121
if(statement.kind ~= AstKind.NopStatement) then
119122
local statementCode = self:unparseStatement(statement, tabbing);
120-
if(#code > 0 and string.sub(statementCode, 1, 1) == "(") then
123+
if(not self.prettyPrint and #code > 0 and string.sub(statementCode, 1, 1) == "(") then
121124
-- This is so that the following works:
122125
-- print("Test");(function() print("Test2") end)();
123126
statementCode = ";" .. statementCode;
124127
end
125-
code = code .. self:whitespaceIfNeeded2(code, self:whitespaceIfNeeded(statementCode, self:newline(true))) .. statementCode;
128+
local ws = self:whitespaceIfNeeded2(code, self:whitespaceIfNeeded(statementCode, self:newline(true)));
129+
if i ~= 1 then
130+
code = code .. ws;
131+
end
132+
if(self.prettyPrint) then
133+
statementCode = statementCode .. ";"
134+
end
135+
code = code .. statementCode;
126136
end
127137
end
128138

@@ -145,7 +155,7 @@ function Unparser:unparseStatement(statement, tabbing)
145155
elseif(statement.kind == AstKind.DoStatement) then
146156
local bodyCode = self:unparseBlock(statement.body, tabbing);
147157
code = "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
148-
.. bodyCode
158+
.. bodyCode .. self:newline(false)
149159
.. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
150160

151161
-- While Statement
@@ -157,7 +167,7 @@ function Unparser:unparseStatement(statement, tabbing)
157167

158168
code = "while" .. self:whitespaceIfNeeded(expressionCode) .. expressionCode .. self:whitespaceIfNeeded2(expressionCode)
159169
.. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
160-
.. bodyCode
170+
.. bodyCode .. self:newline(false)
161171
.. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
162172

163173
-- Repeat Until Statement
@@ -181,7 +191,7 @@ function Unparser:unparseStatement(statement, tabbing)
181191

182192
local incrementByCode = statement.incrementBy and self:unparseExpression(statement.incrementBy, tabbing) or "1";
183193
code = code .. self:optionalWhitespace() .. incrementByCode .. self:whitespaceIfNeeded2(incrementByCode) .. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
184-
.. bodyCode
194+
.. bodyCode .. self:newline(false)
185195
.. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
186196

187197

@@ -208,7 +218,7 @@ function Unparser:unparseStatement(statement, tabbing)
208218

209219
local bodyCode = self:unparseBlock(statement.body, tabbing);
210220
code = code .. self:whitespaceIfNeeded2(code) .. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
211-
.. bodyCode
221+
.. bodyCode .. self:newline(false)
212222
.. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
213223

214224

@@ -223,18 +233,18 @@ function Unparser:unparseStatement(statement, tabbing)
223233
for i, eif in ipairs(statement.elseifs) do
224234
exprcode = self:unparseExpression(eif.condition, tabbing);
225235
bodyCode = self:unparseBlock(eif.body, tabbing);
226-
code = code .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "elseif" .. self:whitespaceIfNeeded(exprcode) .. exprcode .. self:whitespaceIfNeeded2(exprcode)
236+
code = code .. self:newline(false) .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "elseif" .. self:whitespaceIfNeeded(exprcode) .. exprcode .. self:whitespaceIfNeeded2(exprcode)
227237
.. "then" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
228238
.. bodyCode;
229239
end
230240

231241
if(statement.elsebody) then
232242
bodyCode = self:unparseBlock(statement.elsebody, tabbing);
233-
code = code .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "else" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
243+
code = code .. self:newline(false) .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "else" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
234244
.. bodyCode;
235245
end
236246

237-
code = code .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
247+
code = code .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
238248

239249

240250
-- Function Declaration
@@ -259,7 +269,7 @@ function Unparser:unparseStatement(statement, tabbing)
259269
code = code .. ")";
260270

261271
local bodyCode = self:unparseBlock(statement.body, tabbing);
262-
code = code .. self:newline(false) .. self:tabs(tabbing) .. bodyCode .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
272+
code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
263273

264274

265275
-- Local Function Declaration
@@ -280,7 +290,7 @@ function Unparser:unparseStatement(statement, tabbing)
280290
code = code .. ")";
281291

282292
local bodyCode = self:unparseBlock(statement.body, tabbing);
283-
code = code .. self:newline(false) .. self:tabs(tabbing) .. bodyCode .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
293+
code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
284294

285295
-- Local Variable Declaration
286296
elseif(statement.kind == AstKind.LocalVariableDeclaration) then
@@ -292,16 +302,14 @@ function Unparser:unparseStatement(statement, tabbing)
292302
end
293303
code = code .. statement.scope:getVariableName(id);
294304
end
295-
296-
code = code .. self:optionalWhitespace();
297-
305+
298306
if(#statement.expressions > 0) then
299-
code = code.. "=" .. self:optionalWhitespace();
307+
code = code .. self:optionalWhitespace() .. "=" .. self:optionalWhitespace();
300308
for i, expr in ipairs(statement.expressions) do
301309
if i > 1 then
302310
code = code .. "," .. self:optionalWhitespace();
303311
end
304-
code = code .. self:unparseExpression(expr, tabbing);
312+
code = code .. self:unparseExpression(expr, tabbing + 1);
305313
end
306314
end
307315
-- Function Call Statement
@@ -359,7 +367,7 @@ function Unparser:unparseStatement(statement, tabbing)
359367
if i > 1 then
360368
code = code .. "," .. self:optionalWhitespace();
361369
end
362-
code = code .. self:unparseExpression(expr, tabbing);
370+
code = code .. self:unparseExpression(expr, tabbing + 1);
363371
end
364372

365373
-- Return Statement
@@ -715,9 +723,7 @@ function Unparser:unparseExpression(expression, tabbing)
715723

716724
-- Identifier Indexing e.g: x.y instead of x["y"];
717725
if(expression.index.kind == AstKind.StringExpression and self:isValidIdentifier(expression.index.value)) then
718-
if(not self.keywordsLookup[expression.index.value]) then
719-
return base .. "." .. expression.index.value;
720-
end
726+
return base .. "." .. expression.index.value;
721727
end
722728

723729
-- Index never needs parens
@@ -772,7 +778,7 @@ function Unparser:unparseExpression(expression, tabbing)
772778

773779
k = AstKind.FunctionLiteralExpression;
774780
if(expression.kind == k) then
775-
code = "function" .. self:optionalWhitespace() .. "(";
781+
code = "function" .. "(";
776782

777783
for i, arg in ipairs(expression.args) do
778784
if i > 1 then
@@ -787,21 +793,31 @@ function Unparser:unparseExpression(expression, tabbing)
787793
code = code .. ")";
788794

789795
local bodyCode = self:unparseBlock(expression.body, tabbing);
790-
code = code .. self:newline(false) .. self:tabs(tabbing) .. bodyCode .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
796+
code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
791797
return code;
792798
end
793799

794800
k = AstKind.TableConstructorExpression;
795801
if(expression.kind == k) then
802+
if(#expression.entries == 0) then return "{}" end;
803+
804+
local inlineTable = #expression.entries <= 3;
796805
local tableTabbing = tabbing + 1;
797806

798-
code = "{" .. self:optionalWhitespace(self:newline() .. self:tabs(tableTabbing));
807+
code = "{";
808+
if inlineTable then
809+
code = code .. self:optionalWhitespace();
810+
else
811+
code = code .. self:optionalWhitespace(self:newline() .. self:tabs(tableTabbing));
812+
end
799813

800814
local p = false;
801815
for i, entry in ipairs(expression.entries) do
802816
p = true;
803-
if i > 1 then
817+
if i > 1 and not inlineTable then
804818
code = code .. "," .. self:optionalWhitespace(self:newline() .. self:tabs(tableTabbing));
819+
elseif i > 1 then
820+
code = code .. "," .. self:optionalWhitespace();
805821
end
806822
if(entry.kind == AstKind.KeyedTableEntry) then
807823
if(entry.key.kind == AstKind.StringExpression and self:isValidIdentifier(entry.key.value)) then
@@ -814,6 +830,10 @@ function Unparser:unparseExpression(expression, tabbing)
814830
code = code .. self:unparseExpression(entry.value, tableTabbing);
815831
end
816832
end
833+
834+
if inlineTable then
835+
return code .. self:optionalWhitespace() .. "}";
836+
end
817837

818838
return code .. self:optionalWhitespace((p and "," or "") .. self:newline() .. self:tabs(tabbing)) .. "}";
819839
end

0 commit comments

Comments
 (0)