Skip to content

Commit

Permalink
Cleaning up syntax finder a bit. Add readme (#1121)
Browse files Browse the repository at this point in the history
  • Loading branch information
belav authored Jan 14, 2024
1 parent 0f07ce0 commit 69dc6ef
Show file tree
Hide file tree
Showing 7 changed files with 317 additions and 249 deletions.
110 changes: 110 additions & 0 deletions Src/SyntaxFinder/ExampleWalker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
namespace SyntaxFinder;

using System.Collections.Concurrent;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

public class ExampleWalker : CSharpSyntaxWalker
{
public static readonly ConcurrentDictionary<string, List<string>> MembersInType = new();
public static int Total;
public static int Matching;
private readonly string file;
private bool wroteFile;
private readonly int maxCodeWrites = 250;
private int codeWrites = 0;

public ExampleWalker(string file)
{
this.file = file;
}

public override void VisitCompilationUnit(CompilationUnitSyntax node)
{
this.VisitType(node, node.Members);
base.VisitCompilationUnit(node);
}

private void VisitType(CSharpSyntaxNode node, SyntaxList<MemberDeclarationSyntax> members)
{
foreach (var member in members)
{
MembersInType.AddOrUpdate(
node.GetType().Name,
new List<string>(),
(key, list) =>
{
if (!list.Contains(member.GetType().Name))
{
list.Add(member.GetType().Name);
}

return list;
}
);
}
}

public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
if (
(
node.Parent is TypeDeclarationSyntax typeDeclarationSyntax
&& node == typeDeclarationSyntax.Members.First()
) || node.GetLeadingTrivia().Any(o => o.IsComment() || node.AttributeLists.Any())
)
{
base.VisitMethodDeclaration(node);
return;
}

Interlocked.Increment(ref Total);
this.WriteCode(node.Parent!);

if (node.GetLeadingTrivia().Any(o => o.Kind() is SyntaxKind.EndOfLineTrivia))
{
Interlocked.Increment(ref Matching);
}

base.VisitMethodDeclaration(node);
}

private void WriteCode(SyntaxNode syntaxNode)
{
if (this.codeWrites < this.maxCodeWrites)
{
Interlocked.Increment(ref this.codeWrites);
Console.WriteLine(syntaxNode.SyntaxTree.GetText().ToString(syntaxNode.Span));
}
}

private void WriteFilePath()
{
if (!this.wroteFile)
{
Console.WriteLine(this.file);
this.wroteFile = true;
}
}

private static bool IsMultiline(SyntaxNode syntaxNode)
{
var lineSpan = syntaxNode.SyntaxTree.GetLineSpan(syntaxNode.Span);
return lineSpan.StartLinePosition.Line != lineSpan.EndLinePosition.Line;
}

public static void WriteResult()
{
foreach (var entry in MembersInType)
{
Console.WriteLine(entry.Key);
foreach (var member in entry.Value.OrderBy(o => o))
{
Console.WriteLine(" " + member);
}
}

ResultWriter.WriteMatching(Total, Matching);
}
}
85 changes: 85 additions & 0 deletions Src/SyntaxFinder/Ignored.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
namespace SyntaxFinder;

