Skip to content

Commit

Permalink
A lot improved indentations etc
Browse files Browse the repository at this point in the history
  • Loading branch information
rappen committed Dec 21, 2022
1 parent fa52c64 commit ea20520
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 180 deletions.
119 changes: 74 additions & 45 deletions FetchXmlBuilder/Converters/CSharpCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
using Rappen.XTB.FetchXmlBuilder.Settings;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace Rappen.XTB.FetchXmlBuilder.Converters
{
Expand All @@ -17,6 +19,7 @@ public class CSharpCodeGenerator
internal QueryExpression qex;
internal List<EntityMetadata> metas;
internal CodeGenerators settings;
private readonly string separators;
internal Dictionary<string, string> entityaliases;

public static string GetCSharpQueryExpression(QueryExpression QEx, List<EntityMetadata> entities, FXBSettings settings)
Expand Down Expand Up @@ -46,6 +49,7 @@ private CSharpCodeGenerator(QueryExpression QEx, List<EntityMetadata> entities,
metas = entities;
qex = QEx;
settings = fxbsettings.CodeGenerators;
separators = settings.ObjectInitializer ? $",{CRLF}" : $"{CRLF}";
StoreLinkEntityAliases(qex.LinkEntities);
}

Expand Down Expand Up @@ -156,7 +160,7 @@ internal string GetCodeParametersMaxWidth(int maxwidth, int indents, bool withne
return result;
}

internal string GetColumns(string entity, ColumnSet columns, string LineStart, int indents = 1)
internal string GetColumns(string entity, ColumnSet columns, string LineStart, int indents)
{
var code = new StringBuilder();
if (columns.AllColumns)
Expand Down Expand Up @@ -201,33 +205,33 @@ internal string GetColumns(string entity, ColumnSet columns, string LineStart, i
break;

default:
LineStart = $"{Indent(indents)}new ColumnSet(";
LineStart = $"new ColumnSet(";
break;
}
break;

default:
LineStart = "ColumnSet = new ColumnSet(";
LineStart += " = new ColumnSet(";
break;
}
}
else
{
LineStart += ".AddColumn" + (columns.Columns.Count > 1 ? "s" : "") + "(";
}
var colsEB = GetCodeParametersMaxWidth(120 - LineStart.Length, indents, true, columns.Columns.Select(c => GetCodeAttribute(entity, c)).ToArray());
var colsEB = GetCodeParametersMaxWidth(120 - LineStart.Length, indents + 1, false, columns.Columns.Select(c => GetCodeAttribute(entity, c)).ToArray());
var muliplerows = colsEB.Contains(CRLF);
code.Append(LineStart + colsEB);
code.Append(Indent(indents) + LineStart + colsEB);
if (settings.ObjectInitializer)
{
switch (settings.QExFlavor)
{
case QExFlavorEnum.EarlyBound:
code.Append(" }");
code.Append(muliplerows ? $"{CRLF}{Indent(indents)}}}" : " }");
break;

default:
code.Append(")");
code.Append(muliplerows ? $"{CRLF}{Indent(indents)})" : ")");
break;
}
}
Expand All @@ -251,22 +255,21 @@ private string GetFilters(string entity, FilterExpression filter, string ownerNa
var filterscode = "";
if (settings.ObjectInitializer)
{
filterscode = $"{CRLF}{Indent(indentslevel)}Filters = // Filters{CRLF}{Indent(indentslevel)}{{{CRLF}";
filterscode = $"{Indent(indentslevel)}Filters = // Filters{CRLF}{Indent(indentslevel++)}{{{CRLF}";
}
foreach (var filteritem in filters)
{
filtercodes.Add(GetFilter(entity, filteritem, filter.FilterHint ?? ownerName, ParentFilterType.Filters, indentslevel, several));
}
var separators = settings.ObjectInitializer ? "," : string.Empty;
filterscode += string.Join($"{separators}{CRLF}", filtercodes.Where(f => !string.IsNullOrWhiteSpace(f)));
filterscode += string.Join(separators, filtercodes.Where(f => !string.IsNullOrWhiteSpace(f)));
if (settings.ObjectInitializer)
{
filterscode += $"{CRLF}{Indent(indentslevel)}}} // Filters";
filterscode += $"{CRLF}{Indent(--indentslevel)}}} // Filters";
}
return filterscode;
}

