Merge pull request #6065 from abpframework/maliming/ApiTypeNameHelper

Prevent ApiTypeNameHelper infinite loop.
pull/6078/head
Halil İbrahim Kalkan 5 years ago committed by GitHub
commit 9708dbdc3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -357,6 +357,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Swashbuckle", "src
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Tests", "test\Volo.Abp.Json.Tests\Volo.Abp.Json.Tests.csproj", "{00D07595-993C-40FC-BD90-0DD6331414D3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Tests", "test\Volo.Abp.Http.Tests\Volo.Abp.Http.Tests.csproj", "{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -1063,6 +1065,10 @@ Global
{00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.Build.0 = Release|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -1243,6 +1249,7 @@ Global
{89840441-5A3A-4FD7-9CB4-E5B52FAEF72A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{00D07595-993C-40FC-BD90-0DD6331414D3} = {447C8A77-E5F0-4538-8687-7383196D04EA}
{A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

@ -1,4 +1,5 @@
using System;
using Volo.Abp.Collections;
using Volo.Abp.Reflection;
namespace Volo.Abp.Http.Modeling
@ -7,14 +8,26 @@ namespace Volo.Abp.Http.Modeling
{
public static string GetTypeName(Type type)
{
return GetTypeName(type, new TypeList());
}
private static string GetTypeName(Type type, ITypeList duplicateTypes)
{
duplicateTypes.Add(type);
if (TypeHelper.IsDictionary(type, out var keyType, out var valueType))
{
return $"{{{GetTypeName(keyType)}:{GetTypeName(valueType)}}}";
if (!duplicateTypes.Contains(keyType) && !duplicateTypes.Contains(valueType))
{
return $"{{{GetTypeName(keyType, duplicateTypes)}:{GetTypeName(valueType, duplicateTypes)}}}";
}
}
if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false))
else if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false))
{
return $"[{GetTypeName(itemType)}]";
if (!duplicateTypes.Contains(itemType))
{
return $"[{GetTypeName(itemType, duplicateTypes)}]";
}
}
return TypeHelper.GetFullNameHandlingNullableAndGenerics(type);
@ -22,14 +35,26 @@ namespace Volo.Abp.Http.Modeling
public static string GetSimpleTypeName(Type type)
{
return GetSimpleTypeName(type, new TypeList());
}
private static string GetSimpleTypeName(Type type, ITypeList duplicateTypes)
{
duplicateTypes.Add(type);
if (TypeHelper.IsDictionary(type, out var keyType, out var valueType))
{
return $"{{{GetSimpleTypeName(keyType)}:{GetSimpleTypeName(valueType)}}}";
if (!duplicateTypes.Contains(keyType) && !duplicateTypes.Contains(valueType))
{
return $"{{{GetSimpleTypeName(keyType, duplicateTypes)}:{GetSimpleTypeName(valueType, duplicateTypes)}}}";
}
}
if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false))
else if (TypeHelper.IsEnumerable(type, out var itemType, includePrimitives: false))
{
return $"[{GetSimpleTypeName(itemType)}]";
if (!duplicateTypes.Contains(itemType))
{
return $"[{GetSimpleTypeName(itemType, duplicateTypes)}]";
}
}
return TypeHelper.GetSimplifiedName(type);

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.test.props" />
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Http\Volo.Abp.Http.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
</ItemGroup>
</Project>

@ -0,0 +1,10 @@
using Volo.Abp.Modularity;
namespace Volo.Abp.Http
{
[DependsOn(typeof(AbpHttpModule))]
public class AbpHttpTestModule : AbpModule
{
}
}

@ -0,0 +1,73 @@
using System.Collections;
using System.Collections.Generic;
using Shouldly;
using Volo.Abp.Http.Modeling;
using Volo.Abp.Reflection;
using Xunit;
namespace Volo.Abp.Http
{
public class ApiTypeNameHelper_Tests
{
[Fact]
public void GetTypeName_Test()
{
ApiTypeNameHelper.GetTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass2)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetFullNameHandlingNullableAndGenerics(typeof(CycleClass4))}]");
}
[Fact]
public void GetSimpleTypeName_Test()
{
ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass)));
ApiTypeNameHelper.GetSimpleTypeName(typeof(CycleClass2)).ShouldBe(TypeHelper.GetSimplifiedName(typeof(CycleClass2)));
ApiTypeNameHelper.GetTypeName(typeof(CycleClass3)).ShouldBe($"[{TypeHelper.GetSimplifiedName(typeof(CycleClass4))}]");
}
class CycleClass : IEnumerable<CycleClass>
{
public IEnumerator<CycleClass> GetEnumerator()
{
yield return new CycleClass();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class CycleClass2 : Dictionary<CycleClass2, CycleClass2>
{
}
class CycleClass3 : IEnumerable<CycleClass4>
{
public IEnumerator<CycleClass4> GetEnumerator()
{
yield return new CycleClass4();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class CycleClass4 : IEnumerable<CycleClass3>
{
public IEnumerator<CycleClass3> GetEnumerator()
{
yield return new CycleClass3();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
}
Loading…
Cancel
Save