Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -902,4 +902,57 @@ export interface AssemblyExports{

""".Replace("{{tsArrayType}}", tsArrayType));
}

[Test]
public void TypeScriptInteropInterfaceRenderer_Constructor_WithUserClassWithRequiredPropertyParameterType_HasManagedObjectOrObjectType()
{
SyntaxTree userClass = CSharpSyntaxTree.ParseText("""
using System;
using System.Threading.Tasks;
namespace N1;
[TSExport]
public class UserClass
{
public int Id { get; init; }
}
""");

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
using System.Threading.Tasks;
namespace N1;
[TSExport]
public class C1(UserClass uc)
{
public void DoStuff(UserClass u) {}
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree), CSharpFileInfo.Create(userClass)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(2));
INamedTypeSymbol classSymbol = exportedClasses[0];
INamedTypeSymbol userClassSymbol = exportedClasses[1];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();
ClassInfo userClassInfo = new ClassInfoBuilder(userClassSymbol, typeCache).Build();

ModuleHierarchyInfo hierarchyInfo = ModuleHierarchyInfo.FromClasses([classInfo]); //deliberate omit userClassInfo to reduce noise in baseline
RenderContext renderCtx = new(null, [classInfo, userClassInfo], RenderOptions.TypeScript);
new TypescriptAssemblyExportsRenderer(hierarchyInfo, renderCtx).Render();

AssertEx.EqualOrDiff(renderCtx.ToString(), """
// TypeShim generated TypeScript module exports interface
export interface AssemblyExports{
N1: {
C1Interop: {
ctor(uc: ManagedObject | object): ManagedObject;
DoStuff(instance: ManagedObject, u: ManagedObject | object): void;
};
};
}

""");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ private DeferredExpressionRenderer RenderTypeDownConversion(InteropTypeInfo type
internal DeferredExpressionRenderer RenderReturnTypeConversion(InteropTypeInfo returnType, DeferredExpressionRenderer valueExpressionRenderer)
{
if (!returnType.RequiresTypeConversion)
return valueExpressionRenderer; // DeferredExpressionRenderer.From(() => _ctx.Append(valueExpression));
return valueExpressionRenderer;

if (returnType is { IsTaskType: true, TypeArgument.RequiresTypeConversion: true }) // Handle Task<T>
{
Expand Down
12 changes: 0 additions & 12 deletions src/TypeShim.Generator/Parsing/ConstructorInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,4 @@ internal MethodParameterInfo[] GetParametersIncludingInitializerObject()
}
return Parameters;
}

internal ConstructorInfo WithInteropTypeInfo()
{
return new ConstructorInfo()
{
Name = Name,
Parameters = [.. Parameters.Select(p => p.WithInteropTypeInfo())],
InitializerObject = InitializerObject?.WithInteropTypeInfo(),
MemberInitializers = [.. MemberInitializers.Select(p => p.WithInteropTypeInfo())],
Type = Type.AsInteropTypeInfo(),
};
}
}
12 changes: 0 additions & 12 deletions src/TypeShim.Generator/Parsing/MethodInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,6 @@ public MethodInfo WithoutInstanceParameter()
};
}

public MethodInfo WithInteropTypeInfo()
{
return new MethodInfo
{
IsStatic = this.IsStatic,
Name = this.Name,
Parameters = [.. this.Parameters.Select(p => p.WithInteropTypeInfo())],
ReturnType = this.ReturnType.AsInteropTypeInfo(),
Comment = this.Comment,
};
}

internal bool MatchesDisposeSignature()
{
return Name == "Dispose" && !Parameters.Any(p => !p.IsInjectedInstanceParameter) && ReturnType.ManagedType == KnownManagedType.Void;
Expand Down
10 changes: 0 additions & 10 deletions src/TypeShim.Generator/Parsing/MethodParameterInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,4 @@ internal class MethodParameterInfo
internal required string Name { get; init; }
internal required bool IsInjectedInstanceParameter { get; init; }
internal required InteropTypeInfo Type { get; init; }

internal MethodParameterInfo WithInteropTypeInfo()
{
return new MethodParameterInfo
{
Name = this.Name,
IsInjectedInstanceParameter = this.IsInjectedInstanceParameter,
Type = Type.AsInteropTypeInfo(),
};
}
}
15 changes: 0 additions & 15 deletions src/TypeShim.Generator/Parsing/PropertyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,4 @@ internal sealed class PropertyInfo
internal required MethodInfo? InitMethod { get; init; }

internal required CommentInfo? Comment { get; init; }

public PropertyInfo WithInteropTypeInfo()
{
return new PropertyInfo
{
Name = this.Name,
IsStatic = this.IsStatic,
IsRequired = this.IsRequired,
Type = this.Type.AsInteropTypeInfo(),
GetMethod = this.GetMethod.WithInteropTypeInfo(),
SetMethod = this.SetMethod?.WithInteropTypeInfo(),
InitMethod = this.InitMethod?.WithInteropTypeInfo(),
Comment = this.Comment,
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ private void RenderParameterList(IEnumerable<MethodParameterInfo> parameterInfos
ctx.Append(parameterInfo.Name).Append(": ");

bool isDelegate = parameterInfo.Type.IsDelegateType() || (parameterInfo.Type.IsNullableType && parameterInfo.Type.TypeArgument!.IsDelegateType());
TypeShimSymbolType returnSymbolType = parameterInfo.Type is { RequiresTypeConversion: true, SupportsTypeConversion: true } && !isDelegate
TypeShimSymbolType returnSymbolType = !isDelegate && parameterInfo.Type is { RequiresTypeConversion: true, SupportsTypeConversion: true }
? TypeShimSymbolType.ProxyInitializerUnion
: TypeShimSymbolType.None;
TypeScriptSymbolNameRenderer.Render(parameterInfo.Type, ctx, returnSymbolType, parameterSymbolType: TypeShimSymbolType.Proxy, interop: false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ private void RenderClassInteropMethods(ClassInfo classInfo)
{
if (classInfo.Constructor is ConstructorInfo constructorInfo)
{
constructorInfo = constructorInfo.WithInteropTypeInfo();
RenderInteropMethodSignature(constructorInfo.Name, constructorInfo.GetParametersIncludingInitializerObject(), constructorInfo.Type);
}
foreach (MethodInfo methodInfo in GetAllMethods(classInfo))
Expand Down
Loading