public override void ExitLogStatement([NotNull] SBP.LogStatementContext context) { var stack = m_expressionData.PopStackLevel(); if (stack.Count == 0) { m_errors.InternalError(context.Start.Line, context.Start.Column, ""); return; } var exp = stack.Pop(); exp = this.ResolveIfIdentifier(exp, m_inFunctionScope); var code = exp.IsError() ? Expression.Constant("<EXPRESSION ERROR>") : exp.ExpressionCode; if (code != null) { var propertyBlock = m_lastElementPropertyBlock; var resultVar = Expression.Variable(code.Type, "logValue"); var assignVar = Expression.Assign(resultVar, code); var loggingEnabled = Expression.Property( Expression.Convert(m_currentProcedure.ContextReferenceInternal, typeof(ICallContext)), typeof(ICallContext).GetProperty("LoggingEnabled")); var logValue = code; if (code.Type != typeof(string)) { if (code.Type.IsPrimitive || code.Type.IsEnum) { logValue = Expression.Call(resultVar, typeof(object).GetMethod("ToString", new Type[] { })); } else { if (typeof(IEnumerable <string>).IsAssignableFrom(code.Type)) { #region Special handling of IEnumerable<string> var helper = typeof(ExecutionHelperMethods).GetMethod( nameof(ExecutionHelperMethods.LogList)); var helperCall = Expression.Call(helper, m_currentProcedure?.ContextReferenceInternal, logValue); var logListStatementBlock = Expression.IfThen( loggingEnabled, Expression.Block( new ParameterExpression[] { resultVar }, Expression.TryCatch( Expression.Block( assignVar, helperCall), Expression.Catch( typeof(Exception), Expression.Empty())))); m_scopeStack.Peek().AddStatementCode(logListStatementBlock); return; #endregion } else { logValue = Expression.Condition( Expression.Equal(resultVar, Expression.Constant(null)), Expression.Constant("<null>"), Expression.Call(typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string), typeof(string) }), Expression.Property( Expression.Call(resultVar, typeof(object).GetMethod("GetType", new Type[] { })), "FullName"), Expression.Constant(" - "), Expression.Call(resultVar, typeof(object).GetMethod("ToString", new Type[] { })))); } } } logValue = Expression.Call( typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }), Expression.Constant("log: "), logValue); var loggingCall = Expression.Call( m_currentProcedure.ContextReferenceInternal, typeof(IScriptCallContext).GetMethod("Log", new Type[] { typeof(string) }), logValue); var statementBlock = Expression.IfThen( loggingEnabled, Expression.Block( new ParameterExpression[] { resultVar }, Expression.TryCatch( Expression.Block( assignVar, loggingCall), Expression.Catch( typeof(Exception), Expression.Empty())))); m_scopeStack.Peek().AddStatementCode(statementBlock); } }
public override void EnterLogStatement([NotNull] SBP.LogStatementContext context) { this.AddEnterStatement(context); m_expressionData.PushStackLevel("LogStatement"); m_logStatementModifier = null; }