Skip to content

Commit

Permalink
Added ruleset logic to the DepthSolver. Added DepthSolver to Custom E…
Browse files Browse the repository at this point in the history
…xpressions
  • Loading branch information
OmarElabd committed Apr 11, 2015
1 parent ee12ea5 commit 3e18a8a
Show file tree
Hide file tree
Showing 14 changed files with 300 additions and 181 deletions.
1 change: 0 additions & 1 deletion ObjectExporter.Core/ExportGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ public class ExportGenerator
_expressionsWithSources = expressionsWithSources;
_maxDepth = exportParamaters.MaxDepth;


List<IRuleSet> ruleSets = new List<IRuleSet>();
if (exportParamaters.ExcludePropertiesNotInClass)
{
Expand Down
27 changes: 24 additions & 3 deletions ObjectExporter.Core/Models/ObjectDepthFinder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Threading;
using System.Threading.Tasks;
using EnvDTE;
using ObjectExporter.Core.Models.RuleSets;
using ObjectExporter.Core.Templates;

namespace ObjectExporter.Core.Models
Expand All @@ -13,10 +14,12 @@ public class ObjectDepthFinder
{
private int _maxDepth = 0;

private readonly RuleSetValidator _ruleSetValidator;
private readonly uint _cutoff;

public ObjectDepthFinder(uint cutoff = 100)
public ObjectDepthFinder(RuleSetValidator ruleSetValidator, uint cutoff = 100)
{
_ruleSetValidator = ruleSetValidator;
_cutoff = cutoff;
}

Expand All @@ -29,12 +32,25 @@ public int GetMaximumObjectDepth(Expression expression)
public Task<int> GetMaximumObjectDepthAsync(Expression expression, CancellationToken token)
{
_maxDepth = 0;

return Task.Run(() => GetMaxObjectDepth(expression, 0), token);
}

private int GetMaxObjectDepth(Expression expression, int currentDepth)
{
string expressionType = GeneratorHelper.StripObjectReference(expression.Type);
string expressionType;

if (currentDepth == 0) //if is root element
{
//Frameworks can add theType { dynamicType} - strip out the {dynamic type}
expressionType = GeneratorHelper.StripChildReference(expression.Type);
}
else
{
//members of objects have a type of: object { theType } - strip out object { }
expressionType = GeneratorHelper.StripObjectReference(expression.Type);
}


//No members and can't be resolved to a single type (equivalent of having no members)
if (expression.DataMembers.Count > 0 && GeneratorHelper.IsSerializable(expression.Name) &&
Expand All @@ -60,7 +76,12 @@ private int GetMaxObjectDepth(Expression expression, int currentDepth)
_maxDepth = currentDepth;
}

GetMaxObjectDepth(currentMember, currentDepth + 1);
bool isValid = _ruleSetValidator.ValidateAllSubRules(expressionType, currentMember.Name);

if (isValid)
{
GetMaxObjectDepth(currentMember, currentDepth + 1);
}
}
}
}
Expand Down
64 changes: 31 additions & 33 deletions ObjectExporter.Core/Templates/CSharpGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@ public virtual string TransformText()

bool isFirstElement = true;

public void ExportMembers(Expression expression, int recursionLevel, bool isLast)
public void ExportMembers(Expression expression, int currentDepth, bool isLast)
{
//resolved reserved keywords such as class, this becomes @class.
string expressionName = GeneratorHelper.ResolveReservedNames(expression.Name);

string expressionType;
if(isFirstElement)
if(isFirstElement) //TODO: can probably replace isFirstElement with currentDepth = 0
{
//Frameworks can add theType { dynamicType} - strip out the {dynamic type}
expressionType = GeneratorHelper.StripChildReference(expression.Type);
Expand All @@ -84,8 +84,6 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
expressionType = GeneratorHelper.StripObjectReference(expression.Type);
}



if(!GeneratorHelper.IsSerializable(expressionName))
{
return;
Expand All @@ -101,14 +99,14 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 52 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 50 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(GetSingleTypeValue(expression) + GeneratorHelper.WriteCommaIfNotLast(isLast)));


#line default
#line hidden

#line 52 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 50 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
else
Expand All @@ -118,28 +116,28 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 56 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 54 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expressionName));


#line default
#line hidden

#line 56 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 54 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(" = ");


#line default
#line hidden

#line 56 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 54 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(GetSingleTypeValue(expression) + GeneratorHelper.WriteCommaIfNotLast(isLast)));


#line default
#line hidden

