Skip to content

Commit

Permalink
Fix friendly type name generation
Browse files Browse the repository at this point in the history
  • Loading branch information
sblom committed Dec 23, 2023
1 parent 38d8e22 commit 790ffa1
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 16 deletions.
2 changes: 1 addition & 1 deletion RegExtract.Test/RegExtract.Test.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net452</TargetFrameworks>
<TargetFrameworks>netcoreapp8.0;netcoreapp3.1;net452</TargetFrameworks>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
Expand Down
4 changes: 2 additions & 2 deletions RegExtract/ExtractionPlan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ ExtractionPlanNode BindTupleConstructorPlan(string name, IEnumerable<RegexCaptur
{
if (idx < 7)
{
groups.Add(BindConstructorPlan(node, tupleType, idx, typeArgs.Length));
groups.Add(BindConstructorPlan(node, tupleType, idx, typeArgs?.Length ?? 0));
}
else
{
Expand Down Expand Up @@ -156,7 +156,7 @@ private ExtractionPlanNode AssignTypesToTree(RegexCaptureGroupNode tree, Extract
return AssignTypesToTree(tree.children.Single(), type);
}

if (typeParams.Length < 2 && !(typeParams.Length > 0 && ExtractionPlanTypeWrapper.Wrap(typeParams.First()).IsInitializableCollection))
if ((typeParams?.Length ?? 0) < 2 && !((typeParams?.Length ?? 0) > 0 && ExtractionPlanTypeWrapper.Wrap(typeParams.First()).IsInitializableCollection))
{
return ExtractionPlanNode.Bind(tree.name, type, new[] { BindConstructorPlan(tree, type, 0, 1) }, new ExtractionPlanNode[0]);
}
Expand Down
16 changes: 8 additions & 8 deletions RegExtract/ExtractionPlanNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public string ShowPlanTree()
{
StringBuilder builder = new();

builder.Append(this.GetType().Name.Replace("Node","")).Append("<").Append(string.Join(",",FriendlyTypeName(type))).Append(">[").Append(int.TryParse(groupName, out var _) ? groupName : "\"" + groupName + "\"").Append("] (");
builder.Append(this.GetType().Name.Replace("Node","")).Append("<").Append(string.Join(",",FriendlyTypeName(type.Type))).Append(">[").Append(int.TryParse(groupName, out var _) ? groupName : '"' + groupName + '"').Append("] (");
if (constructorParams.Any())
{
builder.Append("\n");
Expand All @@ -36,9 +36,9 @@ public string ShowPlanTree()
return builder.ToString();
}

string FriendlyTypeName(ExtractionPlanTypeWrapper type)
string FriendlyTypeName(Type type)
{
var keyword = type.Type.Name switch
var keyword = type.Name switch
{
"Byte" => "byte",
"SByte" => "sbyte",
Expand All @@ -58,18 +58,18 @@ string FriendlyTypeName(ExtractionPlanTypeWrapper type)

if (keyword is not null) return keyword;

if (type.IsNullable) return FriendlyTypeName(type.NonNullableType) + "?";
if (Nullable.GetUnderlyingType(type) is Type nonNullableType) return FriendlyTypeName(nonNullableType) + "?";

var args = type.GenericArguments;
var args = type.GetGenericArguments();

if (type.IsTuple) return "(" + String.Join(",", args.Select(arg => ExtractionPlanTypeWrapper.Wrap(arg))) + ")";
if (type.FullName.StartsWith(VALUETUPLE_TYPENAME)) return "(" + String.Join(",", args.Select(arg => FriendlyTypeName(arg))) + ")";

if (args.Any())
{
return type.Type.Name.Split('`')[0] + "<" + String.Join(",", args.Select(arg => ExtractionPlanTypeWrapper.Wrap(arg))) + ">";
return type.Name.Split('`')[0] + "<" + String.Join(",", args.Select(arg => FriendlyTypeName(arg))) + ">";
}

else return type.Type.Name;
else return type.Name;
}

internal static ExtractionPlanNode Bind(string groupName, ExtractionPlanTypeWrapper type, ExtractionPlanNode[] constructorParams, ExtractionPlanNode[] propertySetters)
Expand Down
4 changes: 2 additions & 2 deletions RegExtract/ExtractionPlanNodeTypes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ internal record CollectionInitializerNode(string groupName, ExtractionPlanTypeWr
var vals = Activator.CreateInstance(type.Type);
var addMethod = type.Type.GetMethod("Add");

object?[] itemVals = new object[genericArgs.Length];
object?[] itemVals = new object[genericArgs?.Length ?? 0];

var rangeArray = constructorParams.Select(c => Ranges(match, groupName, captureStart, captureLength, cache).GetEnumerator()).ToArray();

do
{
for (int i = 0; i < genericArgs.Length; i++)
for (int i = 0; i < genericArgs?.Length; i++)
{
if (rangeArray[i].MoveNext())
{
Expand Down
7 changes: 4 additions & 3 deletions RegExtract/ExtractionPlanTypeWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ internal class ExtractionPlanTypeWrapper
{
private static Dictionary<Type, ExtractionPlanTypeWrapper> _typeWrappers = new();

public static ExtractionPlanTypeWrapper Wrap(Type type)
public static ExtractionPlanTypeWrapper Wrap(Type? type)
{
if (_typeWrappers.ContainsKey(type))
return _typeWrappers[type];
type ??= typeof(void);
if (_typeWrappers.TryGetValue(type, out var wrap))
return wrap;
else
return (_typeWrappers[type] = new ExtractionPlanTypeWrapper(type));
}
Expand Down

0 comments on commit 790ffa1

Please sign in to comment.