internal string GetFilter(string entity, FilterExpression filter, string ownerName, ParentFilterType ownerType, int indentslevel = 0, bool several = false)
internal string GetFilter(string entity, FilterExpression filter, string ownerName, ParentFilterType ownerType, int indentslevel, bool several = false)
{
if (filter == null || (!filter.Conditions.Any() && !filter.Filters.Any()))
{
Expand Down Expand Up @@ -296,41 +299,27 @@ internal string GetFilter(string entity, FilterExpression filter, string ownerNa
default:
if (ownerType == ParentFilterType.Filters)
{
code.Append($"{Indent(++indentslevel)}new FilterExpression({(filter.FilterOperator == LogicalOperator.Or ? "LogicalOperator.Or" : "")}) // Filter new{CRLF}{Indent(indentslevel)}{{{CRLF}");
code.Append($"{Indent(indentslevel)}new FilterExpression({(filter.FilterOperator == LogicalOperator.Or ? "LogicalOperator.Or" : "")}) // Filter new{CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
else
{
code.Append($"{Indent(indentslevel++)}{ownerType} = // Filter type{CRLF}{Indent(indentslevel)}{{{CRLF}");
}
if (filter.Conditions.Any())
{
code.Append($"{Indent(++indentslevel)}Conditions = // Filter conds{CRLF}{Indent(indentslevel)}{{{CRLF}");
code.Append($"{Indent(indentslevel)}{ownerType} = // Filter type{CRLF}{Indent(indentslevel++)}{{{CRLF}");
}
break;
}
}
code.Append(GetConditions(entity, filter, indentslevel));
if (settings.ObjectInitializer)
var filtercode = new List<string>
{
switch (settings.QExStyle)
{
default:
code.Append($"{CRLF}{Indent(indentslevel--)}}}");
if (filter.Filters.Any())
{
code.Append(",");
}
code.Append(" // Filter conds");
break;
}
}
code.Append(GetFilters(entity, filter, ownerName, ownerType, indentslevel + 1));
GetConditions(entity, filter, indentslevel),
GetFilters(entity, filter, ownerName, ownerType, indentslevel)
};
code.Append(string.Join(separators, filtercode.Where(f => !string.IsNullOrEmpty(f))));
if (settings.ObjectInitializer)
{
switch (settings.QExStyle)
{
default:
code.Append($"{CRLF}{Indent(indentslevel--)}}}, // Filter new");
code.Append($"{CRLF}{Indent(--indentslevel)}}} /* Filter new */");
break;
}
}
Expand All @@ -349,6 +338,15 @@ private string GetConditions(string entity, FilterExpression filter, int indents
code.AppendLine();
code.AppendLine("// Add conditions " + filter.FilterHint);
}
if (settings.ObjectInitializer)
{
switch (settings.QExStyle)
{
default:
code.Append($"{Indent(indentslevel)}Conditions = // Filter conds{CRLF}{Indent(indentslevel++)}{{{CRLF}");
break;
}
}
var conditionscode = new List<string>();
foreach (var cond in filter.Conditions)
{
Expand All @@ -372,24 +370,55 @@ private string GetConditions(string entity, FilterExpression filter, int indents
}
}
var attributename = GetCodeAttribute(filterentity, cond.AttributeName);
if (settings.ObjectInitializer && settings.QExStyle == QExStyleEnum.QueryExpressionFactory &&
string.IsNullOrWhiteSpace(entityalias) &&
cond.Operator == ConditionOperator.Equal && cond.Values?.Count == 1)
{
conditionscode.Add($"{Indent(indentslevel)}{attributename}{values}");
}
else if (settings.ObjectInitializer)
if (settings.ObjectInitializer)
{
conditionscode.Add($"{Indent(indentslevel)}new ConditionExpression({entityalias}{attributename}, ConditionOperator.{cond.Operator}{values})");
if (settings.QExStyle == QExStyleEnum.QueryExpressionFactory &&
string.IsNullOrWhiteSpace(entityalias) &&
cond.Operator == ConditionOperator.Equal && cond.Values?.Count == 1)
{
conditionscode.Add($"{Indent(indentslevel)}{attributename}{values}");
}
else
{
conditionscode.Add($"{Indent(indentslevel)}new ConditionExpression({entityalias}{attributename}, ConditionOperator.{cond.Operator}{values})");
}
}
else
{
conditionscode.Add($"{filter.FilterHint}.AddCondition({entityalias}{attributename}, ConditionOperator.{cond.Operator}{values});");
}
}
var separators = settings.ObjectInitializer ? "," : string.Empty;
var indentcounts = settings.ObjectInitializer ? 1 : 0;
code.Append(Indent(indentcounts) + string.Join($"{separators}{CRLF}{Indent(indentcounts)}", conditionscode));
code.Append(string.Join(separators, conditionscode));
if (settings.ObjectInitializer)
{
switch (settings.QExStyle)
{
default:
code.Append($"{CRLF}{Indent(--indentslevel)}}} /* Filter conds */");
break;
}
}
return code.ToString();
}

internal string GetOrders(string entityname, DataCollection<OrderExpression> orders, string ownerName, int indentslevel, bool root = false)
{
if (orders.Count == 0)
{
return string.Empty;
}
var code = new StringBuilder();
if (settings.IncludeComments)
{
code.AppendLine();
code.AppendLine("// Add orders");
}
ownerName += root ? ".AddOrder(" : ".Orders.Add(new OrderExpression(";
var LineEnd = root ? ");" : "));";
foreach (var order in orders)
{
code.AppendLine(ownerName + GetCodeAttribute(entityname, order.AttributeName) + ", OrderType." + order.OrderType.ToString() + LineEnd);
}
return code.ToString();
}

