Skip to content

Commit 31eb593

Browse files
committed
Added special handling for types and members starting with underscores and numbers
1 parent 63d2645 commit 31eb593

30 files changed

Lines changed: 1487 additions & 17 deletions

File tree

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/AdHocUnions/AdHocUnionCodeGenerator.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ private void GenerateToString()
224224
var memberType = _state.MemberTypes[i];
225225

226226
_sb.Append(@"
227-
").Append(i + 1).Append(" => this._").Append(memberType.BackingFieldName);
227+
").Append(i + 1).Append(" => this.").Append(memberType.BackingFieldName);
228228

229229
if (memberType.SpecialType != SpecialType.System_String)
230230
{
@@ -266,7 +266,7 @@ public override int GetHashCode()
266266
_sb.Append(@"
267267
").Append(i + 1).Append(" => ");
268268

269-
_sb.Append("global::System.HashCode.Combine(").AppendTypeFullyQualified(_state).Append("._typeHashCode, this._").Append(memberType.BackingFieldName);
269+
_sb.Append("global::System.HashCode.Combine(").AppendTypeFullyQualified(_state).Append("._typeHashCode, this.").Append(memberType.BackingFieldName);
270270

271271
if (memberType.IsReferenceType)
272272
_sb.Append("?");
@@ -348,9 +348,9 @@ public bool Equals(").AppendTypeFullyQualifiedNullAnnotated(_state).Append(@" ot
348348
").Append(i + 1).Append(" => ");
349349

350350
if (memberType.IsReferenceType)
351-
_sb.Append("this._").Append(memberType.BackingFieldName).Append(" is null ? other._").Append(memberType.BackingFieldName).Append(" is null : ");
351+
_sb.Append("this.").Append(memberType.BackingFieldName).Append(" is null ? other.").Append(memberType.BackingFieldName).Append(" is null : ");
352352

353-
_sb.Append("this._").Append(memberType.BackingFieldName).Append(".Equals(other._").Append(memberType.BackingFieldName);
353+
_sb.Append("this.").Append(memberType.BackingFieldName).Append(".Equals(other.").Append(memberType.BackingFieldName);
354354

355355
if (memberType.SpecialType == SpecialType.System_String)
356356
_sb.Append(", global::System.StringComparison.").Append(Enum.GetName(typeof(StringComparison), _state.Settings.DefaultStringComparison));
@@ -500,7 +500,7 @@ private void GenerateIndexBasedActionSwitchBody(bool withState, bool isPartially
500500
if (withState)
501501
_sb.Append("state, ");
502502

503-
_sb.Append("this._").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && memberType.NullableAnnotation != NullableAnnotation.Annotated ? "!" : null).Append(@");
503+
_sb.Append("this.").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && memberType.NullableAnnotation != NullableAnnotation.Annotated ? "!" : null).Append(@");
504504
return;");
505505
}
506506

@@ -661,7 +661,7 @@ private void GenerateIndexBasedFuncSwitchBody(bool withState, bool isPartially)
661661
if (withState)
662662
_sb.Append("state, ");
663663

664-
_sb.Append("this._").Append(memberType.BackingFieldName).Append(memberType is { IsReferenceType: true, Setting.IsNullableReferenceType: false } ? "!" : null).Append(");");
664+
_sb.Append("this.").Append(memberType.BackingFieldName).Append(memberType is { IsReferenceType: true, Setting.IsNullableReferenceType: false } ? "!" : null).Append(");");
665665
}
666666

667667
_sb.Append(@"
@@ -844,7 +844,7 @@ private void GenerateConstructors()
844844

845845
_sb.Append(@")
846846
{
847-
this._").Append(memberType.BackingFieldName).Append(" = ").AppendEscaped(argName).Append(@";
847+
this.").Append(memberType.BackingFieldName).Append(" = ").AppendEscaped(argName).Append(@";
848848
this._valueIndex = ");
849849

850850
if (hasDuplicates)
@@ -896,7 +896,7 @@ private void GenerateMemberTypeFieldsAndProps()
896896
continue;
897897

898898
_sb.Append(@"
899-
private readonly ").AppendTypeFullyQualifiedNullAnnotated(memberType).Append(" _").Append(memberType.BackingFieldName).Append(";");
899+
private readonly ").AppendTypeFullyQualifiedNullAnnotated(memberType).Append(" ").Append(memberType.BackingFieldName).Append(";");
900900
}
901901

902902
for (var i = 0; i < _state.MemberTypes.Count; i++)
@@ -920,7 +920,7 @@ private void GenerateMemberTypeFieldsAndProps()
920920
/// </summary>
921921
/// <exception cref=""global::System.InvalidOperationException"">If the current value is not of type ").AppendTypeForXmlComment(memberType).Append(@".</exception>
922922
public ").AppendTypeFullyQualified(memberType).Append(" As").Append(memberType.Name).Append(" => Is").Append(memberType.Name)
923-
.Append(" ? this._").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && memberType.NullableAnnotation != NullableAnnotation.Annotated ? "!" : null)
923+
.Append(" ? this.").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && memberType.NullableAnnotation != NullableAnnotation.Annotated ? "!" : null)
924924
.Append(" : throw new global::System.InvalidOperationException($\"'{nameof(").AppendTypeFullyQualified(_state).Append(")}' is not of type '").AppendTypeMinimallyQualified(memberType).Append("'.\");");
925925
}
926926
}
@@ -956,7 +956,7 @@ private void GenerateRawValueGetter()
956956
var memberType = _state.MemberTypes[i];
957957

958958
_sb.Append(@"
959-
").Append(i + 1).Append(" => this._").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && !hasNullableTypes ? "!" : null).Append(",");
959+
").Append(i + 1).Append(" => this.").Append(memberType.BackingFieldName).Append(memberType.IsReferenceType && !hasNullableTypes ? "!" : null).Append(",");
960960
}
961961

962962
_sb.Append(@"

src/Thinktecture.Runtime.Extensions.SourceGenerator/CodeAnalysis/AdHocUnions/AdHocUnionMemberTypeState.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ public AdHocUnionMemberTypeState(
2525
{
2626
Name = name;
2727
ArgumentName = Name.MakeArgumentName();
28-
BackingFieldName = typeDuplicateCounter == 0 ? ArgumentName : defaultName.MakeArgumentName();
28+
29+
var backingFieldName = (typeDuplicateCounter == 0 ? Name : defaultName).MakeBackingFieldName();
30+
BackingFieldName = backingFieldName == Name ? $"_{backingFieldName}" : backingFieldName;
31+
2932
TypeDuplicateCounter = typeDuplicateCounter;
3033
TypeFullyQualified = typeState.TypeFullyQualified;
3134
TypeMinimallyQualified = typeState.TypeMinimallyQualified;

src/Thinktecture.Runtime.Extensions.SourceGenerator/Extensions/ContainingTypesExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public static string MakeFullyQualifiedArgumentName(
2323

2424
var firstChar = sb[sbLength];
2525

26-
sb[sbLength] = firstChar == '_'
27-
? Char.ToLowerInvariant(sb[sbLength + 1])
28-
: Char.ToLowerInvariant(firstChar);
26+
sb[sbLength] = firstChar != '_' || (sb.Length > sbLength && Char.IsDigit(sb[sbLength + 1]))
27+
? Char.ToLowerInvariant(firstChar)
28+
: Char.ToLowerInvariant(sb[sbLength + 1]);
2929

3030
var argName = sb.ToString(sbLength, sb.Length - sbLength);
3131
sb.Length = sbLength;

src/Thinktecture.Runtime.Extensions.SourceGenerator/Extensions/StringExtensions.cs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,52 @@ public static string MakeArgumentName(this string name)
77
return name.Length switch
88
{
99
1 => name.ToLowerInvariant(),
10-
_ => name.StartsWith("_", StringComparison.Ordinal)
11-
? $"{Char.ToLowerInvariant(name[1])}{name.Substring(2)}"
12-
: $"{Char.ToLowerInvariant(name[0])}{name.Substring(1)}"
10+
_ => ToCamelCase(name, false)
1311
};
1412
}
13+
14+
public static string MakeBackingFieldName(this string name)
15+
{
16+
return name.Length switch
17+
{
18+
1 => name[0] == '_' ? name : $"_{Char.ToLowerInvariant(name[0])}",
19+
_ => ToCamelCase(name, true)
20+
};
21+
}
22+
23+
private static string ToCamelCase(
24+
string name,
25+
bool leadingUnderscore)
26+
{
27+
var startsWithUnderscore = name[0] == '_';
28+
29+
for (var i = 0; i < name.Length; i++)
30+
{
31+
var charValue = name[i];
32+
33+
if (Char.IsDigit(charValue))
34+
return name;
35+
36+
if (Char.IsLower(charValue))
37+
break;
38+
39+
if (!Char.IsLetter(charValue))
40+
continue;
41+
42+
if (i == 0)
43+
return $"{(leadingUnderscore ? "_" : String.Empty)}{Char.ToLowerInvariant(charValue)}{name.Substring(1)}";
44+
45+
var prefix = leadingUnderscore && !startsWithUnderscore ? "_" : String.Empty;
46+
47+
if (i == name.Length - 1)
48+
return $"{prefix}{name.Substring(startsWithUnderscore ? 1 : 0, i)}{Char.ToLowerInvariant(charValue)}";
49+
50+
return $"{prefix}{name.Substring(startsWithUnderscore ? 1 : 0, i)}{Char.ToLowerInvariant(charValue)}{name.Substring(i)}";
51+
}
52+
53+
if (leadingUnderscore)
54+
return !startsWithUnderscore ? $"_{name}" : name;
55+
56+
return startsWithUnderscore && name.Length > 1 ? name.Substring(1) : name;
57+
}
1558
}

0 commit comments

Comments
 (0)