public static class Ignored
{
public static bool Is(string file)
{
return ignored.Any(file.Replace("\\", "/").Contains);
}

private static string[] ignored = new[]
{
"roslyn/src/Compilers/Test/Core/Assert/ConditionalFactAttribute.cs",
"roslyn/src/Compilers/Test/Core/Compilation/RuntimeUtilities.cs",
"runtime/src/libraries/System.Net.Primitives/tests/FunctionalTests/SocketAddressTest.cs",
"runtime/src/libraries/System.Security.Cryptography.Pkcs/tests/SignedCms/SignedDocuments.cs",
"aspnetcore/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Controllers/HomeController.cs",
"aspnetcore/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/EmptyExplicitExpression.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/EmptyImplicitExpression.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/EmptyImplicitExpressionInCode.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/EmptyImplicitExpressionInCode.Tabs.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/ExplicitExpressionAtEOF.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/HelpersMissingCloseParen.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/HelpersMissingOpenBrace.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/HiddenSpansInCode.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/HelpersMissingOpenParen.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/ImplicitExpressionAtEOF.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/Inherits.Designtime.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/Inherits.Runtime.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/OpenedIf.DesignTime.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/OpenedIf.DesignTime.Tabs.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/ParserError.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/RazorComments.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/RazorComments.DesignTime.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/Sections.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/UnfinishedExpressionInCode.cs",
"AspNetWebStack/test/System.Web.Razor.Test/TestFiles/CodeGenerator/CS/Output/UnfinishedExpressionInCode.Tabs.cs",
"runtime/src/libraries/System.Text.Encoding.CodePages/src/System/Text/EncodingTable.Data.cs",
"runtime/src/libraries/System.Text.Json/tests/TrimmingTests/Collections/ICollection.cs",
"runtime/src/tests/JIT/jit64/opt/cse/HugeArray.cs",
"runtime/src/tests/JIT/jit64/opt/rngchk/RngchkStress2.cs",
"runtime/src/tests/JIT/jit64/opt/cse/HugeArray1.cs",
"runtime/src/tests/JIT/Methodical/largeframes/skip2/skippage2.cs",
"runtime/src/tests/JIT/Methodical/largeframes/skip6/skippage6.cs",
"runtime/src/tests/JIT/Performance/CodeQuality/Bytemark/neural-dat.cs",
"runtime/src/tests/JIT/Regression/JitBlue/GitHub_10215/GitHub_10215.cs",
"aspnetcore/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Await_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ComplexTagHelpers_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ComplexTagHelpers_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/EmptyAttributeTagHelpers_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/EmptyAttributeTagHelpers_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/EmptyExplicitExpression_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/EmptyImplicitExpressionInCode_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/EmptyImplicitExpression_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ExplicitExpressionAtEOF_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/HiddenSpansInCode_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/HiddenSpansInCode_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ImplicitExpressionAtEOF_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/IncompleteDirectives_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocks_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Markup_InCodeBlocks_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/OpenedIf_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ParserError_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/OpenedIf_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/ParserError_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Sections_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/Sections_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/SingleLineControlFlowStatements_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/SingleLineControlFlowStatements_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TransitionsInTagHelperAttributes_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/UnfinishedExpressionInCode_Runtime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/UnfinishedExpressionInCode_DesignTime.codegen.cs",
"aspnetcore/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/CodeGenerationIntegrationTest/TransitionsInTagHelperAttributes_Runtime.codegen.cs",
"runtime/src/tests/JIT/jit64/opt/cse/hugeSimpleExpr1.cs",
"runtime/src/tests/JIT/jit64/opt/cse/HugeField1.cs",
"runtime/src/tests/JIT/jit64/opt/cse/HugeField2.cs",
"roslyn/src/Compilers/Test/Resources/Core/SymbolsTests/Metadata/public-and-private.cs",
"runtime/src/tests/JIT/jit64/opt/cse/hugeexpr1.cs",
"runtime/src/tests/Loader/classloader/generics/Instantiation/Nesting/NestedGenericClasses.cs",
"runtime/src/tests/Loader/classloader/generics/Instantiation/Nesting/NestedGenericTypesMix.cs",
"runtime/src/tests/Loader/classloader/generics/Instantiation/Nesting/NestedGenericStructs.cs",
};
}
58 changes: 58 additions & 0 deletions Src/SyntaxFinder/ObjectInitializerWalker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
namespace SyntaxFinder;

using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

public class ObjectInitializerWalker : CSharpSyntaxWalker
{
private static int total;
private static int matching;
private static double totalExpressions;
private readonly string file;
private static HashSet<string> matchingFiles = new();

public ObjectInitializerWalker(string file)
{
this.file = file;
}

public override void VisitInitializerExpression(InitializerExpressionSyntax node)
{
if (node.Kind() is SyntaxKind.ObjectInitializerExpression)
{
this.VisitNode(node);
}

base.VisitInitializerExpression(node);
}

private void VisitNode(InitializerExpressionSyntax node)
{
total++;

totalExpressions += node.Expressions.Count;

if (
node.Expressions.Any(
o => o.GetLeadingTrivia().Any(o => o.Kind() is SyntaxKind.EndOfLineTrivia)
)
)
{
matching++;
matchingFiles.Add(
node.SyntaxTree.GetLineSpan(node.Span).StartLinePosition.Line + " - " + this.file
);
}
}

public static void WriteResult()
{
foreach (var file in matchingFiles)
{
Console.WriteLine(file);
}
ResultWriter.WriteResult("Avg Expressions", (totalExpressions / total).ToString());

ResultWriter.WriteMatching(total, matching);
}
}
Loading

0 comments on commit 69dc6ef

Please sign in to comment.