Skip to content

Commit

Permalink
Adjust model to revert baselines/prop ordering diff
Browse files Browse the repository at this point in the history
  • Loading branch information
layomia committed Sep 27, 2023
1 parent 60edf37 commit d87fb68
Show file tree
Hide file tree
Showing 38 changed files with 1,385 additions and 1,167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,7 @@ private TypeRef EnqueueTransitiveType(TypeParseInfo containingTypeParseInfo, ITy

if (_createdTypeSpecs.TryGetValue(memberTypeSymbol, out TypeSpec? memberTypeSpec))
{
if (memberTypeSpec is UnsupportedTypeSpec unsupportedTypeSpec)
{
RecordDiagnostic(unsupportedTypeSpec, memberTypeParseInfo);
}

RecordTypeDiagnosticIfRequired(memberTypeParseInfo, memberTypeSpec);
return memberTypeSpec.TypeRef;
}

Expand Down Expand Up @@ -208,6 +204,8 @@ private TypeSpec CreateTypeSpec(TypeParseInfo typeParseInfo)
spec = CreateUnsupportedTypeSpec(typeParseInfo, NotSupportedReason.UnknownType);
}

RecordTypeDiagnosticIfRequired(typeParseInfo, spec);

return spec;
}

Expand Down Expand Up @@ -566,7 +564,7 @@ private ObjectSpec CreateObjectSpec(TypeParseInfo typeParseInfo)
if (initDiagDescriptor is not null)
{
Debug.Assert(initExceptionMessage is not null);
RecordDiagnostic(typeParseInfo, initDiagDescriptor);
RecordTypeDiagnostic(typeParseInfo, initDiagDescriptor);
}

Dictionary<string, PropertySpec>? properties = null;
Expand Down Expand Up @@ -652,21 +650,17 @@ private ObjectSpec CreateObjectSpec(TypeParseInfo typeParseInfo)
return new ObjectSpec(
typeSymbol,
initializationStrategy,
properties: properties?.Values.OrderBy(p => p.Name).ToImmutableEquatableArray(),
properties: properties?.Values.ToImmutableEquatableArray(),
constructorParameters: ctorParams?.ToImmutableEquatableArray(),
initExceptionMessage);
}

private UnsupportedTypeSpec CreateUnsupportedTypeSpec(TypeParseInfo typeParseInfo, NotSupportedReason reason)
{
UnsupportedTypeSpec type = new(typeParseInfo.TypeSymbol) { NotSupportedReason = reason };
RecordDiagnostic(type, typeParseInfo);
return type;
}

private UnsupportedTypeSpec CreateUnsupportedCollectionSpec(TypeParseInfo typeParseInfo)
private static UnsupportedTypeSpec CreateUnsupportedCollectionSpec(TypeParseInfo typeParseInfo)
=> CreateUnsupportedTypeSpec(typeParseInfo, NotSupportedReason.CollectionNotSupported);

private static UnsupportedTypeSpec CreateUnsupportedTypeSpec(TypeParseInfo typeParseInfo, NotSupportedReason reason) =>
new(typeParseInfo.TypeSymbol) { NotSupportedReason = reason };

