RSCG – InlineComposition

 
 

name InlineComposition
nuget https://www.nuget.org/packages/InlineComposition/
link https://github.com/BlackWhiteYoshi/InlineComposition
author Black White Yoshi

Mixin classes and interfaces together

 

This is how you can use InlineComposition .

The code that you start with is


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>


	
	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>


	
	<ItemGroup>
	  <PackageReference Include="InlineComposition" Version="1.4.0">
	    <PrivateAssets>all</PrivateAssets>
	    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
	  </PackageReference>
	</ItemGroup>

	
</Project>


The code that you will use is


// See https://aka.ms/new-console-template for more information
using MixinConsoleDemo;

Console.WriteLine("Hello, World!");
Employee p = new Employee();
p.Name="Andrei Ignat";
p.Age = 55;
p.Salary = 1000;
p.Id = 1;
Console.WriteLine($"Name: {p.Name}, Age: {p.Age}, Salary: {p.Salary}");



using InlineCompositionAttributes;

namespace MixinConsoleDemo;
[InlineBase]
internal class Person
{
    
    public string Name { get; set; } = string.Empty;
        public int Age { get; set; }
    
}




using InlineCompositionAttributes;

namespace MixinConsoleDemo;
[Inline<Person,IId>]
internal partial class Employee
{
    public decimal Salary { get; set; }
}



using InlineCompositionAttributes;

namespace MixinConsoleDemo;
[InlineBase]
internal class IId
{
    public int Id { get; set; }
}


 

The code that is generated is

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T8">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7, T8> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T8">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T9">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7, T8, T9> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T8">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T9">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T10">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T8">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T9">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T10">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T11">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : Attribute { }

/// <summary>
/// Generates a partial class/struct which includes all members listed in the typeParams.
/// </summary>
/// <typeparam name="T1">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T2">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T3">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T4">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T5">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T6">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T7">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T8">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T9">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T10">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T11">class/struct which members gets inlined.</typeparam>
/// <typeparam name="T12">class/struct which members gets inlined.</typeparam>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineAttribute<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> : Attribute { }

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// <para>Marks this class/struct as inlineable, so it can be listed in a <see cref="InlineAttribute{T1}"/> Attribute.</para>
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineBaseAttribute : Attribute {
    /// <summary>
    /// <para>If set all occurrences of the type of the inlineBase class/struct get replaced with the type of the inlining class/struct.</para>
    /// <para>e.g. if "Example" inlines "Test" with this option enabled, all occurrences of type "Test" inside class/struct "Test" will be mapped to "Example".</para>
    /// </summary>
    public bool MapBaseType { get; init; }

    /// <summary>
    /// If set the generator ignores the inherited class and implemented interfaces of this type.
    /// </summary>
    public bool IgnoreInheritenceAndImplements { get; init; }

    /// <summary>
    /// If set attributes of this class/struct are inlined as well.<br />
    /// The attribute [InlineBase] itself is ignored.
    /// </summary>
    public bool InlineAttributes { get; init; }
}

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// The Method under this attribute will be inlined in the constructor.
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineConstructorAttribute : Attribute {
    /// <summary>
    /// <para>Modifiers e.g. "public", "protected", "private"</para>
    /// <para>If null, the method modifiers will be taken.</para>
    /// </summary>
    public string? Modifiers { get; init; }

    /// <summary>
    /// Indicates whether this method gets inlined before the other constructors or after.
    /// </summary>
    public bool First { get; init; }
}

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// The Method under this attribute will be inlined in the finalizer.
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineFinalizerAttribute : Attribute {
    /// <summary>
    /// Indicates whether this method gets inlined before the other finalizers or after.
    /// </summary>
    public bool First { get; init; }
}

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// The Method under this attribute will be inlined in the method given by <see cref="MethodName"/>.
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class InlineMethodAttribute : Attribute {
    /// <summary>
    /// The method name as string literal.
    /// </summary>
    public required string MethodName { get; init; }

    /// <summary>
    /// <para>Modifiers e.g. "public static extern", "protected abstract"</para>
    /// <para>If null, the method modifiers will be taken.</para>
    /// </summary>
    public string? Modifiers { get; init; }

    /// <summary>
    /// Indicates whether this method gets inlined before the other methods or after.
    /// </summary>
    public bool First { get; init; }
}

#endif

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


using InlineCompositionAttributes;

namespace MixinConsoleDemo;

internal partial class Employee {
    
    public string Name { get; set; } = string.Empty;

        public int Age { get; set; }

    public int Id { get; set; }

}

// <auto-generated/>
#pragma warning disable
#nullable enable annotations


#if !INLINECOMPOSITION_EXCLUDE_ATTRIBUTES

using System;

namespace InlineCompositionAttributes;

/// <summary>
/// <para>Only usefule in a class/struct with a <see cref="InlineBaseAttribute"/>.</para>
/// <para>Skips/Ignores this member.</para>
/// </summary>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Method)]
[System.CodeDom.Compiler.GeneratedCodeAttribute("InlineComposition", "1.4.0")]
internal sealed class NoInlineAttribute : Attribute { }

#endif

Code and pdf at

https://ignatandrei.github.io/RSCG_Examples/v2/docs/InlineComposition


Posted

in

, ,

by

Tags: