private IStatement StatementFromContext(Scope scope, DeltinScriptParser.Documented_statementContext statementContext)
        {
            switch (statementContext.statement())
            {
            case DeltinScriptParser.S_defineContext define: {
                var newVar = new ScopedVariable(scope, new DefineContextHandler(this, define.define()));
                return(new DefineAction(newVar));
            }

            case DeltinScriptParser.S_methodContext method: return(new CallMethodAction(this, scope, method.method(), false, scope));

            case DeltinScriptParser.S_varsetContext varset: return(new SetVariableAction(this, scope, varset.varset()));

            case DeltinScriptParser.S_exprContext s_expr: {
                var expr = GetExpression(scope, s_expr.expr(), true, false);
                if (expr is ExpressionTree == false || ((ExpressionTree)expr)?.Result is IStatement == false)
                {
                    if (expr != null)
                    {
                        Script.Diagnostics.Error("Expressions can't be used as statements.", DocRange.GetRange(statementContext));
                    }
                    return(null);
                }
                else
                {
                    return((ExpressionTree)expr);
                }
            }

            case DeltinScriptParser.S_ifContext s_if: return(new IfAction(this, scope, s_if.@if()));

            case DeltinScriptParser.S_whileContext s_while: return(new WhileAction(this, scope, s_while.@while()));

            case DeltinScriptParser.S_forContext s_for: return(new ForAction(this, scope, s_for.@for()));

            case DeltinScriptParser.S_for_autoContext s_forAuto: return(new AutoForAction(this, scope, s_forAuto.for_auto()));

            case DeltinScriptParser.S_foreachContext s_foreach: return(new ForeachAction(this, scope, s_foreach.@foreach()));

            case DeltinScriptParser.S_returnContext s_return: return(new ReturnAction(this, scope, s_return.@return()));

            case DeltinScriptParser.S_deleteContext s_delete: return(new DeleteAction(this, scope, s_delete.delete()));

            case DeltinScriptParser.S_continueContext s_continue: return(new ContinueAction(this, DocRange.GetRange(s_continue)));

            case DeltinScriptParser.S_breakContext s_break: return(new BreakAction(this, DocRange.GetRange(s_break)));

            case DeltinScriptParser.S_switchContext s_switch: return(new SwitchAction(this, scope, s_switch.@switch()));

            case DeltinScriptParser.S_blockContext s_block: return(new BlockAction(this, scope, s_block));

            default: return(null);
            }
        }
        /// <summary>Gets an IStatement from a StatementContext.</summary>
        /// <param name="scope">The scope the statement was created in.</param>
        /// <param name="statementContext">The context of the statement.</param>
        public IStatement GetStatement(Scope scope, DeltinScriptParser.Documented_statementContext statementContext)
        {
            IStatement statement = StatementFromContext(scope, statementContext);

            // Apply related output comment.
            if (statementContext.DOCUMENTATION() != null)
            {
                string   text  = statementContext.DOCUMENTATION().GetText().Substring(1).Trim();
                DocRange range = DocRange.GetRange(statementContext.DOCUMENTATION());
                statement.OutputComment(Script.Diagnostics, range, text);
            }

            return(statement);
        }