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 @@ -19,7 +19,6 @@ public class ExposeAttributeGenerator : IIncrementalGenerator
private static IReadOnlyList<GeneratorPart<ExposeAttributePartInput>> Parts { get; } =
[
new HeaderPart<ExposeAttributePartInput>(),
new ExposeUsingsPart(),
new ExposeParentScopedPart([
new ExposeDeclarationPart(),
new ScopedPart<ExposeAttributePartInput>([
Expand All @@ -45,7 +44,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
{
var syntax = (StructDeclarationSyntax)ctx.TargetNode;
var attribute = ctx.Attributes.First();
var interfaces = attribute.GetTypesFromConstructor(TypeKind.Interface);
var interfaces = attribute
.GetTypesFromConstructor(TypeKind.Interface)
.Select(c => new ExposeInterfaceInfo(c))
.ToImmutableList();
return (syntax, interfaces);
});

Expand All @@ -58,7 +60,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
{
var syntax = (StructDeclarationSyntax)ctx.TargetNode;
var attribute = ctx.Attributes.First();
var types = attribute.GetTypesFromConstructor(TypeKind.Struct);
var types = attribute
.GetTypesFromConstructor(TypeKind.Struct)
.Select(c => new ExposeTypeInfo(c))
.ToImmutableList();
return (syntax, types);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,17 @@

namespace Appegy.Union.Generator;

public record struct ExposeAttributePartInput(StructDeclarationSyntax Syntax, IReadOnlyList<INamedTypeSymbol> Types, IReadOnlyList<INamedTypeSymbol> Interfaces);
public record struct ExposeAttributePartInput(StructDeclarationSyntax Syntax, IReadOnlyList<ExposeTypeInfo> Types, IReadOnlyList<ExposeInterfaceInfo> Interfaces);

public readonly struct ExposeTypeInfo(INamedTypeSymbol symbol)
{
public string Name => Symbol.Name;
public readonly INamedTypeSymbol Symbol = symbol;
public readonly string FieldName = symbol.GetFieldName();
}

public readonly struct ExposeInterfaceInfo(INamedTypeSymbol symbol)
{
public readonly INamedTypeSymbol Symbol = symbol;
public readonly string FullName = symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Appegy.Union.Generator;

public class ImplementIndexers : ExposeInterfacePart.Implementation
{
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<INamedTypeSymbol> types)
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<ExposeTypeInfo> types)
{
switch (member)
{
Expand All @@ -18,7 +18,7 @@ public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol me
}
}

private static void GenerateIndexer(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateIndexer(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
GenerateIndexerHeader(codeWriter, propertySymbol);
codeWriter.WriteLine("{");
Expand All @@ -38,7 +38,7 @@ private static void GenerateIndexer(IndentedTextWriter codeWriter, IPropertySymb
private static void GenerateIndexerHeader(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol)
{
codeWriter.Write("public ");
codeWriter.Write(propertySymbol.Type.ToDisplayString());
codeWriter.Write(propertySymbol.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
codeWriter.Write(" this[");
var parameters = propertySymbol.Parameters;
for (var i = 0; i < parameters.Length; i++)
Expand All @@ -47,14 +47,14 @@ private static void GenerateIndexerHeader(IndentedTextWriter codeWriter, IProper
{
codeWriter.Write(", ");
}
codeWriter.Write(parameters[i].Type.ToDisplayString());
codeWriter.Write(parameters[i].Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
codeWriter.Write(" ");
codeWriter.Write(parameters[i].Name);
}
codeWriter.WriteLine("]");
}

private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
codeWriter.WriteLine("get");
codeWriter.WriteLine("{");
Expand All @@ -67,19 +67,19 @@ private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertyS
codeWriter.Write("case Kind.");
codeWriter.Write(type.Name);
codeWriter.Write(": return ");
codeWriter.WriteFieldName(type);
codeWriter.Write(type.FieldName);
codeWriter.Write("[");
GenerateIndexerArguments(codeWriter, propertySymbol);
codeWriter.WriteLine("];");
}
codeWriter.WriteLine("default: throw new InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.WriteLine("default: throw new global::System.InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.Indent--;
codeWriter.WriteLine("}");
codeWriter.Indent--;
codeWriter.WriteLine("}");
}

private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
codeWriter.WriteLine("set");
codeWriter.WriteLine("{");
Expand All @@ -92,13 +92,13 @@ private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertyS
codeWriter.Write("case Kind.");
codeWriter.Write(type.Name);
codeWriter.Write(": ");
codeWriter.WriteFieldName(type);
codeWriter.Write(type.FieldName);
codeWriter.Write("[");
GenerateIndexerArguments(codeWriter, propertySymbol);
codeWriter.Write("] = value; break;");
codeWriter.WriteLine();
}
codeWriter.WriteLine("default: throw new InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.WriteLine("default: throw new global::System.InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.Indent--;
codeWriter.WriteLine("}");
codeWriter.Indent--;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Appegy.Union.Generator;

public class ImplementMethods : ExposeInterfacePart.Implementation
{
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<INamedTypeSymbol> types)
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<ExposeTypeInfo> types)
{
switch (member)
{
Expand All @@ -18,7 +18,7 @@ public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol me
}
}

private static void GenerateMethod(IndentedTextWriter codeWriter, IMethodSymbol methodSymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateMethod(IndentedTextWriter codeWriter, IMethodSymbol methodSymbol, IReadOnlyList<ExposeTypeInfo> types)
{
GenerateMethodHeader(codeWriter, methodSymbol);

Expand All @@ -34,7 +34,7 @@ private static void GenerateMethod(IndentedTextWriter codeWriter, IMethodSymbol
private static void GenerateMethodHeader(IndentedTextWriter codeWriter, IMethodSymbol methodSymbol)
{
codeWriter.Write("public ");
codeWriter.Write(methodSymbol.ReturnType.ToDisplayString());
codeWriter.Write(methodSymbol.ReturnType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
codeWriter.Write(" ");
codeWriter.Write(methodSymbol.Name);

Expand Down Expand Up @@ -71,7 +71,7 @@ private static void GenerateMethodHeader(IndentedTextWriter codeWriter, IMethodS
}
}

codeWriter.Write(param.Type.ToDisplayString());
codeWriter.Write(param.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
codeWriter.Write(" ");
codeWriter.Write(param.Name);
}
Expand Down Expand Up @@ -119,7 +119,7 @@ void addConstraint(string constraint)
}
foreach (var constraint in typeParameter.ConstraintTypes)
{
addConstraint(constraint.ToDisplayString());
addConstraint(constraint.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat));
}
if (typeParameter.HasConstructorConstraint)
{
Expand All @@ -131,7 +131,7 @@ void addConstraint(string constraint)
codeWriter.WriteLine();
}

private static void GenerateMethodBody(IndentedTextWriter codeWriter, IMethodSymbol methodSymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateMethodBody(IndentedTextWriter codeWriter, IMethodSymbol methodSymbol, IReadOnlyList<ExposeTypeInfo> types)
{
codeWriter.WriteLine("switch (_type)");
codeWriter.WriteLine("{");
Expand All @@ -148,7 +148,7 @@ private static void GenerateMethodBody(IndentedTextWriter codeWriter, IMethodSym
codeWriter.Write("return ");
}

codeWriter.WriteFieldName(type);
codeWriter.Write(type.FieldName);
codeWriter.Write(".");
codeWriter.Write(methodSymbol.Name);

Expand All @@ -168,7 +168,7 @@ private static void GenerateMethodBody(IndentedTextWriter codeWriter, IMethodSym
codeWriter.WriteLine(");");
}

codeWriter.WriteLine("default: throw new InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.WriteLine("default: throw new global::System.InvalidOperationException($\"Unknown type of union: {_type}\");");

codeWriter.Indent--;
codeWriter.WriteLine("}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace Appegy.Union.Generator;

public class ImplementProperties : ExposeInterfacePart.Implementation
{
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<INamedTypeSymbol> types)
public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<ExposeTypeInfo> types)
{
switch (member)
{
Expand All @@ -18,7 +18,7 @@ public override bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol me
}
}

private static void GenerateProperty(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateProperty(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
GeneratePropertyHeader(codeWriter, propertySymbol);
codeWriter.WriteLine("{");
Expand All @@ -43,7 +43,7 @@ private static void GeneratePropertyHeader(IndentedTextWriter codeWriter, IPrope
codeWriter.WriteLine(propertySymbol.Name);
}

private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
codeWriter.WriteLine("get");
codeWriter.WriteLine("{");
Expand All @@ -56,19 +56,19 @@ private static void GenerateGetterBody(IndentedTextWriter codeWriter, IPropertyS
codeWriter.Write("case Kind.");
codeWriter.Write(type.Name);
codeWriter.Write(": return ");
codeWriter.WriteFieldName(type);
codeWriter.Write(type.FieldName);
codeWriter.Write(".");
codeWriter.Write(propertySymbol.Name);
codeWriter.WriteLine(";");
}
codeWriter.WriteLine("default: throw new InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.WriteLine("default: throw new global::System.InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.Indent--;
codeWriter.WriteLine("}");
codeWriter.Indent--;
codeWriter.WriteLine("}");
}

private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<INamedTypeSymbol> types)
private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertySymbol propertySymbol, IReadOnlyList<ExposeTypeInfo> types)
{
codeWriter.WriteLine("set");
codeWriter.WriteLine("{");
Expand All @@ -81,13 +81,13 @@ private static void GenerateSetterBody(IndentedTextWriter codeWriter, IPropertyS
codeWriter.Write("case Kind.");
codeWriter.Write(type.Name);
codeWriter.Write(": ");
codeWriter.WriteFieldName(type);
codeWriter.Write(type.FieldName);
codeWriter.Write(".");
codeWriter.Write(propertySymbol.Name);
codeWriter.Write(" = value; break;");
codeWriter.WriteLine();
}
codeWriter.WriteLine("default: throw new InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.WriteLine("default: throw new global::System.InvalidOperationException($\"Unknown type of union: {_type}\");");
codeWriter.Indent--;
codeWriter.WriteLine("}");
codeWriter.Indent--;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public override void Generate(IndentedTextWriter codeWriter, ExposeAttributePart
for (var i = 0; i < interfaces.Count; i++)
{
var @interface = interfaces[i];
codeWriter.Write(@interface.Name);
codeWriter.Write(@interface.FullName);
if (i != interfaces.Count - 1)
{
codeWriter.WriteLine(",");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public class ExposeInterfacePart(IReadOnlyList<ExposeInterfacePart.Implementatio
{
public abstract class Implementation
{
public abstract bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<INamedTypeSymbol> types);
public abstract bool TryGenerateMember(IndentedTextWriter codeWriter, ISymbol member, IReadOnlyList<ExposeTypeInfo> types);
}

public IReadOnlyList<Implementation> Implementers { get; } = implementers;
Expand All @@ -22,13 +22,13 @@ public override void Generate(IndentedTextWriter codeWriter, ExposeAttributePart
{
var @interface = interfaces[index];
codeWriter.Write("#region Implement ");
codeWriter.WriteLine(@interface.Name);
codeWriter.WriteLine(@interface.FullName);
codeWriter.WriteLine();

ImplementInterface(codeWriter, types, @interface.GetMembers());
ImplementInterface(codeWriter, types, @interface.Symbol.GetMembers());

codeWriter.Write("#endregion Implement ");
codeWriter.WriteLine(@interface.Name);
codeWriter.WriteLine(@interface.FullName);

if (index < interfaces.Count - 1)
{
Expand All @@ -37,7 +37,7 @@ public override void Generate(IndentedTextWriter codeWriter, ExposeAttributePart
}
}

private void ImplementInterface(IndentedTextWriter codeWriter, IReadOnlyList<INamedTypeSymbol> types, IReadOnlyList<ISymbol> members)
private void ImplementInterface(IndentedTextWriter codeWriter, IReadOnlyList<ExposeTypeInfo> types, IReadOnlyList<ISymbol> members)
{
var needNewLine = false;
foreach (var member in members)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ public override void Generate(IndentedTextWriter codeWriter, UnionAttributePartI
codeWriter.Write("public static bool operator ==(");
codeWriter.Write(syntax.Identifier.Text);
codeWriter.Write(" a, ");
codeWriter.Write(type.Name);
codeWriter.Write(type.FullName);
codeWriter.WriteLine(" b) => a.Equals(b);");

codeWriter.Write("public static bool operator !=(");
codeWriter.Write(syntax.Identifier.Text);
codeWriter.Write(" a, ");
codeWriter.Write(type.Name);
codeWriter.Write(type.FullName);
codeWriter.WriteLine(" b) => !a.Equals(b);");
}
}
Expand Down
Loading