Return correct type (interfacve) for array (#53)

This commit is contained in:
Stef Heyenrath
2023-01-23 13:11:51 +01:00
committed by GitHub
parent b7adb20257
commit c1d42ac7e5
10 changed files with 597 additions and 387 deletions
@@ -22,12 +22,12 @@ internal abstract class BaseGenerator
protected string GetPropertyType(IPropertySymbol property, out bool isReplaced)
{
return GetReplacedType(property.Type, out isReplaced);
return GetReplacedTypeAsString(property.Type, out isReplaced);
}
protected string GetParameterType(IParameterSymbol property, out bool isReplaced)
{
return GetReplacedType(property.Type, out isReplaced);
return GetReplacedTypeAsString(property.Type, out isReplaced);
}
protected bool TryFindProxyDataByTypeName(string type, [NotNullWhen(true)] out ProxyData? proxyData)
@@ -112,7 +112,7 @@ internal abstract class BaseGenerator
{
if (replaceIt)
{
constraints.Add(GetReplacedType(namedTypeSymbol, out _));
constraints.Add(GetReplacedTypeAsString(namedTypeSymbol, out _));
}
else
{
@@ -136,7 +136,7 @@ internal abstract class BaseGenerator
return false;
}
protected string GetReplacedType(ITypeSymbol typeSymbol, out bool isReplaced)
protected string GetReplacedTypeAsString(ITypeSymbol typeSymbol, out bool isReplaced)
{
isReplaced = false;
@@ -153,30 +153,39 @@ internal abstract class BaseGenerator
return existing.FullInterfaceName;
}
if (typeSymbol is INamedTypeSymbol namedTypedSymbol)
ITypeSymbol[] typeArguments;
if (typeSymbol is INamedTypeSymbol namedTypedSymbol1)
{
var propertyTypeAsStringToBeModified = typeSymbolAsString;
foreach (var typeArgument in namedTypedSymbol.TypeArguments)
{
var typeArgumentAsString = typeArgument.ToString();
if (TryFindProxyDataByTypeName(typeArgumentAsString, out var existingTypeArgument))
{
isReplaced = true;
if (!Context.ReplacedTypes.ContainsKey(typeArgumentAsString))
{
Context.ReplacedTypes.Add(typeArgumentAsString, existingTypeArgument.FullInterfaceName);
}
propertyTypeAsStringToBeModified = propertyTypeAsStringToBeModified.Replace(typeArgumentAsString, existingTypeArgument.FullInterfaceName);
}
}
return propertyTypeAsStringToBeModified;
typeArguments = namedTypedSymbol1.TypeArguments.ToArray();
}
else if (typeSymbol is IArrayTypeSymbol arrayTypeSymbol)
{
typeArguments = new[] { arrayTypeSymbol.ElementType };
}
else
{
return typeSymbolAsString;
}
return typeSymbolAsString;
var propertyTypeAsStringToBeModified = typeSymbolAsString;
foreach (var typeArgument in typeArguments)
{
var typeArgumentAsString = typeArgument.ToString();
if (TryFindProxyDataByTypeName(typeArgumentAsString, out var existingTypeArgument))
{
isReplaced = true;
if (!Context.ReplacedTypes.ContainsKey(typeArgumentAsString))
{
Context.ReplacedTypes.Add(typeArgumentAsString, existingTypeArgument.FullInterfaceName);
}
propertyTypeAsStringToBeModified = propertyTypeAsStringToBeModified.Replace(typeArgumentAsString, existingTypeArgument.FullInterfaceName);
}
}
return propertyTypeAsStringToBeModified;
}
protected bool TryGetNamedTypeSymbolByFullName(TypeKind kind, string name, IEnumerable<string> usings, [NotNullWhen(true)] out ClassSymbol? classSymbol)
@@ -135,7 +135,7 @@ using System;
str.AppendLine($" {attribute}");
}
str.AppendLine($" {GetReplacedType(method.ReturnType, out _)} {method.GetMethodNameWithOptionalTypeParameters()}({string.Join(", ", methodParameters)}){whereStatement};");
str.AppendLine($" {GetReplacedTypeAsString(method.ReturnType, out _)} {method.GetMethodNameWithOptionalTypeParameters()}({string.Join(", ", methodParameters)}){whereStatement};");
str.AppendLine();
}
@@ -222,7 +222,7 @@ using System;
overrideOrVirtual = "virtual ";
}
string returnTypeAsString = GetReplacedType(method.ReturnType, out var returnIsReplaced);
string returnTypeAsString = GetReplacedTypeAsString(method.ReturnType, out var returnIsReplaced);
var whereStatement = GetWhereStatementFromMethod(method);
@@ -348,7 +348,7 @@ using System;
var operatorType = @operator.Name.ToLowerInvariant().Replace("op_", string.Empty);
if (operatorType == "explicit")
{
var returnTypeAsString = GetReplacedType(@operator.ReturnType, out _);
var returnTypeAsString = GetReplacedTypeAsString(@operator.ReturnType, out _);
str.AppendLine($" public static explicit operator {returnTypeAsString}({proxyClassName} {parameter.Name})");
str.AppendLine(@" {");
@@ -357,7 +357,7 @@ using System;
}
else
{
var returnTypeAsString = GetReplacedType(parameter.Type, out _);
var returnTypeAsString = GetReplacedTypeAsString(parameter.Type, out _);
str.AppendLine($" public static implicit operator {proxyClassName}({returnTypeAsString} {parameter.Name})");
str.AppendLine(@" {");
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>0.0.29</Version>
<Version>0.0.30</Version>
<TargetFramework>netstandard2.0</TargetFramework>
<ProjectGuid>{12344228-91F4-4502-9595-39584E5ABB34}</ProjectGuid>
<LangVersion>10</LangVersion>