#line 56 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 54 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
}
Expand All @@ -153,14 +151,14 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 64 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 62 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expression.Value + GeneratorHelper.WriteCommaIfNotLast(isLast)));


#line default
#line hidden

#line 64 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 62 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
else
Expand All @@ -170,32 +168,32 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 68 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 66 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expressionName));


#line default
#line hidden

#line 68 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 66 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(" = ");


#line default
#line hidden

#line 68 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 66 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expression.Value + GeneratorHelper.WriteCommaIfNotLast(isLast)));


#line default
#line hidden

#line 68 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 66 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
}
else if (expression.DataMembers.Count > 0 && recursionLevel <= maxDepth)
else if (expression.DataMembers.Count > 0 && currentDepth <= maxDepth)
{
//used for the very first object (top most) to be completed as var objName = new objType, without a space in between.
if(isFirstElement)
Expand All @@ -214,42 +212,42 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 85 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 83 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expressionName));


#line default
#line hidden

#line 85 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 83 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(" = new ");


#line default
#line hidden

#line 85 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 83 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expressionType));


#line default
#line hidden

#line 85 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 83 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

WriteLine("");

#line default
#line hidden

#line 86 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 84 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write("{");


#line default
#line hidden

#line 86 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 84 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
else
Expand All @@ -259,35 +257,35 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 90 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 88 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write("new ");


#line default
#line hidden

#line 90 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 88 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(expressionType));


#line default
#line hidden

#line 90 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 88 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

WriteLine("");

#line default
#line hidden

#line 91 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 89 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write("{");


#line default
#line hidden

#line 91 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 89 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}

Expand All @@ -297,7 +295,7 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
{
PushIndent("\t");
bool isLastItem = cleanedExpressionMembers.IsLast(exp);
ExportMembers(exp, recursionLevel + 1, isLastItem);
ExportMembers(exp, currentDepth + 1, isLastItem);
PopIndent();
}

Expand All @@ -307,28 +305,28 @@ public void ExportMembers(Expression expression, int recursionLevel, bool isLast
#line default
#line hidden

#line 105 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 103 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write("}");


#line default
#line hidden

#line 105 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 103 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"



#line default
#line hidden

#line 106 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 104 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(GeneratorHelper.WriteCommaIfNotLast(isLast)));


#line default
#line hidden

#line 106 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"
#line 104 "C:\Users\Arel\Documents\GitHub\ObjectExporter\ObjectExporter.Core\Templates\CSharpGenerator.tt"

}
}
Expand Down
10 changes: 4 additions & 6 deletions ObjectExporter.Core/Templates/CSharpGenerator.tt
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
<#+
bool isFirstElement = true;

public void ExportMembers(Expression expression, int recursionLevel, bool isLast)
public void ExportMembers(Expression expression, int currentDepth, bool isLast)
{
//resolved reserved keywords such as class, this becomes @class.
string expressionName = GeneratorHelper.ResolveReservedNames(expression.Name);

string expressionType;
if(isFirstElement)
if(isFirstElement) //TODO: can probably replace isFirstElement with currentDepth = 0
{
//Frameworks can add theType { dynamicType} - strip out the {dynamic type}
expressionType = GeneratorHelper.StripChildReference(expression.Type);
Expand All @@ -37,8 +37,6 @@
expressionType = GeneratorHelper.StripObjectReference(expression.Type);
}



if(!GeneratorHelper.IsSerializable(expressionName))
{
return;
Expand Down Expand Up @@ -68,7 +66,7 @@
#><#= expressionName #> = <#= expression.Value + GeneratorHelper.WriteCommaIfNotLast(isLast) #><#+
}
}
else if (expression.DataMembers.Count > 0 && recursionLevel <= maxDepth)
else if (expression.DataMembers.Count > 0 && currentDepth <= maxDepth)
{
//used for the very first object (top most) to be completed as var objName = new objType, without a space in between.
if(isFirstElement)
Expand Down Expand Up @@ -97,7 +95,7 @@
{
PushIndent("\t");
bool isLastItem = cleanedExpressionMembers.IsLast(exp);
ExportMembers(exp, recursionLevel + 1, isLastItem);
ExportMembers(exp, currentDepth + 1, isLastItem);
PopIndent();
}

Expand Down
1 change: 0 additions & 1 deletion ObjectExporter.Core/Templates/GeneratorHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ public static List<Expression> SanitizeExpressions(Expression expression, RuleSe
{
cleanedExpressionMembers.Add(currentExpression);
}

}
}

Expand Down

0 comments on commit 3e18a8a

Please sign in to comment.