Name Message Date
📄 Poc.csproj POC 1 day ago
📄 Program.cs POC 1 day ago
📄 Program.cs
using System;
using System.Linq;
using System.Reflection;
using Microsoft.Build.Locator;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.MSBuild;

MSBuildLocator.RegisterDefaults();

using var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(@"..\Reacher.slnx");

var project = solution.Projects.First(p => p.AssemblyName == Assembly.GetExecutingAssembly().GetName().Name);

var compilation = await project.GetCompilationAsync();
if (compilation is null)
{
    Console.WriteLine($"Cannot get compilation for {project.Name}");
    return;
}

var entryPoint = compilation.GetEntryPoint(default);
if (entryPoint is null)
{
    Console.WriteLine($"No entry point in {project.Name}");
    return;
#pragma warning disable CS0162 // Intentional to test reachability
    Console.WriteLine($"No entry point in {project.Name}");
#pragma warning restore CS0162
}

foreach (var declaration in entryPoint.DeclaringSyntaxReferences)
{
    Console.WriteLine($"Entry point was declared at {declaration.SyntaxTree.GetLineSpan(declaration.Span)}");
    var semanticModel = compilation.GetSemanticModel(declaration.SyntaxTree, ignoreAccessibility: true);

    var statements = declaration.GetSyntax().DescendantNodes().OfType<StatementSyntax>();

    foreach (var statement in statements)
    {
        var controlFlowAnalysis = semanticModel.AnalyzeControlFlow(statement);
        Console.WriteLine(
            $"Is {statement.Kind()} at {declaration.SyntaxTree.GetLineSpan(statement.Span)} reachable: {controlFlowAnalysis?.StartPointIsReachable}"
        );
        if (false && true)
        {
#pragma warning disable CS0162 // Intentional to test reachability
            Console.WriteLine("Hello");
#pragma warning restore CS0162
        }
    }
}