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.VisualBasic;
#else
using System.CodeDom.Compiler;
using Microsoft.VisualBasic;
#endif
using FastReport.Utils;
using FastReport.Data;
namespace FastReport.Code
{
internal partial class VbCodeHelper : 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 "DateTime":
return "Date";
case "Int16":
return "Short";
case "UInt16":
return "UShort";
case "Int32":
return "Integer";
case "UInt32":
return "UInteger";
case "Int64":
return "Long";
case "UInt64":
return "ULong";
}
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 += "(Of ";
foreach (Type elementType in type.GetGenericArguments())
{
result += GetTypeDeclaration(elementType) + ",";
}
result = result.Substring(0, result.Length - 1) + ")";
return result;
}
else
{
string typeName = type.Name;
typeName = typeName.Replace("[]", "()");
return typeName;
}
}
#endregion
#region Public Methods
public override string EmptyScript()
{
return
@"Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Drawing
Imports Microsoft.VisualBasic
Imports FastReport
Imports FastReport.Data
Imports FastReport.Dialog
Imports FastReport.Table
Imports FastReport.Barcode
Imports FastReport.Utils
Namespace FastReport
Public Class ReportScript
End Class
End Namespace
";
}
public override int GetPositionToInsertOwnItems(string scriptText)
{
int pos = scriptText.IndexOf("Public Class ReportScript");
if (pos == -1)
return -1;
return scriptText.IndexOf('\n', pos) + 1;
}
public override string AddField(Type type, string name)
{
name = name.Replace(" ", "_");
return " Public " + name + " as Global." + type.FullName + "\r\n";
}
public override string BeginCalcExpression()
{
return " Private Function CalcExpression(ByVal expression As String, ByVal Value as Global.FastReport.Variant) As Object\r\n ";
}
public override string AddExpression(string expr, string value)
{
expr = expr.Replace("\"", "\"\"");
return "If expression = \"" + expr + "\" Then\r\n Return " + value + "\r\n End If\r\n ";
}
public override string EndCalcExpression()
{
return "Return Nothing\r\n End Function\r\n\r\n";
}
public override string ReplaceColumnName(string name, Type type)
{
string typeName = GetTypeDeclaration(type);
string result = "CType(Report.GetColumnValue(\"" + name + "\"";
result += "), " + typeName + ")";
return result;
}
public override string ReplaceParameterName(Parameter parameter)
{
string typeName = GetTypeDeclaration(parameter.DataType);
return "CType(Report.GetParameterValue(\"" + parameter.FullName + "\"), " + typeName + ")";
}
public override string ReplaceVariableName(Parameter parameter)
{
string typeName = GetTypeDeclaration(parameter.DataType);
return "CType(Report.GetVariableValue(\"" + parameter.FullName + "\"), " + typeName + ")";
}
public override string ReplaceTotalName(string name)
{
return "Report.GetTotalValue(\"" + name + "\")";
}
public override string GenerateInitializeMethod()
{
Hashtable events = new Hashtable();
string reportString = StripEventHandlers(events);
string result = " Private Sub InitializeComponent\r\n ";
// form the reportString
result += "Dim reportString As String = _\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("\"", "\"\"").Replace("\u201c", "\"\"").Replace("\u201d", "\"\"") + "\"";
part = part.Replace("\r\n", "\" + ChrW(13) + ChrW(10) + \"");
part = part.Replace("\r", "\" + ChrW(13) + \"");
part = part.Replace("\n", "\" + ChrW(10) + \"");
result += part;
if (reportString != "")
{
if (totalLength > 1024)
{
totalLength = 0;
result += "\r\n reportString = 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 += "AddHandler " + de.Key.ToString() + ", AddressOf " +
de.Value.ToString() + "\r\n ";
}
result += "\r\n End Sub\r\n\r\n";
result += " Public Sub New()\r\n InitializeComponent()\r\n End Sub\r\n";
return result;
}
public override string ReplaceClassName(string scriptText, string className)
{
// replace the first occurence of "ReportScript"
string replace = "Class ReportScript";
int index = scriptText.IndexOf(replace);
scriptText = scriptText.Remove(index, replace.Length);
scriptText = scriptText.Insert(index, "Class " + className + "\r\n Inherits Report");
// replace other items
return scriptText.Replace("Private Function CalcExpression", "Protected Overrides Function CalcExpression");
}
public override string GetMethodSignature(MethodInfo info, bool fullForm)
{
string result = info.Name + "(";
string fontBegin = "";
string fontEnd = "";
System.Reflection.ParameterInfo[] pars = info.GetParameters();
foreach (System.Reflection.ParameterInfo par in pars)
{
// special case - skip "thisReport" parameter
if (par.Name == "thisReport")
continue;
string modifier = "ByVal";
if (par.IsOptional)
modifier = "Optional " + modifier;
object[] attr = par.GetCustomAttributes(typeof(ParamArrayAttribute), false);
if (attr.Length > 0)
modifier += " ParamArray";
result += fullForm ? fontBegin + modifier + fontEnd + " " + par.Name + " " + fontBegin + "As" + fontEnd + " " : "";
result += (fullForm ? fontBegin : "") + GetEquivalentKeyword(par.ParameterType.Name) + (fullForm ? fontEnd : "");
#if DOTNET_4
if (par.IsOptional && fullForm)
result += CodeUtils.GetOptionalParameter(par, CodeUtils.Language.Vb);
#endif
result += ", ";
}
if (result.EndsWith(", "))
result = result.Substring(0, result.Length - 2);
result += ")";
if (fullForm)
result += " " + fontBegin + "As " + info.ReturnType.Name + fontEnd;
return result;
}
public override string GetMethodSignatureAndBody(MethodInfo info)
{
string result = info.Name + "(";
result = " Private Function " + 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 parName = "_" + par.Name;
string modifier = "ByVal";
if (par.IsOptional)
modifier = "Optional " + modifier;
object[] attr = par.GetCustomAttributes(typeof(ParamArrayAttribute), false);
if (attr.Length > 0)
modifier += " ParamArray";
result += modifier + " " + parName + " As ";
result += GetTypeDeclaration(par.ParameterType);
#if DOTNET_4
if (par.IsOptional)
result += CodeUtils.GetOptionalParameter(par, CodeUtils.Language.Vb);
#endif
result += ", ";
}
if (result.EndsWith(", "))
result = result.Substring(0, result.Length - 2);
result += ")";
result += " As " + GetTypeDeclaration(info.ReturnType);
result += "\r\n";
result += " Return Global." + 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 += " End Function\r\n";
result += "\r\n";
return result;
}
public override string GetPropertySignature(PropertyInfo info, bool fullForm)
{
string result = GetEquivalentKeyword(info.PropertyType.Name) + " " + info.Name;
if (fullForm)
result += " { get;" + (info.CanWrite ? " set;" : "") + " }";
return result;
}
public override CodeDomProvider GetCodeProvider()
{
return new VBCodeProvider();
}
#endregion
public VbCodeHelper(Report report) : base(report)
{
}
}
}