Skip to content

Commit

Permalink
If else if Else (Simple Case)
Browse files Browse the repository at this point in the history
  • Loading branch information
Albert Weinert committed Oct 26, 2021
1 parent d327ae7 commit a5fcece
Show file tree
Hide file tree
Showing 8 changed files with 318 additions and 65 deletions.
12 changes: 8 additions & 4 deletions src/Razor2Liquid/CodeReader.cs
Expand Up @@ -53,6 +53,10 @@ private void HandleKind(SyntaxNode node, ReadingContext context)
{
HandleGlobalStatement(globalStatementSyntax, context);
}
else
{
// throw new NotSupportedException($"HandleKind: {node.GetType().Name}");
}
}

void HandleCompilationUnit(CompilationUnitSyntax compilationUnit, ReadingContext context)
Expand All @@ -69,13 +73,13 @@ void HandleCompilationUnit(CompilationUnitSyntax compilationUnit, ReadingContext
}
}
}
else if (childNodes.Length != 1)
else
{
if (context.Inner.Count > 0)
while (context.Inner.Count > 0)
{
var what = context.Inner.Pop();
context.Liquid.AppendFormat("{{% end{0} %}}", what);
context.Liquid.AppendLine();
context.Liquid.AppendFormat("{{% end{0} %}}", what);
}
}
}
Expand All @@ -88,7 +92,7 @@ private void HandleGlobalStatement(GlobalStatementSyntax node, ReadingContext co
{
continue;
}

var helper = FindHelper(childNode).ToArray();
HandleCode(childNode, context);
}
Expand Down
228 changes: 185 additions & 43 deletions src/Razor2Liquid/CodeTransformer.cs
@@ -1,5 +1,7 @@
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.CompilerServices;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
Expand Down Expand Up @@ -39,6 +41,7 @@ void TransformCSharpSyntax(CSharpSyntaxNode statementSyntax)
{
var identifier = name.ToString();
}

switch (statementSyntax)
{
case ExpressionStatementSyntax expressionStatementSyntax:
Expand Down Expand Up @@ -144,6 +147,9 @@ void TransformExpression(ExpressionSyntax expressionSyntax)
case ElementAccessExpressionSyntax elementAccessExpression:
WriteElementAccessExpression(elementAccessExpression);
break;
case PrefixUnaryExpressionSyntax prefixUnaryExpression:
WritePrefixUnaryExpression(prefixUnaryExpression);
break;
case CastExpressionSyntax castExpression:
WriteCastExpression(castExpression);
break;
Expand All @@ -164,6 +170,55 @@ void TransformExpression(ExpressionSyntax expressionSyntax)
}
}

private void WritePrefixUnaryExpression(PrefixUnaryExpressionSyntax prefixUnaryExpression)
{
var kind = prefixUnaryExpression.OperatorToken.Kind();
_context.OperatorKind = kind;
TransformExpression(prefixUnaryExpression.Operand);
if (_context.Hint == ReadingHint.Expression)
{
if (prefixUnaryExpression.Operand is IdentifierNameSyntax)
{
if (kind == SyntaxKind.ExclamationToken)
{
_context.Liquid.Append(" == false");
}
else
{
_context.Liquid.Append(" == true");
}
}
else if (prefixUnaryExpression.Operand is MemberAccessExpressionSyntax)
{
if (kind == SyntaxKind.ExclamationToken)
{
_context.Liquid.Append(" == false");
}
else
{
_context.Liquid.Append(" == true");
}
}
else if (prefixUnaryExpression.Operand is InvocationExpressionSyntax invocation)
{
var argument = invocation.ArgumentList.Arguments.FirstOrDefault();
if (argument == null)
{
if (kind == SyntaxKind.ExclamationToken)
{
_context.Liquid.Append(" == false");
}
else
{
_context.Liquid.Append(" == true");
}
}
}
}

_context.OperatorKind = SyntaxKind.None;
}