Expand Down
60 changes: 14 additions & 46 deletions FetchXmlBuilder/Converters/QExFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@ namespace Cinteros.Xrm.FetchXmlBuilder.Converters
internal class QExFactory
{
private readonly CSharpCodeGenerator gen;
private readonly bool objectini;
private readonly bool comments;
private readonly string CRLF;
private Dictionary<string, string> entityaliases;

internal QExFactory(CSharpCodeGenerator generator)
{
gen = generator ?? throw new ArgumentNullException(nameof(generator));
objectini = gen.settings.ObjectInitializer;
comments = gen.settings.IncludeComments;
CRLF = CSharpCodeGenerator.CRLF;
}
Expand All @@ -33,13 +31,6 @@ private string CreateCode(QueryExpression qex)
var code = new StringBuilder();
var qename = gen.GetVarName("qefactory");
code.Append(GetQueryCodeStart(qename, qex));
if (!objectini)
{
code.Append(gen.GetColumns(qex.EntityName, qex.ColumnSet, qename));
code.Append(gen.GetFilter(qex.EntityName, qex.Criteria, qename, ParentFilterType.Criteria));
code.Append(GetOrders(qex.EntityName, qex.Orders, qename, true));
code.Append(GetLinkEntities(qex.LinkEntities, qename));
}
var codestr = gen.ReplaceValueTokens(code.ToString());
return codestr;
}
Expand All @@ -51,27 +42,25 @@ private string GetQueryCodeStart(string qename, QueryExpression qex)
{
querycode += "// Instantiate QueryExpressionFactory " + qename + CRLF;
}
var objinicode = new List<string>
{
gen.GetColumns(qex.EntityName, qex.ColumnSet, "ColumnSet", 1),
gen.GetFilter(qex.EntityName, qex.Criteria, qename, ParentFilterType.Criteria, 1),
//gen.GetOrders(qex.EntityName, qex.Orders, qename, 1, true),
//GetLinkEntities(qex.LinkEntities, qename)
}.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();

var insidecode = string.Join($",{CRLF}", objinicode);
switch (gen.settings.QExFlavor)
{
case QExFlavorEnum.EarlyBound:
querycode += $"var {qename} = QueryExpressionFactory.Create<{gen.GetCodeEntity(qex.EntityName)}>(";
querycode += $"var {qename} = QueryExpressionFactory.Create<{gen.GetCodeEntity(qex.EntityName)}>({CRLF}{insidecode});";
break;

default:
querycode += $"var {qename} = QueryExpressionFactory.Create({gen.GetCodeEntity(qex.EntityName)}";
querycode += $"var {qename} = QueryExpressionFactory.Create({gen.GetCodeEntity(qex.EntityName)},{CRLF}{insidecode});";
break;
}

if (objectini)
{
var objinicode = new List<string>();
objinicode.Add(gen.GetColumns(qex.EntityName, qex.ColumnSet, "ColumnSet", 2));
objinicode.Add(gen.GetFilter(qex.EntityName, qex.Criteria, qename, ParentFilterType.Criteria));
objinicode.Add(GetOrders(qex.EntityName, qex.Orders, qename, true));
objinicode.Add(GetLinkEntities(qex.LinkEntities, qename));
querycode += $",{CRLF}" + string.Join($",{CRLF}", objinicode.Where(o => !string.IsNullOrWhiteSpace(o)));
}
querycode += $"){gen.GetQueryOptions(qex, qename)};{CRLF}";
return querycode;
}

Expand Down Expand Up @@ -108,33 +97,12 @@ private string GetLinkEntities(DataCollection<LinkEntity> linkEntities, string L
entityaliases.Add(link.EntityAlias, link.LinkToEntityName);
code.AppendLine(linkname + ".EntityAlias = \"" + link.EntityAlias + "\";");
}
code.Append(gen.GetColumns(link.LinkToEntityName, link.Columns, linkname + ".Columns"));
code.Append(gen.GetFilter(link.LinkToEntityName, link.LinkCriteria, linkname, ParentFilterType.LinkCriteria));
code.Append(GetOrders(link.LinkToEntityName, link.Orders, linkname));
code.Append(gen.GetColumns(link.LinkToEntityName, link.Columns, linkname + ".Columns", 1));
code.Append(gen.GetFilter(link.LinkToEntityName, link.LinkCriteria, linkname, ParentFilterType.LinkCriteria, 1));
code.Append(gen.GetOrders(link.LinkToEntityName, link.Orders, linkname, 1));
code.Append(GetLinkEntities(link.LinkEntities, linkname));
}
return code.ToString();
}

private string GetOrders(string entityname, DataCollection<OrderExpression> orders, string LineStart, bool root = false)
{
if (orders.Count == 0)
{
return string.Empty;
}
var code = new StringBuilder();
if (comments)
{
code.AppendLine();
code.AppendLine("// Add orders");
}
LineStart += root ? ".AddOrder(" : ".Orders.Add(new OrderExpression(";
var LineEnd = root ? ");" : "));";
foreach (var order in orders)
{
code.AppendLine(LineStart + gen.GetCodeAttribute(entityname, order.AttributeName) + ", OrderType." + order.OrderType.ToString() + LineEnd);
}
return code.ToString();
}
}
}
Loading

0 comments on commit ea20520

Please sign in to comment.