123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Reflection;
- #if NETSTANDARD || NETCOREAPP
- using FastReport.Code.CodeDom.Compiler;
- using FastReport.Code.CSharp;
- #else
- using System.CodeDom.Compiler;
- using Microsoft.CSharp;
- #endif
- using FastReport.Utils;
- using FastReport.Data;
- namespace FastReport.Code
- {
- internal partial class CsCodeHelper : CodeHelperBase
- {
- #region Private Methods
- private string GetEquivalentKeyword(string s)
- {
- if (s.EndsWith("[]"))
- return GetEquivalentKeyword1(s.Substring(0, s.Length - 2)) + "[]";
- return GetEquivalentKeyword1(s);
- }
- private string GetEquivalentKeyword1(string s)
- {
- switch (s)
- {
- case "Object":
- return "object";
- case "String":
- return "string";
- case "Char":
- return "char";
- case "Byte":
- return "byte";
- case "SByte":
- return "sbyte";
- case "Int16":
- return "short";
- case "UInt16":
- return "ushort";
- case "Int32":
- return "int";
- case "UInt32":
- return "uint";
- case "Int64":
- return "long";
- case "UInt64":
- return "ulong";
- case "Single":
- return "float";
- case "Double":
- return "double";
- case "Decimal":
- return "decimal";
- case "Boolean":
- return "bool";
- }
- return s;
- }
- #endregion
- #region Protected Methods
- protected override string GetTypeDeclaration(Type type)
- {
- if (type.IsGenericType)
- {
- string result = type.Name;
- result = result.Substring(0, result.IndexOf('`'));
- result += "<";
- foreach (Type elementType in type.GetGenericArguments())
- {
- result += GetTypeDeclaration(elementType) + ",";
- }
- result = result.Substring(0, result.Length - 1) + ">";
- return result;
- }
- else
- return type.Name;
- }
- #endregion
- #region Public Methods
- public override string EmptyScript()
- {
- return "using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\n" +
- "using System.ComponentModel;\r\nusing System.Windows.Forms;\r\nusing System.Drawing;\r\n" +
- "using System.Data;\r\nusing FastReport;\r\nusing FastReport.Data;\r\nusing FastReport.Dialog;\r\n" +
- "using FastReport.Barcode;\r\nusing FastReport.Table;\r\nusing FastReport.Utils;\r\n\r\n" +
- "namespace FastReport\r\n{\r\n public class ReportScript\r\n {\r\n }\r\n}\r\n";
- }
- public override int GetPositionToInsertOwnItems(string scriptText)
- {
- int pos = scriptText.IndexOf("public class ReportScript");
- if (pos == -1)
- return -1;
- return scriptText.IndexOf('{', pos) + 3;
- }
- public override string AddField(Type type, string name)
- {
- name = name.Replace(" ", "_");
- return " public " + type.FullName + " " + name + ";\r\n";
- }
- public override string BeginCalcExpression()
- {
- return " private object CalcExpression(string expression, Variant Value)\r\n {\r\n ";
- }
- public override string AddExpression(string expr, string value)
- {
- expr = expr.Replace("\\", "\\\\");
- expr = expr.Replace("\"", "\\\"");
- return "if (expression == \"" + expr + "\")\r\n return " + value + ";\r\n ";
- }
- public override string EndCalcExpression()
- {
- return "return null;\r\n }\r\n\r\n";
- }
- public override string ReplaceColumnName(string name, Type type)
- {
- string typeName = GetTypeDeclaration(type);
- string result = "((" + typeName + ")Report.GetColumnValue(\"" + name + "\"";
- result += "))";
- return result;
- }
- public override string ReplaceParameterName(Parameter parameter)
- {
- string typeName = GetTypeDeclaration(parameter.DataType);
- return "((" + typeName + ")Report.GetParameterValue(\"" + parameter.FullName + "\"))";
- }
- public override string ReplaceVariableName(Parameter parameter)
- {
- string typeName = GetTypeDeclaration(parameter.DataType);
- return "((" + typeName + ")Report.GetVariableValue(\"" + parameter.FullName + "\"))";
- }
- public override string ReplaceTotalName(string name)
- {
- return "Report.GetTotalValue(\"" + name + "\")";
- }
- public override string GenerateInitializeMethod()
- {
- Hashtable events = new Hashtable();
- string reportString = StripEventHandlers(events);
- string result = "";
- // form the InitializeComponent method
- result += " private void InitializeComponent()\r\n {\r\n ";
- // form the reportString
- result += "string reportString = \r\n ";
- int totalLength = 0;
- while (reportString.Length > 0)
- {
- string part = "";
- if (reportString.Length > 80)
- {
- part = reportString.Substring(0, 80);
- reportString = reportString.Substring(80);
- }
- else
- {
- part = reportString;
- reportString = "";
- }
- part = part.Replace("\\", "\\\\");
- part = part.Replace("\"", "\\\"");
- part = part.Replace("\r", "\\r");
- part = part.Replace("\n", "\\n");
- result += "\"" + part + "\"";
- if (reportString != "")
- {
- if (totalLength > 1024)
- {
- totalLength = 0;
- result += ";\r\n reportString += ";
- }
- else
- result += " +\r\n ";
- totalLength += part.Length;
- }
- else
- {
- result += ";\r\n ";
- }
- }
- result += "LoadFromString(reportString);\r\n ";
- result += "InternalInit();\r\n ";
- // form objects' event handlers
- foreach (DictionaryEntry de in events)
- {
- result += de.Key.ToString() + " += " + de.Value.ToString() + ";\r\n ";
- }
- result += "\r\n }\r\n\r\n";
- result += " public ReportScript()\r\n {\r\n InitializeComponent();\r\n }\r\n";
- return result;
- }
- public override string ReplaceClassName(string scriptText, string className)
- {
- return scriptText.Replace("class ReportScript", "class " + className + " : Report").Replace(
- "public ReportScript()", "public " + className + "()").Replace(
- "private object CalcExpression", "protected override object CalcExpression");
- }
- public override string GetMethodSignature(MethodInfo info, bool fullForm)
- {
- string result = info.Name + "(";
- string fontBegin = "<font color=\"Blue\">";
- string fontEnd = "</font>";
- if (fullForm)
- result = fontBegin + GetEquivalentKeyword(info.ReturnType.Name) + fontEnd + " " + result;
- System.Reflection.ParameterInfo[] pars = info.GetParameters();
- foreach (System.Reflection.ParameterInfo par in pars)
- {
- // special case - skip "thisReport" parameter
- if (par.Name == "thisReport")
- continue;
- string paramType = "";
- object[] attr = par.GetCustomAttributes(typeof(ParamArrayAttribute), false);
- if (attr.Length > 0)
- paramType = "params ";
- paramType += GetEquivalentKeyword(par.ParameterType.Name);
- result += (fullForm ? fontBegin : "") + paramType + (fullForm ? fontEnd : "");
- result += (fullForm ? " " + par.Name : "");
- #if DOTNET_4
- if (par.IsOptional && fullForm)
- result += CodeUtils.GetOptionalParameter(par, CodeUtils.Language.Cs);
- #endif
- result += ", ";
- }
- if (result.EndsWith(", "))
- result = result.Substring(0, result.Length - 2);
- result += ")";
- return result;
- }
- public override string GetMethodSignatureAndBody(MethodInfo info)
- {
- string result = info.Name + "(";
- result = " private " + GetTypeDeclaration(info.ReturnType) + " " + result;
- System.Reflection.ParameterInfo[] pars = info.GetParameters();
- foreach (System.Reflection.ParameterInfo par in pars)
- {
- // special case - skip "thisReport" parameter
- if (par.Name == "thisReport")
- continue;
- string paramType = "";
- object[] attr = par.GetCustomAttributes(typeof(ParamArrayAttribute), false);
- if (attr.Length > 0)
- paramType = "params ";
- paramType += GetTypeDeclaration(par.ParameterType);
- result += paramType;
- result += " " + par.Name;
- #if DOTNET_4
- if (par.IsOptional)
- result += CodeUtils.GetOptionalParameter(par, CodeUtils.Language.Cs);
- #endif
- result += ", ";
- }
- if (result.EndsWith(", "))
- result = result.Substring(0, result.Length - 2);
- result += ")";
- result += "\r\n";
- result += " {\r\n";
- result += " return " + info.ReflectedType.Namespace + "." +
- info.ReflectedType.Name + "." + info.Name + "(";
- foreach (System.Reflection.ParameterInfo par in pars)
- {
- string parName = par.Name;
- // special case - handle "thisReport" parameter
- if (parName == "thisReport")
- parName = "Report";
- result += parName + ", ";
- }
- if (result.EndsWith(", "))
- result = result.Substring(0, result.Length - 2);
- result += ");\r\n";
- result += " }\r\n";
- result += "\r\n";
- return result;
- }
- public override CodeDomProvider GetCodeProvider()
- {
- return new CSharpCodeProvider();
- }
- #endregion
- public CsCodeHelper(Report report) : base(report)
- {
- }
- }
- }
|