AutoSource 1.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package AutoSource --version 1.1.0                
NuGet\Install-Package AutoSource -Version 1.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AutoSource" Version="1.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutoSource --version 1.1.0                
#r "nuget: AutoSource, 1.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AutoSource as a Cake Addin
#addin nuget:?package=AutoSource&version=1.1.0

// Install AutoSource as a Cake Tool
#tool nuget:?package=AutoSource&version=1.1.0                

AutoSource

Build Status NuGet Status

NuGet packages

https://nuget.org/packages/AutoSource/

Files included

<details> <summary><a href="https://github.com/distantcam/AutoSource/blob/main/src/AutoSource/Source/CodeBuilder.cs">CodeBuilder.cs</a></summary>

using global::Microsoft.CodeAnalysis;
using global::Microsoft.CodeAnalysis.Text;
using global::System.Text;

#nullable enable

namespace AutoSource
{
    internal class CodeBuilder
    {
        private readonly StringBuilder _stringBuilder = new();
        private int _indent = 0;

        public CodeBuilder AppendLine()
        {
            _stringBuilder.AppendLine();
            return this;
        }
        public CodeBuilder AppendLine(string line)
        {
            _stringBuilder.AppendLine(Indent + line);
            return this;
        }

        public void IncreaseIndent() { _indent++; }
        public void DecreaseIndent()
        {
            if (_indent > 0)
            {
                _indent--;
            }
        }

        public CodeBuilder StartBlock()
        {
            AppendLine("{");
            IncreaseIndent();
            return this;
        }
        public CodeBuilder EndBlock()
        {
            DecreaseIndent();
            AppendLine("}");
            return this;
        }

        public char IndentChar { get; set; } = '\t';
        public string Indent => new string(IndentChar, _indent);

        public IDisposable StartPartialType(ITypeSymbol type)
        {
            var ns = type.ContainingNamespace.IsGlobalNamespace
                    ? null
                    : type.ContainingNamespace.ToString();
            var typeKeyword = type.IsRecord
                ? "record"
                : type.IsValueType
                    ? "struct"
                    : "class";

            if (!string.IsNullOrEmpty(ns))
            {
                AppendLine($"namespace {ns}");
                StartBlock();
            }

            var typeStack = new Stack<string>();
            var containingType = type.ContainingType;
            while (containingType is not null)
            {
                var contTypeKeyword = containingType.IsRecord
                    ? "record"
                    : containingType.IsValueType
                        ? "struct"
                        : "class";
                var typeName = containingType.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat);
                typeStack.Push(contTypeKeyword + " " + typeName);
                containingType = containingType.ContainingType;
            }

            var nestedCount = typeStack.Count;
            while (typeStack.Count > 0)
            {
                AppendLine($"partial {typeStack.Pop()}");
                StartBlock();
            }

            AppendLine($"partial {typeKeyword} {type.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat)}");
            StartBlock();

            return new CloseBlock(this, 1 + nestedCount + (ns != null ? 1 : 0));
        }

        public static implicit operator SourceText(CodeBuilder codeBuilder)
            => SourceText.From(codeBuilder._stringBuilder.ToString(), Encoding.UTF8);

        private readonly struct CloseBlock : IDisposable
        {
            private readonly CodeBuilder _codeBuilder;
            private readonly int _count;
            public CloseBlock(CodeBuilder codeBuilder, int count) { _codeBuilder = codeBuilder; _count = count; }
            public void Dispose() { for (var i = 0; i < _count; i++) _codeBuilder.EndBlock(); }
        }
    }
}

</details>

<details> <summary><a href="https://github.com/distantcam/AutoSource/blob/main/src/AutoSource/Source/SourceDisplayFormats.cs">SourceDisplayFormats.cs</a></summary>

using global::Microsoft.CodeAnalysis;

#nullable enable

namespace AutoSource
{
    internal static class SourceDisplayFormats
    {
        public static readonly SymbolDisplayFormat FullyQualifiedParameterFormat = SymbolDisplayFormat.FullyQualifiedFormat
            .WithParameterOptions(
                SymbolDisplayParameterOptions.IncludeName |
                SymbolDisplayParameterOptions.IncludeType |
                SymbolDisplayParameterOptions.IncludeParamsRefOut
            );
    }
}

</details>

<details> <summary><a href="https://github.com/distantcam/AutoSource/blob/main/src/AutoSource/Source/SourceTools.cs">SourceTools.cs</a></summary>

using global::Microsoft.CodeAnalysis;
using global::Microsoft.CodeAnalysis.CSharp.Syntax;

#nullable enable

namespace AutoSource
{
    internal static class SourceTools
    {
        public static bool IsCorrectAttribute(string attributeName, SyntaxNode syntaxNode, CancellationToken cancellationToken)
        {
            if (syntaxNode is not AttributeSyntax attribute) return false;
            var name = attribute.Name switch
            {
                SimpleNameSyntax ins => ins.Identifier.Text,
                QualifiedNameSyntax qns => qns.Right.Identifier.Text,
                _ => null
            };
            return name == attributeName || name == attributeName + "Attribute";
        }

        public static IMethodSymbol? GetMethodFromAttribute(GeneratorSyntaxContext context, CancellationToken cancellationToken)
        {
            var attributeSyntax = (AttributeSyntax)context.Node;
            if (attributeSyntax.Parent?.Parent is not MethodDeclarationSyntax methodNode) return null;
            if (context.SemanticModel.GetDeclaredSymbol(methodNode) is not IMethodSymbol method) return null;
            return method;
        }

        public static ITypeSymbol? GetTypeFromAttribute(GeneratorSyntaxContext context, CancellationToken cancellationToken)
        {
            var attributeSyntax = (AttributeSyntax)context.Node;

            // "attribute.Parent" is "AttributeListSyntax"
            // "attribute.Parent.Parent" is a C# fragment the attributes are applied to
            TypeDeclarationSyntax? typeNode = attributeSyntax.Parent?.Parent switch
            {
                ClassDeclarationSyntax classDeclarationSyntax => classDeclarationSyntax,
                RecordDeclarationSyntax recordDeclarationSyntax => recordDeclarationSyntax,
                StructDeclarationSyntax structDeclarationSyntax => structDeclarationSyntax,
                _ => null
            };

            if (typeNode == null) return null;
            if (context.SemanticModel.GetDeclaredSymbol(typeNode) is not ITypeSymbol type) return null;
            return type;
        }
    }
}

</details>

There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.4.3 269 8/28/2023
1.4.2 118 8/28/2023
1.4.1 114 8/27/2023
1.4.0 126 8/27/2023
1.3.0 140 8/12/2023
1.2.1 202 7/9/2023
1.2.0 151 7/8/2023
1.1.0 141 7/8/2023
1.0.1 144 7/8/2023
1.0.0 142 7/8/2023