From 0b7114d35e5316ca8a432fe21d7ee2afb3dc1983 Mon Sep 17 00:00:00 2001 From: TechHog8984 <=> Date: Tue, 15 Jul 2025 20:19:11 -0400 Subject: [PATCH 1/2] add parenthesis to vararg expression when it's the base of an index expression; add parser support for Luau if/else expression (no compiler support) --- src/prometheus/ast.lua | 13 ++++++++++++- src/prometheus/parser.lua | 15 ++++++++++++++- src/prometheus/unparser.lua | 17 ++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/prometheus/ast.lua b/src/prometheus/ast.lua index 2229ae8..86bb7a9 100644 --- a/src/prometheus/ast.lua +++ b/src/prometheus/ast.lua @@ -76,6 +76,8 @@ local AstKind = { -- Misc NopStatement = "NopStatement"; + + IfElseExpression = "IfElseExpression"; } local astKindExpressionLookup = { @@ -144,6 +146,15 @@ function Ast.NopStatement() } end +function Ast.IfElseExpression(condition, true_value, false_value) + return { + kind = AstKind.IfElseExpression, + condition = condition, + true_value = true_value, + false_value = false_value + } +end + -- Create Ast Top Node function Ast.TopNode(body, globalScope) return { @@ -789,4 +800,4 @@ end -return Ast; \ No newline at end of file +return Ast; diff --git a/src/prometheus/parser.lua b/src/prometheus/parser.lua index 7562fa2..1594b2f 100644 --- a/src/prometheus/parser.lua +++ b/src/prometheus/parser.lua @@ -928,6 +928,19 @@ function Parser:expressionLiteral(scope) local scope, id = scope:resolve(name); return Ast.VariableExpression(scope, id); end + + -- IfElse + if(LuaVersion.LuaU) then + if(consume(self, TokenKind.Keyword, "if")) then + local condition = self:expression(scope); + expect(self, TokenKind.Keyword, "then"); + local true_value = self:expression(scope); + expect(self, TokenKind.Keyword, "else"); + local false_value = self:expression(scope); + + return Ast.IfElseExpression(condition, true_value, false_value); + end + end if(self.disableLog) then error() end logger:error(generateError(self, "Unexpected Token \"" .. peek(self).source .. "\". Expected a Expression!")) @@ -966,4 +979,4 @@ function Parser:tableConstructor(scope) return Ast.TableConstructorExpression(entries); end -return Parser \ No newline at end of file +return Parser diff --git a/src/prometheus/unparser.lua b/src/prometheus/unparser.lua index 1db938d..b32e98f 100644 --- a/src/prometheus/unparser.lua +++ b/src/prometheus/unparser.lua @@ -738,7 +738,7 @@ function Unparser:unparseExpression(expression, tabbing) k = AstKind.IndexExpression; if(expression.kind == k or expression.kind == AstKind.AssignmentIndexing) then local base = self:unparseExpression(expression.base, tabbing); - if(Ast.astKindExpressionToNumber(expression.base.kind) > Ast.astKindExpressionToNumber(k)) then + if(expression.base.kind == AstKind.VarargExpression or Ast.astKindExpressionToNumber(expression.base.kind) > Ast.astKindExpressionToNumber(k)) then base = "(" .. base .. ")"; end @@ -860,6 +860,21 @@ function Unparser:unparseExpression(expression, tabbing) return code .. self:optionalWhitespace((p and "," or "") .. self:newline() .. self:tabs(tabbing)) .. "}"; end + if (self.luaVersion == LuaVersion.LuaU) then + k = AstKind.IfElseExpression + if(expression.kind == k) then + code = "if "; + + code = code .. self:unparseExpression(expression.condition); + code = code .. " then "; + code = code .. self:unparseExpression(expression.true_value); + code = code .. " else "; + code = code .. self:unparseExpression(expression.false_value); + + return code + end + end + logger:error(string.format("\"%s\" is not a valid unparseable expression", expression.kind)); end From 2d169bcd1fbff6b06a1c773954091a5a0f543b8f Mon Sep 17 00:00:00 2001 From: TechHog8984 <=> Date: Tue, 15 Jul 2025 20:23:38 -0400 Subject: [PATCH 2/2] add visit branch for IfElseExpression --- src/prometheus/visitast.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/prometheus/visitast.lua b/src/prometheus/visitast.lua index d4dcc5f..847bf49 100644 --- a/src/prometheus/visitast.lua +++ b/src/prometheus/visitast.lua @@ -235,6 +235,11 @@ function visitExpression(expression, previsit, postvisit, data) expression.base = visitExpression(expression.base, previsit, postvisit, data); expression.index = visitExpression(expression.index, previsit, postvisit, data); end + if(expression.kind == AstKind.IfElseExpression) then + expression.condition = visitExpression(expression.condition, previsit, postvisit, data); + expression.true_expr = visitExpression(expression.true_expr, previsit, postvisit, data); + expression.false_expr = visitExpression(expression.false_expr, previsit, postvisit, data); + end if(type(postvisit) == "function") then expression = postvisit(expression, data) or expression; @@ -242,4 +247,4 @@ function visitExpression(expression, previsit, postvisit, data) return expression; end -return visitAst; \ No newline at end of file +return visitAst;