void WriteCastExpression(CastExpressionSyntax castExpression)
{
var oldHint = _context.Hint;
Expand All @@ -172,10 +227,10 @@ void WriteCastExpression(CastExpressionSyntax castExpression)
_context.Hint = oldHint;
}

void WriteAsComment(ExpressionSyntax conditionalExpression)
void WriteAsComment(ExpressionSyntax conditionalExpression, [CallerMemberName] string memberName = "")
{
_context.Liquid.Append("TODO_COMMENT %}");
WriteAsComment(conditionalExpression.ToString(), conditionalExpression.GetType());
WriteAsComment(conditionalExpression.ToString(), conditionalExpression.GetType(), memberName);
}

void WriteElementAccessExpression(ElementAccessExpressionSyntax elementAccessExpression)
Expand All @@ -191,67 +246,103 @@ void HandleExpressionsStatement(ExpressionStatementSyntax expressionStatementSyn
TransformExpression(expressionStatementSyntax.Expression);
}

private void WriteIf(IfStatementSyntax ifSyntax)
private void WriteIf(IfStatementSyntax ifSyntax, bool code = true)
{
var isUnless = IsUnless(ifSyntax);
StartCode();
if (isUnless)
var cond = ifSyntax.Condition.ToString();
if (string.IsNullOrWhiteSpace(cond))
{
_context.Liquid.Append("unless ");
_context.Inner.Push("unless");
if (ifSyntax.Else != null)
{
_context.Liquid.AppendLine("");
WriteElse(ifSyntax.Else);
return;
}
}
else

if (code)
{
_context.Liquid.AppendLine("");
StartCode();
}

if (AppendIf(ifSyntax))
{
_context.Liquid.Append("if ");
_context.Inner.Push("if");
_context.Liquid.Append("if ");
}


var old = _context.Hint;
_context.Hint = ReadingHint.Expression;
if (isUnless && ifSyntax.Condition is PrefixUnaryExpressionSyntax prefix)
TransformExpression(ifSyntax.Condition);
if (code)
{
TransformExpression(prefix.Operand);
}
else
{
TransformExpression(ifSyntax.Condition);
EndCode();
}

EndCode();
TransformCSharpSyntax(ifSyntax.Statement);
_context.Liquid.AppendLine();
if (ifSyntax.Else != null)
if (code) _context.Liquid.AppendLine();
WriteElse(ifSyntax.Else);

_context.Hint = old;

bool AppendIf(IfStatementSyntax ifStatementSyntax)
{
WriteElseClause(ifSyntax.Else);
if (_context.Inner.Count > 0)
if (ifStatementSyntax.Parent is ElseClauseSyntax)
{
_context.Inner.Pop();
return false;
}

_context.Liquid.AppendLine("");
_context.Liquid.AppendLine("{% endif %}");
var condition = ifStatementSyntax.Condition.ToString();
return !string.IsNullOrWhiteSpace(condition);
}

_context.Hint = old;

bool IsUnless(IfStatementSyntax ifStatementSyntax)
void WriteElse(ElseClauseSyntax elseClauseSyntax)
{
if (ifStatementSyntax.Condition is PrefixUnaryExpressionSyntax p)
if (elseClauseSyntax != null)
{
var token = p.OperatorToken.Text;
return token == "!";
WriteElseClause(elseClauseSyntax);
// assumption that there is not markup in between, the write endif
if (elseClauseSyntax.Statement is BlockSyntax blockSyntax)
{
if (blockSyntax.Statements.Count > 0)
{
if (_context.Inner.Count > 0)
{
var what = _context.Inner.Pop();
_context.Liquid.AppendLine("");
_context.Liquid.AppendLine($"{{% end{what} %}}");
}

}
}
}

return false;
}
}

