private void AddUnaryExprToTree(string name, string op, ESIR_UnaryExpression expr, TreeViewItem parentItem, bool postfix = false) { var niceInner = GetNiceExpr(expr.ExprInner); var concatItem = AddNodeToTree($"{name}: {(!postfix ? op : niceInner)}{(!postfix ? niceInner : op)}", parentItem); AddIRNodeToTree(expr.ExprInner, concatItem); }
private static ExpressionData CompileExpression_Unary( ref PassData passData, ref FunctionData funcData, ESIR_UnaryExpression expr ) { var innerExpr = CompileExpression(ref passData, ref funcData, expr.ExprInner); StripFirstConst(ref innerExpr); return(innerExpr.Type->TypeTag switch { ES_TypeTag.Bool => CompileExpression_UnaryBool(ref passData, expr, ref innerExpr), ES_TypeTag.Int => CompileExpression_UnaryInt(ref passData, expr, ref innerExpr), ES_TypeTag.Float => CompileExpression_UnaryFloat(ref passData, expr, ref innerExpr), ES_TypeTag.Reference => CompileExpression_UnaryRef(ref passData, expr, ref innerExpr), _ => throw new CompilationException("Binary expression not supported."), });
public static ESIR_UnaryExpression UnaryExpression(ESIR_NodeKind kind, ESIR_Expression inner) { if (kind < ESIR_NodeKind.UnaryNegative || kind > ESIR_NodeKind.UnaryPostDecrement) { throw new ArgumentOutOfRangeException(nameof(kind), "Kind is not an unary expression."); } var node = ESIR_NodeCache.Shared.TryGetNode(kind, inner, out var hash); if (node is not null) { return((ESIR_UnaryExpression)node); } var ret = new ESIR_UnaryExpression(kind, inner); if (hash >= 0) { ESIR_NodeCache.Shared.AddNode(ret, hash); } return(ret); }