private bool TryGetElementType(INamedTypeSymbol type, [NotNullWhen(true)] out ITypeSymbol? elementType)
{
INamedTypeSymbol? candidate = GetInterface(type, _typeSymbols.GenericIEnumerable_Unbound);
Expand Down Expand Up @@ -803,26 +797,43 @@ private static bool HasAddMethod(INamedTypeSymbol type, ITypeSymbol key, ITypeSy

private static bool IsEnum(ITypeSymbol type) => type is INamedTypeSymbol { EnumUnderlyingType: INamedTypeSymbol { } };

private void RecordDiagnostic(UnsupportedTypeSpec type, TypeParseInfo typeParseInfo)
private void RecordTypeDiagnosticIfRequired(TypeParseInfo typeParseInfo, TypeSpec typeSpec)
{
DiagnosticDescriptor descriptor = DiagnosticDescriptors.GetNotSupportedDescriptor(type.NotSupportedReason);
RecordDiagnostic(typeParseInfo, descriptor);
ContainingTypeDiagnosticInfo? containingTypeDiagInfo = typeParseInfo.ContainingTypeDiagnosticInfo;

if (typeSpec is UnsupportedTypeSpec unsupportedTypeSpec)
{
DiagnosticDescriptor descriptor = DiagnosticDescriptors.GetNotSupportedDescriptor(unsupportedTypeSpec.NotSupportedReason);
RecordTypeDiagnostic(typeParseInfo, descriptor);
}
else if (containingTypeDiagInfo?.Descriptor == DiagnosticDescriptors.DictionaryKeyNotSupported &&
typeSpec is not ParsableFromStringSpec)
{
ReportContainingTypeDiagnosticIfRequired(typeParseInfo);
}
}

private void RecordDiagnostic(TypeParseInfo typeParseInfo, DiagnosticDescriptor descriptor)
private void RecordTypeDiagnostic(TypeParseInfo typeParseInfo, DiagnosticDescriptor descriptor)
{
string typeName = typeParseInfo.TypeSymbol.GetName();
Location invocationLocation = typeParseInfo.BinderInvocation.Location;
RecordDiagnostic(descriptor, typeParseInfo.BinderInvocation.Location, new object?[] { typeParseInfo.TypeName });
ReportContainingTypeDiagnosticIfRequired(typeParseInfo);
}

RecordDiagnostic(descriptor, invocationLocation, new object?[] { typeName });
private void ReportContainingTypeDiagnosticIfRequired(TypeParseInfo typeParseInfo)
{
ContainingTypeDiagnosticInfo? containingTypeDiagInfo = typeParseInfo.ContainingTypeDiagnosticInfo;

if (typeParseInfo.ContainingTypeDiagnosticInfo is ContainingTypeDiagnosticInfo containingTypeDiagInfo)
while (containingTypeDiagInfo is not null)
{
string containingTypeName = containingTypeDiagInfo.TypeName;

object[] messageArgs = containingTypeDiagInfo.MemberName is string memberName
? new[] { memberName, typeName }
: new[] { typeName };
? new[] { memberName, containingTypeName }
: new[] { containingTypeName };

RecordDiagnostic(containingTypeDiagInfo.Descriptor, typeParseInfo.BinderInvocation.Location, messageArgs);

RecordDiagnostic(containingTypeDiagInfo.Descriptor, invocationLocation, messageArgs);
containingTypeDiagInfo = containingTypeDiagInfo.ContainingTypeInfo;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ private void EmitConfigurationKeyCaches()
Debug.Assert(keys is not null);

string configKeysSource = string.Join(", ", keys);
string fieldName = GetConfigKeyCacheFieldName(objectType);
string fieldName = TypeIndex.GetConfigKeyCacheFieldName(objectType);
_writer.WriteLine($@"private readonly static Lazy<{TypeDisplayString.HashSetOfString}> {fieldName} = new(() => new {TypeDisplayString.HashSetOfString}(StringComparer.OrdinalIgnoreCase) {{ {configKeysSource} }});");
}
}
Expand Down Expand Up @@ -124,7 +124,7 @@ private void EmitGetCoreMethod()
useIncrementalStringValueIdentifier: false);
}
break;
case ConfigurationSectionSpec configurationSectionSpec:
case ConfigurationSectionSpec:
{
EmitCastToIConfigurationSection();
_writer.WriteLine($"return {Identifier.section};");
Expand Down Expand Up @@ -660,7 +660,7 @@ private void EmitPrimitiveParseMethod(ParsableFromStringSpec type)

string exceptionArg1 = string.Format(ExceptionMessages.FailedBinding, $"{{{Identifier.getPath}()}}", $"{{typeof({typeDisplayString})}}");

EmitStartBlock($"public static {typeDisplayString} {GetParseMethodName(type)}(string {Identifier.value}, Func<string?> {Identifier.getPath})");
EmitStartBlock($"public static {typeDisplayString} {TypeIndex.GetParseMethodName(type)}(string {Identifier.value}, Func<string?> {Identifier.getPath})");
EmitEndBlock($$"""
try
{
Expand All @@ -677,7 +677,7 @@ private void EmitBindCoreImplForArray(ArraySpec type)
{
TypeRef elementTypeRef = type.ElementTypeRef;
string elementTypeDisplayString = _typeIndex.GetTypeSpec(elementTypeRef).DisplayString;
string tempIdentifier = Identifier.temp;
string tempIdentifier = GetIncrementalIdentifier(Identifier.temp);

// Create temp list.
_writer.WriteLine($"var {tempIdentifier} = new List<{elementTypeDisplayString}>();");
Expand Down Expand Up @@ -721,7 +721,7 @@ private void EmitBindingLogicForEnumerableWithAdd(TypeRef elementTypeRef, string
useIncrementalStringValueIdentifier: false);
}
break;
case ConfigurationSectionSpec configurationSection:
case ConfigurationSectionSpec:
{
_writer.WriteLine($"{addExpr}({Identifier.section});");
}
Expand Down Expand Up @@ -772,15 +772,13 @@ void Emit_BindAndAddLogic_ForElement(string parsedKeyExpr)
useIncrementalStringValueIdentifier: false);
}
break;
case ConfigurationSectionSpec configurationSection:
case ConfigurationSectionSpec:
{
_writer.WriteLine($"{instanceIdentifier}[{parsedKeyExpr}] = {Identifier.section};");
}
break;
case ComplexTypeSpec complexElementType:
{
Debug.Assert(_typeIndex.CanBindTo(complexElementType.TypeRef));

if (keyType.StringParsableTypeKind is not StringParsableTypeKind.AssignFromSectionValue)
{
// Save value to local to avoid parsing twice - during look-up and during add.
Expand Down Expand Up @@ -816,13 +814,17 @@ void Emit_BindAndAddLogic_ForElement(string parsedKeyExpr)
EmitEndBlock();
}

void EmitBindingLogic() => this.EmitBindingLogic(
complexElementType,
Identifier.element,
Identifier.section,
InitializationKind.None,
ValueDefaulting.None,
writeOnSuccess: parsedValueExpr => _writer.WriteLine($"{instanceIdentifier}[{parsedKeyExpr}] = {parsedValueExpr};"));
void EmitBindingLogic()
{
this.EmitBindingLogic(
complexElementType,
Identifier.element,
Identifier.section,
InitializationKind.None,
ValueDefaulting.None);

_writer.WriteLine($"{instanceIdentifier}[{parsedKeyExpr}] = {Identifier.element};");
}
}
break;
}
Expand All @@ -835,7 +837,7 @@ private void EmitBindCoreImplForObject(ObjectSpec type)
{
Debug.Assert(_typeIndex.HasBindableMembers(type));

string keyCacheFieldName = GetConfigKeyCacheFieldName(type);
string keyCacheFieldName = TypeIndex.GetConfigKeyCacheFieldName(type);
string validateMethodCallExpr = $"{Identifier.ValidateConfigurationKeys}(typeof({type.DisplayString}), {keyCacheFieldName}, {Identifier.configuration}, {Identifier.binderOptions});";
_writer.WriteLine(validateMethodCallExpr);

Expand Down Expand Up @@ -1086,7 +1088,7 @@ void EmitBindCoreCall()
{
StringParsableTypeKind.AssignFromSectionValue => stringValueToParse_Expr,
StringParsableTypeKind.Enum => $"ParseEnum<{type.DisplayString}>({stringValueToParse_Expr}, () => {sectionPathExpr})",
_ => $"{GetParseMethodName(type)}({stringValueToParse_Expr}, () => {sectionPathExpr})",
_ => $"{TypeIndex.GetParseMethodName(type)}({stringValueToParse_Expr}, () => {sectionPathExpr})",
};

if (!checkForNullSectionValue)
Expand Down Expand Up @@ -1260,15 +1262,6 @@ private static string GetConditionKindExpr(ref bool isFirstType)

return "else if";
}

private static string GetConfigKeyCacheFieldName(ObjectSpec type) =>
$"s_configKeys_{type.IdentifierCompatibleSubstring}";

private static string GetParseMethodName(ParsableFromStringSpec type)
{
Debug.Assert(type.StringParsableTypeKind is not StringParsableTypeKind.AssignFromSectionValue);
return $"Parse{type.IdentifierCompatibleSubstring}";
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ private void RegisterInterceptor_ConfigurationBinder(TypeParseInfo typeParseInfo
if ((MethodsToGen.ConfigBinder_Bind & overload) is not 0)
{
if (typeSpec is ComplexTypeSpec complexTypeSpec &&
_helperInfoBuilder!.TryRegisterComplexTypeForMethodGen(complexTypeSpec))
_helperInfoBuilder!.TryRegisterTransitiveTypesForMethodGen(complexTypeSpec.TypeRef))
{
_interceptorInfoBuilder.RegisterInterceptor_ConfigBinder_Bind(overload, complexTypeSpec, invocationOperation);
}
Expand All @@ -271,8 +271,8 @@ private void RegisterInterceptor_ConfigurationBinder(TypeParseInfo typeParseInfo
(MethodsToGen.ConfigBinder_GetValue & overload) is not 0);

bool registered = (MethodsToGen.ConfigBinder_Get & overload) is not 0
? _helperInfoBuilder!.TryRegisterTypeForGetCoreGen(typeSpec)
: _helperInfoBuilder!.TryRegisterTypeForGetValueCoreGen(typeSpec);
? _helperInfoBuilder!.TryRegisterTypeForGetGen(typeSpec)
: _helperInfoBuilder!.TryRegisterTypeForGetValueGen(typeSpec);

if (registered)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,19 @@ public TypeParseInfo ToTransitiveTypeParseInfo(ITypeSymbol memberType, Diagnosti
TypeName = TypeName,
Descriptor = diagDescriptor,
MemberName = memberName,
ContainingTypeInfo = ContainingTypeDiagnosticInfo,
};

return Create(memberType, BindingOverload, BinderInvocation, diagnosticInfo);
}
}

private readonly struct ContainingTypeDiagnosticInfo
private sealed class ContainingTypeDiagnosticInfo
{
public required string TypeName { get; init; }
public required string? MemberName { get; init; }
public required DiagnosticDescriptor Descriptor { get; init; }
public required ContainingTypeDiagnosticInfo? ContainingTypeInfo { get; init; }
}
}
}
Expand Down

0 comments on commit d87fb68

Please sign in to comment.