void WriteElseClause(ElseClauseSyntax elseClause)
{
var statement = false;
_context.Liquid.AppendLine("");
StartCode();
_context.Liquid.Append("else");
EndCode();
TransformCSharpSyntax(elseClause.Statement);
if (elseClause.Statement is IfStatementSyntax ifStatement)
{
_context.Liquid.Append("elsif ");
WriteIf(ifStatement, false);
statement = true;
EndCode();
_context.Liquid.AppendLine("");
}
else
{
_context.Liquid.Append("else");
EndCode();
_context.Liquid.AppendLine("");
}

if (!statement)
{
TransformCSharpSyntax(elseClause.Statement);
}
}

private void WriteForEach(ForEachStatementSyntax node)
Expand Down Expand Up @@ -343,13 +434,13 @@ private void EndCode()
}
}

void WriteAsComment(string value, Type getType = null)
void WriteAsComment(string value, Type getType = null, [CallerMemberName] string memberName = "")
{
_context.Model.Liquid.AppendLine();
_context.Model.Liquid.AppendLine("{% comment %}");
if (getType != null)
{
_context.Liquid.AppendFormat("---Expression: {0} ----", getType.Name);
_context.Liquid.AppendFormat("---Expression: {0} ---- From: {1}", getType.Name, memberName);
_context.Liquid.AppendLine();
}

Expand All @@ -374,11 +465,6 @@ bool ShouldAsComment(SyntaxNode node)
return true;
}

if (node is PrefixUnaryExpressionSyntax)
{
return true;
}


if (node is PostfixUnaryExpressionSyntax)
{
Expand Down Expand Up @@ -489,6 +575,7 @@ private void WriteInvocation(InvocationExpressionSyntax invocation)

if (name == null)
{
WriteFunctionInvocation(invocation);
return;
}

Expand Down Expand Up @@ -525,6 +612,50 @@ private void WriteInvocation(InvocationExpressionSyntax invocation)
}
}

private void WriteFunctionInvocation(InvocationExpressionSyntax invocation)
{
if (invocation.Expression is MemberAccessExpressionSyntax memberAccess)
{
var name = memberAccess.Name.ToString();
switch (name)
{
case "Equals":
{
TransformExpression(memberAccess.Expression);
if (_context.OperatorKind == SyntaxKind.ExclamationToken)
{
_context.Liquid.Append(" != ");
}
else
{
_context.Liquid.Append(" == ");
}

var argument = invocation.ArgumentList.Arguments.First();
TransformExpression(argument.Expression);
return;
}
case "ToString":
TransformExpression(memberAccess.Expression);
return;
case "IsNullOrEmpty":
{
var argument = invocation.ArgumentList.Arguments.First();
TransformExpression(argument.Expression);
_context.Liquid.Append(" | is_null_or_empty");
if (_context.OperatorKind == SyntaxKind.ExclamationToken)
{
_context.Liquid.Append(" == false");
}

return;
}
}
}

WriteAsComment(invocation);
}

void WritePartial(string partialName, InvocationExpressionSyntax invocation)
{
StartCode();
Expand All @@ -536,6 +667,7 @@ void WritePartial(string partialName, InvocationExpressionSyntax invocation)
_context.Liquid.Append(", ");
TransformExpression(argument.Expression);
}

_context.Hint = oldHint;

EndCode();
Expand Down Expand Up @@ -633,6 +765,7 @@ private void WriteTranslate(InvocationExpressionSyntax invocation, string lastFi
{
_context.Liquid.Append($" | {lastFilter}");
}

EndBars();
}

Expand Down Expand Up @@ -661,6 +794,15 @@ private void WriteBinary(BinaryExpressionSyntax binary)
{
_context.Liquid.AppendFormat(" | append: ");
}
else if (kind == SyntaxKind.BarBarToken)
{
_context.Liquid.AppendFormat(" or ");
}
else if (kind == SyntaxKind.AmpersandAmpersandToken)
{
_context.Liquid.AppendFormat(" and ");
}

else
{
_context.Liquid.AppendFormat(" {0} ", binary.OperatorToken);
Expand Down

0 comments on commit a5fcece

Please sign in to comment.