From 18bcc71484dc60dab34a4c1dd3680b499adc3df2 Mon Sep 17 00:00:00 2001 From: DenChika Date: Mon, 15 Aug 2022 16:47:22 +0500 Subject: [PATCH 1/4] Done analyzer --- .gitattributes | 63 ++ .gitignore | 363 +++++++++++ .idea/.idea.AnalyzerTemplate/.idea/.gitignore | 13 + .idea/.idea.AnalyzerTemplate/.idea/.name | 1 + .../.idea/encodings.xml | 4 + .../.idea/indexLayout.xml | 8 + .../.idea.DenChika_Analyzer/.idea/.gitignore | 13 + .idea/.idea.DenChika_Analyzer/.idea/.name | 1 + .../.idea/encodings.xml | 4 + .../.idea/indexLayout.xml | 8 + .../CodeFixProviderListsAndArrays.cs | 91 +++ .../CodeFixProviderMagicLiterals.cs | 189 ++++++ ...CodeFixResourcesListsAndArrays.Designer.cs | 72 +++ .../CodeFixResourcesListsAndArrays.resx | 124 ++++ .../CodeFixResourcesMagicLiterals.Designer.cs | 72 +++ .../CodeFixResourcesMagicLiterals.resx | 124 ++++ ...enChika_Analyzer - Backup.CodeFixes.csproj | 27 + .../DenChika_Analyzer.CodeFixes.csproj | 27 + .../DenChika_Analyzer.Package.csproj | 46 ++ DenChika_Analyzer.Package/tools/install.ps1 | 272 ++++++++ DenChika_Analyzer.Package/tools/uninstall.ps1 | 279 +++++++++ .../DenChika_Analyzer.Test.csproj | 29 + DenChika_Analyzer.Test/TestClass.cs | 44 ++ .../DenChika_Analyzer.Vsix.csproj | 48 ++ .../source.extension.vsixmanifest | 24 + DenChika_Analyzer.sln | 49 ++ DenChika_Analyzer/AnalyzerListsAndArrays.cs | 78 +++ DenChika_Analyzer/AnalyzerMagicLiterals.cs | 52 ++ .../DenChika_Analyzer - Backup.csproj | 24 + DenChika_Analyzer/DenChika_Analyzer.csproj | 26 + .../ResourcesListsAndArrays.Designer.cs | 90 +++ .../ResourcesListsAndArrays.resx | 132 ++++ .../ResourcesMagicLiterals.Designer.cs | 90 +++ DenChika_Analyzer/ResourcesMagicLiterals.resx | 132 ++++ JavaDecompiler.md | 163 +++++ SharpDecompiler.md | 327 ++++++++++ TechLab1.md | 591 ++++++++++++++++++ TestProject/Program.cs | 2 + TestProject/TestProject.csproj | 10 + 39 files changed, 3712 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .idea/.idea.AnalyzerTemplate/.idea/.gitignore create mode 100644 .idea/.idea.AnalyzerTemplate/.idea/.name create mode 100644 .idea/.idea.AnalyzerTemplate/.idea/encodings.xml create mode 100644 .idea/.idea.AnalyzerTemplate/.idea/indexLayout.xml create mode 100644 .idea/.idea.DenChika_Analyzer/.idea/.gitignore create mode 100644 .idea/.idea.DenChika_Analyzer/.idea/.name create mode 100644 .idea/.idea.DenChika_Analyzer/.idea/encodings.xml create mode 100644 .idea/.idea.DenChika_Analyzer/.idea/indexLayout.xml create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixProviderListsAndArrays.cs create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixProviderMagicLiterals.cs create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.Designer.cs create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.resx create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.Designer.cs create mode 100644 DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.resx create mode 100644 DenChika_Analyzer.CodeFixes/DenChika_Analyzer - Backup.CodeFixes.csproj create mode 100644 DenChika_Analyzer.CodeFixes/DenChika_Analyzer.CodeFixes.csproj create mode 100644 DenChika_Analyzer.Package/DenChika_Analyzer.Package.csproj create mode 100644 DenChika_Analyzer.Package/tools/install.ps1 create mode 100644 DenChika_Analyzer.Package/tools/uninstall.ps1 create mode 100644 DenChika_Analyzer.Test/DenChika_Analyzer.Test.csproj create mode 100644 DenChika_Analyzer.Test/TestClass.cs create mode 100644 DenChika_Analyzer.Vsix/DenChika_Analyzer.Vsix.csproj create mode 100644 DenChika_Analyzer.Vsix/source.extension.vsixmanifest create mode 100644 DenChika_Analyzer.sln create mode 100644 DenChika_Analyzer/AnalyzerListsAndArrays.cs create mode 100644 DenChika_Analyzer/AnalyzerMagicLiterals.cs create mode 100644 DenChika_Analyzer/DenChika_Analyzer - Backup.csproj create mode 100644 DenChika_Analyzer/DenChika_Analyzer.csproj create mode 100644 DenChika_Analyzer/ResourcesListsAndArrays.Designer.cs create mode 100644 DenChika_Analyzer/ResourcesListsAndArrays.resx create mode 100644 DenChika_Analyzer/ResourcesMagicLiterals.Designer.cs create mode 100644 DenChika_Analyzer/ResourcesMagicLiterals.resx create mode 100644 JavaDecompiler.md create mode 100644 SharpDecompiler.md create mode 100644 TechLab1.md create mode 100644 TestProject/Program.cs create mode 100644 TestProject/TestProject.csproj diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/.idea/.idea.AnalyzerTemplate/.idea/.gitignore b/.idea/.idea.AnalyzerTemplate/.idea/.gitignore new file mode 100644 index 0000000..204084e --- /dev/null +++ b/.idea/.idea.AnalyzerTemplate/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/contentModel.xml +/modules.xml +/projectSettingsUpdater.xml +/.idea.AnalyzerTemplate.iml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.AnalyzerTemplate/.idea/.name b/.idea/.idea.AnalyzerTemplate/.idea/.name new file mode 100644 index 0000000..a7442d6 --- /dev/null +++ b/.idea/.idea.AnalyzerTemplate/.idea/.name @@ -0,0 +1 @@ +AnalyzerTemplate \ No newline at end of file diff --git a/.idea/.idea.AnalyzerTemplate/.idea/encodings.xml b/.idea/.idea.AnalyzerTemplate/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.AnalyzerTemplate/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.AnalyzerTemplate/.idea/indexLayout.xml b/.idea/.idea.AnalyzerTemplate/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.AnalyzerTemplate/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.DenChika_Analyzer/.idea/.gitignore b/.idea/.idea.DenChika_Analyzer/.idea/.gitignore new file mode 100644 index 0000000..6044a5b --- /dev/null +++ b/.idea/.idea.DenChika_Analyzer/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/.idea.DenChika_Analyzer.iml +/contentModel.xml +/projectSettingsUpdater.xml +/modules.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.DenChika_Analyzer/.idea/.name b/.idea/.idea.DenChika_Analyzer/.idea/.name new file mode 100644 index 0000000..15d7e0e --- /dev/null +++ b/.idea/.idea.DenChika_Analyzer/.idea/.name @@ -0,0 +1 @@ +DenChika_Analyzer \ No newline at end of file diff --git a/.idea/.idea.DenChika_Analyzer/.idea/encodings.xml b/.idea/.idea.DenChika_Analyzer/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.DenChika_Analyzer/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.DenChika_Analyzer/.idea/indexLayout.xml b/.idea/.idea.DenChika_Analyzer/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.DenChika_Analyzer/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/DenChika_Analyzer.CodeFixes/CodeFixProviderListsAndArrays.cs b/DenChika_Analyzer.CodeFixes/CodeFixProviderListsAndArrays.cs new file mode 100644 index 0000000..c560fa2 --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixProviderListsAndArrays.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Editing; +using Microsoft.CodeAnalysis.Rename; +using Microsoft.CodeAnalysis.Text; + +namespace DenChika_Analyzer.CodeFixes +{ + [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(CodeFixProviderListsAndArrays)), Shared] + public class CodeFixProviderListsAndArrays : CodeFixProvider + { + private const string title = "Replace List/Array on IReadOnlyCollection"; + + public sealed override ImmutableArray FixableDiagnosticIds + { + get { return ImmutableArray.Create(AnalyzerListsAndArrays.DiagnosticId); } + } + + public sealed override FixAllProvider GetFixAllProvider() + { + return WellKnownFixAllProviders.BatchFixer; + } + + public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + if (root.FindNode(diagnosticSpan).IsKind(SyntaxKind.GenericName)) + { + var declarationGeneric = (GenericNameSyntax) root.FindNode(diagnosticSpan); + + context.RegisterCodeFix( + CodeAction.Create( + title: title, + createChangedDocument: c => ChangeGeneric(context.Document, declarationGeneric, c), + equivalenceKey: title), + diagnostic); + } + else if (root.FindNode(diagnosticSpan).IsKind(SyntaxKind.ArrayType)) + { + var declarationArray = (ArrayTypeSyntax)root.FindNode(diagnosticSpan); + + context.RegisterCodeFix( + CodeAction.Create( + title: title, + createChangedDocument: c => ChangeArray(context.Document, declarationArray, c), + equivalenceKey: title), + diagnostic); + } + } + + private async Task ChangeGeneric( + Document document, + GenericNameSyntax genericName, + CancellationToken cancellationToken) + { + var editor = await DocumentEditor.CreateAsync(document, cancellationToken); + var newGeneric = genericName.WithIdentifier(SyntaxFactory.Identifier("IReadOnlyCollection")); + editor.ReplaceNode(genericName, newGeneric); + return editor.GetChangedDocument(); + } + + private async Task ChangeArray( + Document document, + ArrayTypeSyntax arrayType, + CancellationToken cancellationToken) + { + var editor = await DocumentEditor.CreateAsync(document, cancellationToken); + var newType = (TypeSyntax) arrayType.ChildNodes().First(); + var newName = SyntaxFactory.GenericName( + SyntaxFactory.Identifier("IReadOnlyCollection")) + .WithTypeArgumentList( + SyntaxFactory.TypeArgumentList( + SyntaxFactory.SingletonSeparatedList(newType))); + editor.ReplaceNode(arrayType, newName); + return editor.GetChangedDocument(); + } + } +} diff --git a/DenChika_Analyzer.CodeFixes/CodeFixProviderMagicLiterals.cs b/DenChika_Analyzer.CodeFixes/CodeFixProviderMagicLiterals.cs new file mode 100644 index 0000000..5876fcb --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixProviderMagicLiterals.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Editing; +using Microsoft.CodeAnalysis.Rename; +using Microsoft.CodeAnalysis.Text; + +namespace DenChika_Analyzer.CodeFixes +{ + [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(CodeFixProviderMagicLiterals)), Shared] + public class CodeFixProviderMagicLiterals : CodeFixProvider + { + private const string title = "Replace declaration on const field"; + + private Dictionary LiteralTypeToToken = new Dictionary() + { + { SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxKind.NumericLiteralExpression }, + { SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.CharKeyword)), SyntaxKind.CharacterLiteralExpression }, + { SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.StringKeyword)), SyntaxKind.StringLiteralExpression } + }; + public sealed override ImmutableArray FixableDiagnosticIds + { + get { return ImmutableArray.Create(AnalyzerLiterals.DiagnosticId); } + } + + public sealed override FixAllProvider GetFixAllProvider() + { + return WellKnownFixAllProviders.BatchFixer; + } + + public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context) + { + var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false); + + var diagnostic = context.Diagnostics.First(); + var diagnosticSpan = diagnostic.Location.SourceSpan; + var node = root.FindNode(diagnosticSpan); + if (root.FindNode(diagnosticSpan).IsKind(SyntaxKind.Argument)) + { + var literalNode = node.ChildNodes().OfType().First(); + context.RegisterCodeFix( + CodeAction.Create( + title: title, + createChangedDocument: c => ReplaceLiterals(context.Document, literalNode, c), + equivalenceKey: title), + diagnostic); + } + else + { + var literalNode = (LiteralExpressionSyntax) node; + context.RegisterCodeFix( + CodeAction.Create( + title: title, + createChangedDocument: c => ReplaceLiterals(context.Document, literalNode, c), + equivalenceKey: title), + diagnostic); + } + } + + private async Task ReplaceLiterals( + Document document, + LiteralExpressionSyntax literalExpression, + CancellationToken cancellationToken) + { + var editor = await DocumentEditor.CreateAsync(document, cancellationToken); + + var classDeclaration = literalExpression.Ancestors().OfType().First(); + + var keyword = SyntaxFactory.PredefinedType( + SyntaxFactory.Token(SyntaxKind.IntKeyword)); + + foreach (var type in LiteralTypeToToken.Keys) + { + if (literalExpression.Kind().Equals(LiteralTypeToToken[type])) + keyword = type; + + } + + var identifierName = Identifier(classDeclaration); + + var field = SyntaxFactory.FieldDeclaration( + SyntaxFactory.VariableDeclaration( + keyword) + .WithVariables( + SyntaxFactory.SingletonSeparatedList( + SyntaxFactory.VariableDeclarator( + SyntaxFactory.Identifier(identifierName)) + .WithInitializer( + SyntaxFactory.EqualsValueClause(literalExpression))))) + .WithModifiers( + SyntaxFactory.TokenList( + new[] + { + SyntaxFactory.Token(SyntaxKind.PrivateKeyword), + SyntaxFactory.Token(SyntaxKind.ConstKeyword) + })); + + editor.AddMember(classDeclaration, field); + + foreach (var node in classDeclaration.Members) + { + if (node.IsKind(SyntaxKind.MethodDeclaration) && + node.ChildNodes().OfType().ToList().Count() != 0) + ReplaceInBlock(editor, literalExpression, node, identifierName); + + if (node.IsKind(SyntaxKind.MethodDeclaration) && + node.ChildNodes().OfType().ToList().Count() != 0) + ReplaceInParameters(editor, literalExpression, node, identifierName); + } + + return editor.GetChangedDocument(); + } + + private void ReplaceInBlock( + DocumentEditor editor, + LiteralExpressionSyntax literalExpression, + MemberDeclarationSyntax member, + string identifier) + { + var block = member.ChildNodes().OfType().First(); + + if (block.DescendantNodesAndSelf().OfType().ToList().Count() != 0) + { + foreach (var literal in block.DescendantNodesAndSelf().OfType()) + { + + if (!(literal.AncestorsAndSelf().OfType().ToList().Count() != 0 || + literal.AncestorsAndSelf().OfType().ToList().Count() != 0 || + literal.AncestorsAndSelf().OfType().ToList().Count() != 0 || + literal.AncestorsAndSelf().OfType().ToList().Count() != 0 || + literal.AncestorsAndSelf().OfType().ToList().Count() != 0)) continue; + + if (!literal.ChildTokens().First().Text + .Equals(literalExpression.ChildTokens().First().Text)) continue; + + editor.ReplaceNode(literal, SyntaxFactory.IdentifierName(identifier)); + } + + } + } + + private void ReplaceInParameters( + DocumentEditor editor, + LiteralExpressionSyntax literalExpression, + MemberDeclarationSyntax member, + string identifier) + { + var parameters = member.ChildNodes().OfType().First(); + + foreach (var child in parameters.ChildNodes()) + { + if (child.IsKind(SyntaxKind.Parameter) && + child.DescendantNodesAndSelf().OfType().ToList().Count() != 0 && + child.DescendantNodesAndSelf().OfType().ToList().Count() != 0 + ) + { + var literal = child.DescendantNodesAndSelf().OfType().First(); + + if (!literal.ChildTokens().First().Text + .Equals(literalExpression.ChildTokens().First().Text)) continue; + + editor.ReplaceNode(literal, SyntaxFactory.IdentifierName(identifier)); + } + } + } + + private string Identifier(ClassDeclarationSyntax classDeclaration) + { + var number = 0; + foreach (var field in classDeclaration.ChildNodes().OfType().ToList()) + { + var identifier = field.DescendantNodes().OfType().FirstOrDefault() + .ChildTokens().FirstOrDefault().Value.ToString(); + number = int.Parse(identifier.Replace("MagicNumber", "")); + } + + return $"MagicNumber{number + 1}"; + } + } +} diff --git a/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.Designer.cs b/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.Designer.cs new file mode 100644 index 0000000..1fe059f --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DenChika_Analyzer { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class CodeFixResourcesListsAndArrays { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal CodeFixResourcesListsAndArrays() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DenChika_Analyzer.CodeFixResourcesListsAndArrays", typeof(CodeFixResourcesListsAndArrays).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Convert to 'IReadOnlyCollection<T>'. + /// + internal static string CodeFixTitle { + get { + return ResourceManager.GetString("CodeFixTitle", resourceCulture); + } + } + } +} diff --git a/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.resx b/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.resx new file mode 100644 index 0000000..290de6a --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixResourcesListsAndArrays.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Convert to 'IReadOnlyCollection<T>' + The title of the code fix. + + \ No newline at end of file diff --git a/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.Designer.cs b/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.Designer.cs new file mode 100644 index 0000000..e295462 --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DenChika_Analyzer { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class CodeFixResourcesMagicLiterals { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal CodeFixResourcesMagicLiterals() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DenChika_Analyzer.CodeFixResourcesMagicLiterals", typeof(CodeFixResourcesMagicLiterals).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Convert to IReadOnlyCollection<T>. + /// + internal static string CodeFixTitle { + get { + return ResourceManager.GetString("CodeFixTitle", resourceCulture); + } + } + } +} diff --git a/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.resx b/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.resx new file mode 100644 index 0000000..5ce1e1d --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/CodeFixResourcesMagicLiterals.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Convert to const field 'MagicNumber{N}' + The title of the code fix. + + \ No newline at end of file diff --git a/DenChika_Analyzer.CodeFixes/DenChika_Analyzer - Backup.CodeFixes.csproj b/DenChika_Analyzer.CodeFixes/DenChika_Analyzer - Backup.CodeFixes.csproj new file mode 100644 index 0000000..d2f158d --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/DenChika_Analyzer - Backup.CodeFixes.csproj @@ -0,0 +1,27 @@ + + + + netstandard2.0 + false + DenChika_Analyzer + + + + + + + + + + + + + + CodeFixResourcesOPoint.Designer.cs + + + CodeFixResourcesIpoint.resx + + + + diff --git a/DenChika_Analyzer.CodeFixes/DenChika_Analyzer.CodeFixes.csproj b/DenChika_Analyzer.CodeFixes/DenChika_Analyzer.CodeFixes.csproj new file mode 100644 index 0000000..095294b --- /dev/null +++ b/DenChika_Analyzer.CodeFixes/DenChika_Analyzer.CodeFixes.csproj @@ -0,0 +1,27 @@ + + + + netstandard2.0 + false + DenChika_Analyzer + + + + + + + + + + + + + + CodeFixResourcesOPoint.Designer.cs + + + CodeFixResourcesMagicLiterals.resx + + + + diff --git a/DenChika_Analyzer.Package/DenChika_Analyzer.Package.csproj b/DenChika_Analyzer.Package/DenChika_Analyzer.Package.csproj new file mode 100644 index 0000000..cf8aaa0 --- /dev/null +++ b/DenChika_Analyzer.Package/DenChika_Analyzer.Package.csproj @@ -0,0 +1,46 @@ + + + + netstandard2.0 + false + true + true + DenChika_Analyzer.Package + + + + DenChika_Analyzer + 1.0.0.0 + User + http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE + http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE + http://ICON_URL_HERE_OR_DELETE_THIS_LINE + http://REPOSITORY_URL_HERE_OR_DELETE_THIS_LINE + false + DenChika_Analyzer + Summary of changes made in this release of the package. + Copyright + DenChika_Analyzer, analyzers + true + true + + $(TargetsForTfmSpecificContentInPackage);_AddAnalyzersToOutput + + + + + + + + + + + + + + + + + + + diff --git a/DenChika_Analyzer.Package/tools/install.ps1 b/DenChika_Analyzer.Package/tools/install.ps1 new file mode 100644 index 0000000..f9bd789 --- /dev/null +++ b/DenChika_Analyzer.Package/tools/install.ps1 @@ -0,0 +1,272 @@ +param($installPath, $toolsPath, $package, $project) + +if($project.Object.SupportsPackageDependencyResolution) +{ + if($project.Object.SupportsPackageDependencyResolution()) + { + # Do not install analyzers via install.ps1, instead let the project system handle it. + return + } +} + +$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers") * -Resolve + +foreach($analyzersPath in $analyzersPaths) +{ + if (Test-Path $analyzersPath) + { + # Install the language agnostic analyzers. + foreach ($analyzerFilePath in Get-ChildItem -Path "$analyzersPath\*.dll" -Exclude *.resources.dll) + { + if($project.Object.AnalyzerReferences) + { + $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName) + } + } + } +} + +# $project.Type gives the language name like (C# or VB.NET) +$languageFolder = "" +if($project.Type -eq "C#") +{ + $languageFolder = "cs" +} +if($project.Type -eq "VB.NET") +{ + $languageFolder = "vb" +} +if($languageFolder -eq "") +{ + return +} + +foreach($analyzersPath in $analyzersPaths) +{ + # Install language specific analyzers. + $languageAnalyzersPath = join-path $analyzersPath $languageFolder + if (Test-Path $languageAnalyzersPath) + { + foreach ($analyzerFilePath in Get-ChildItem -Path "$languageAnalyzersPath\*.dll" -Exclude *.resources.dll) + { + if($project.Object.AnalyzerReferences) + { + $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName) + } + } + } +} +# SIG # Begin signature block +# MIInugYJKoZIhvcNAQcCoIInqzCCJ6cCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA/i+qRUHsWzI0s +# FVk99zLgt/HOEQ33uvkFsWtHTHZgf6CCDYEwggX/MIID56ADAgECAhMzAAACUosz +# qviV8znbAAAAAAJSMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p +# bmcgUENBIDIwMTEwHhcNMjEwOTAyMTgzMjU5WhcNMjIwOTAxMTgzMjU5WjB0MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +# AQDQ5M+Ps/X7BNuv5B/0I6uoDwj0NJOo1KrVQqO7ggRXccklyTrWL4xMShjIou2I +# sbYnF67wXzVAq5Om4oe+LfzSDOzjcb6ms00gBo0OQaqwQ1BijyJ7NvDf80I1fW9O +# L76Kt0Wpc2zrGhzcHdb7upPrvxvSNNUvxK3sgw7YTt31410vpEp8yfBEl/hd8ZzA +# v47DCgJ5j1zm295s1RVZHNp6MoiQFVOECm4AwK2l28i+YER1JO4IplTH44uvzX9o +# RnJHaMvWzZEpozPy4jNO2DDqbcNs4zh7AWMhE1PWFVA+CHI/En5nASvCvLmuR/t8 +# q4bc8XR8QIZJQSp+2U6m2ldNAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE +# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUNZJaEUGL2Guwt7ZOAu4efEYXedEw +# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 +# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDY3NTk3MB8GA1UdIwQYMBaAFEhu +# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu +# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w +# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 +# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx +# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAFkk3 +# uSxkTEBh1NtAl7BivIEsAWdgX1qZ+EdZMYbQKasY6IhSLXRMxF1B3OKdR9K/kccp +# kvNcGl8D7YyYS4mhCUMBR+VLrg3f8PUj38A9V5aiY2/Jok7WZFOAmjPRNNGnyeg7 +# l0lTiThFqE+2aOs6+heegqAdelGgNJKRHLWRuhGKuLIw5lkgx9Ky+QvZrn/Ddi8u +# TIgWKp+MGG8xY6PBvvjgt9jQShlnPrZ3UY8Bvwy6rynhXBaV0V0TTL0gEx7eh/K1 +# o8Miaru6s/7FyqOLeUS4vTHh9TgBL5DtxCYurXbSBVtL1Fj44+Od/6cmC9mmvrti +# yG709Y3Rd3YdJj2f3GJq7Y7KdWq0QYhatKhBeg4fxjhg0yut2g6aM1mxjNPrE48z +# 6HWCNGu9gMK5ZudldRw4a45Z06Aoktof0CqOyTErvq0YjoE4Xpa0+87T/PVUXNqf +# 7Y+qSU7+9LtLQuMYR4w3cSPjuNusvLf9gBnch5RqM7kaDtYWDgLyB42EfsxeMqwK +# WwA+TVi0HrWRqfSx2olbE56hJcEkMjOSKz3sRuupFCX3UroyYf52L+2iVTrda8XW +# esPG62Mnn3T8AuLfzeJFuAbfOSERx7IFZO92UPoXE1uEjL5skl1yTZB3MubgOA4F +# 8KoRNhviFAEST+nG8c8uIsbZeb08SeYQMqjVEmkwggd6MIIFYqADAgECAgphDpDS +# AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 +# ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla +# MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS +# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT +# H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB +# AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG +# OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S +# 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz +# y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 +# 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u +# M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 +# X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl +# XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP +# 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB +# l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF +# RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM +# CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ +# BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud +# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO +# 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 +# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y +# Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p +# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y +# Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB +# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw +# cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA +# XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY +# 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj +# 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd +# d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ +# Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf +# wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ +# aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j +# NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B +# xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 +# eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 +# r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I +# RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIZjzCCGYsCAQEwgZUwfjELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z +# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAlKLM6r4lfM52wAAAAACUjAN +# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor +# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgRjg7DcI6 +# uhYfXWwAQ6hK0mPW7iyr2tzHR0DHSDJkscIwQgYKKwYBBAGCNwIBDDE0MDKgFIAS +# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN +# BgkqhkiG9w0BAQEFAASCAQB3ERGpqvGnJrsyU0d9lERK2TJW4/OONhZAFjxrEvEk +# PzdH0Fk0otvagAvjHzJ3q0G8C7gwRbXIyGgiYYIMefheNvgd/UKnubUGEzeG9h0/ +# biX5Ro1mxuHBYvc3vqvWD292jXMg00iRmexDsTny8YgSAAWsTdkE8/W2ooEfbG1T +# QkCg6ds9btpA1D1znVYpEbviCJoAfHLbNBr5nzAadgWjQM8nnb3UTvmLDIs5b1LO +# 3lm9w485IBFRnfrj6QinVsCbSD7PU/N1hPY7rKfM9ScZC6QT6kjyuVVa1Ft+VYLH +# qlV9hE6B4CGeB8qkko4x+MKovgbdpCgYz3eePWCakZywoYIXGTCCFxUGCisGAQQB +# gjcDAwExghcFMIIXAQYJKoZIhvcNAQcCoIIW8jCCFu4CAQMxDzANBglghkgBZQME +# AgEFADCCAVkGCyqGSIb3DQEJEAEEoIIBSASCAUQwggFAAgEBBgorBgEEAYRZCgMB +# MDEwDQYJYIZIAWUDBAIBBQAEIC58WTh4Q8r6c2kVXmD8xoHEhya2jc6YZ43KUAIy +# flB4AgZh/WKJ50gYEzIwMjIwMjExMTkwMzQwLjE1M1owBIACAfSggdikgdUwgdIx +# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt +# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p +# Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhh +# bGVzIFRTUyBFU046M0JENC00QjgwLTY5QzMxJTAjBgNVBAMTHE1pY3Jvc29mdCBU +# aW1lLVN0YW1wIFNlcnZpY2WgghFoMIIHFDCCBPygAwIBAgITMwAAAYm0v4YwhBxL +# jwABAAABiTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg +# MjAxMDAeFw0yMTEwMjgxOTI3NDFaFw0yMzAxMjYxOTI3NDFaMIHSMQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg +# SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg +# RVNOOjNCRDQtNEI4MC02OUMzMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt +# cCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvQZXxZFm +# a6plmuOyvNpV8xONOwcYolZG/BjyZWGSk5JOGaLyrKId5VxVHWHlsmJE4Svnzsdp +# sKmVx8otONveIUFvSceEZp8VXmu5m1fu8L7c+3lwXcibjccqtEvtQslokQVx0r+L +# 54abrNDarwFG73IaRidIS1i9c+unJ8oYyhDRLrCysFAVxyQhPNZkWK7Z8/VGukaK +# LAWHXCh/+R53h42gFL+9/mAALxzCXXuofi8f/XKCm7xNwVc1hONCCz6oq94AufzV +# NkkIW4brUQgYpCcJm9U0XNmQvtropYDn9UtY8YQ0NKenXPtdgLHdQ8Nnv3igErKL +# rWI0a5n5jjdKfwk+8mvakqdZmlOseeOS1XspQNJAK1uZllAITcnQZOcO5ofjOQ33 +# ujWckAXdz+/x3o7l4AU/TSOMzGZMwhUdtVwC3dSbItpSVFgnjM2COEJ9zgCadvOi +# rGDLN471jZI2jClkjsJTdgPk343TQA4JFvds/unZq0uLr+niZ3X44OBx2x+gVlln +# 2c4UbZXNueA4yS1TJGbbJFIILAmTUA9Auj5eISGTbNiyWx79HnCOTar39QEKozm4 +# LnTmDXy0/KI/H/nYZGKuTHfckP28wQS06rD+fDS5xLwcRMCW92DkHXmtbhGyRilB +# OL5LxZelQfxt54wl4WUC0AdAEolPekODwO8CAwEAAaOCATYwggEyMB0GA1UdDgQW +# BBSXbx+zR1p4IIAeguA6rHKkrfl7UDAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl +# pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j +# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx +# MCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3 +# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3Rh +# bXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG +# CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4ICAQCOtLdpWUI4KwfLLrfaKrLB92Dq +# bAspGWM41TaO4Jl+sHxPo522uu3GKQCjmkRWreHtlfyy9kOk7LWax3k3ke8Gtfet +# fbh7qH0LeV2XOWg39BOnHf6mTcZq7FYSZZch1JDQjc98+Odlow+oWih0Dbt4CV/e +# 19ZcE+1n1zzWkskUEd0f5jPIUis33p+vkY8szduAtCcIcPFUhI8Hb5alPUAPMjGz +# wKb7NIKbnf8j8cP18As5IveckF0oh1cw63RY/vPK62LDYdpi7WnG2ObvngfWVKtw +# iwTI4jHj2cO9q37HDe/PPl216gSpUZh0ap24mKmMDfcKp1N4mEdsxz4oseOrPYeF +# sHHWJFJ6Aivvqn70KTeJpp5r+DxSqbeSy0mxIUOq/lAaUxgNSQVUX26t8r+fciko +# fKv23WHrtRV3t7rVTsB9YzrRaiikmz68K5HWdt9MqULxPQPo+ppZ0LRqkOae466+ +# UKRY0JxWtdrMc5vHlHZfnqjawj/RsM2S6Q6fa9T9CnY1Nz7DYBG3yZJyCPFsrgU0 +# 5s9ljqfsSptpFdUh9R4ce+L71SWDLM2x/1MFLLHAMbXsEp8KloEGtaDULnxtfS2t +# YhfuKGqRXoEfDPAMnIdTvQPh3GHQ4SjkkBARHL0MY75alhGTKHWjC2aLVOo8obKI +# Bk8hfnFDUf/EyVw4uTCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUw +# DQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n +# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y +# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv +# cml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z +# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +# ggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg +# 4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aO +# RmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41 +# JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5 +# LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL +# 64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9 +# QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj +# 0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqE +# UUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0 +# kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435 +# UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB +# 3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTE +# mr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwG +# A1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93 +# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNV +# HSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNV +# HQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo +# 0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29m +# dC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5j +# cmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jv +# c29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDAN +# BgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4 +# sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th54 +# 2DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRX +# ud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBew +# VIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0 +# DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+Cljd +# QDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFr +# DZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFh +# bHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7n +# tdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+ +# oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6Fw +# ZvKhggLXMIICQAIBATCCAQChgdikgdUwgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv +# ZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh +# dGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JENC00Qjgw +# LTY5QzMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoB +# ATAHBgUrDgMCGgMVACGlCa3ketyeuey7bJNpWkMuiCcQoIGDMIGApH4wfDELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z +# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDlsRtBMCIY +# DzIwMjIwMjEyMDEyODMzWhgPMjAyMjAyMTMwMTI4MzNaMHcwPQYKKwYBBAGEWQoE +# ATEvMC0wCgIFAOWxG0ECAQAwCgIBAAICDbMCAf8wBwIBAAICEW8wCgIFAOWybMEC +# AQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEK +# MAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQCImCpEJ2AlAWBBkDABmkqIh1kM +# LPDyea3b7evhOk+YSwXCzxnBIXuppujFT3tnk7w0p0a5YS9uwqbDM/M6rAUMBAR0 +# boHamumEITNF5nVh0rlYyRZQ3WraVD2YPhouUINQavmS8ueYoh6r3HeM9QPBAnNB +# vv7GDrZ637+2Dfe60jGCBA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w +# IFBDQSAyMDEwAhMzAAABibS/hjCEHEuPAAEAAAGJMA0GCWCGSAFlAwQCAQUAoIIB +# SjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIL86 +# iebNndOm+CAgIp67s6y+HI1wHdhaMPILGf48RtXXMIH6BgsqhkiG9w0BCRACLzGB +# 6jCB5zCB5DCBvQQgZndHMdxQV1VsbpWHOTHqWEycvcRJm7cY69l/UmT8j0UwgZgw +# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE +# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD +# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAYm0v4YwhBxL +# jwABAAABiTAiBCDET+l3keOFFxaIqOZWSSuWNO774Ng/t5pe3p4QXoKcvjANBgkq +# hkiG9w0BAQsFAASCAgADYrNFej7RbihwGcC0jF+cTik+HJog++dPEDXeIyBB+2pw +# 23hC5KaX9H05ZknluIq2oxf2MLpKL+gA+76T3k5PnzPNJFDogUn5eFIIsMRpNF0h +# MtPWoPJWYFK2odvKz1HwsuqHRg6hO//NwORcv4xPeAWEFO5+DOXzZKKp/BVDGe/D +# c++y9/l41qpz/F2c3a1lugdqnZz7ZeoaQ8/JMlwrmMbciqcAytCn9A59EWJ1xYd/ +# DaDhQ5Rd8hkcckuxJksjWf6URmc91cb4Jdatkyupq3dDGwCkjGNd2xetrOpqMLOZ +# quoDONSgc9rGrhkf3xgKKVRhLg9bxd3f2oQ0IsOBg2AC5td1eqp6TILc0gei2E3I +# uEAW1d+KXDnajvQmvQkaFHr5wEocTTLgrDglOPPhEaEumSTJS7jKFzUKHiBU005p +# CgQ1So2WJ2RqFx0ppez1N1AFczOVLFllK3WGPLkDsN1GgT0nFfoqvs1WKkzyb2d2 +# /v6PVER9xGky7LCu62dhsJCAFUbxF2dJxaC5ofrl98VaO/z72J9on9BTz+eCtcJ9 +# rDIpqktGeL02f6+4zctFCyi2wgm6eh8kKvRlAPmN4/MNt9pWHtEV//xFGzGeDajr +# diRhDoMZwsuon4QwS8b2YcKMoZ6gZ2lZah3960fTTmvBTBNqeBtR94KWCy0C0A== +# SIG # End signature block diff --git a/DenChika_Analyzer.Package/tools/uninstall.ps1 b/DenChika_Analyzer.Package/tools/uninstall.ps1 new file mode 100644 index 0000000..17fd920 --- /dev/null +++ b/DenChika_Analyzer.Package/tools/uninstall.ps1 @@ -0,0 +1,279 @@ +param($installPath, $toolsPath, $package, $project) + +if($project.Object.SupportsPackageDependencyResolution) +{ + if($project.Object.SupportsPackageDependencyResolution()) + { + # Do not uninstall analyzers via uninstall.ps1, instead let the project system handle it. + return + } +} + +$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) "analyzers") * -Resolve + +foreach($analyzersPath in $analyzersPaths) +{ + # Uninstall the language agnostic analyzers. + if (Test-Path $analyzersPath) + { + foreach ($analyzerFilePath in Get-ChildItem -Path "$analyzersPath\*.dll" -Exclude *.resources.dll) + { + if($project.Object.AnalyzerReferences) + { + $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName) + } + } + } +} + +# $project.Type gives the language name like (C# or VB.NET) +$languageFolder = "" +if($project.Type -eq "C#") +{ + $languageFolder = "cs" +} +if($project.Type -eq "VB.NET") +{ + $languageFolder = "vb" +} +if($languageFolder -eq "") +{ + return +} + +foreach($analyzersPath in $analyzersPaths) +{ + # Uninstall language specific analyzers. + $languageAnalyzersPath = join-path $analyzersPath $languageFolder + if (Test-Path $languageAnalyzersPath) + { + foreach ($analyzerFilePath in Get-ChildItem -Path "$languageAnalyzersPath\*.dll" -Exclude *.resources.dll) + { + if($project.Object.AnalyzerReferences) + { + try + { + $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName) + } + catch + { + + } + } + } + } +} +# SIG # Begin signature block +# MIInugYJKoZIhvcNAQcCoIInqzCCJ6cCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDC68wb97fg0QGL +# yXrxJhYfmibzcOh8caqC0uZprfczDaCCDYEwggX/MIID56ADAgECAhMzAAACUosz +# qviV8znbAAAAAAJSMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p +# bmcgUENBIDIwMTEwHhcNMjEwOTAyMTgzMjU5WhcNMjIwOTAxMTgzMjU5WjB0MQsw +# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u +# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +# AQDQ5M+Ps/X7BNuv5B/0I6uoDwj0NJOo1KrVQqO7ggRXccklyTrWL4xMShjIou2I +# sbYnF67wXzVAq5Om4oe+LfzSDOzjcb6ms00gBo0OQaqwQ1BijyJ7NvDf80I1fW9O +# L76Kt0Wpc2zrGhzcHdb7upPrvxvSNNUvxK3sgw7YTt31410vpEp8yfBEl/hd8ZzA +# v47DCgJ5j1zm295s1RVZHNp6MoiQFVOECm4AwK2l28i+YER1JO4IplTH44uvzX9o +# RnJHaMvWzZEpozPy4jNO2DDqbcNs4zh7AWMhE1PWFVA+CHI/En5nASvCvLmuR/t8 +# q4bc8XR8QIZJQSp+2U6m2ldNAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE +# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUNZJaEUGL2Guwt7ZOAu4efEYXedEw +# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 +# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDY3NTk3MB8GA1UdIwQYMBaAFEhu +# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu +# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w +# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 +# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx +# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAFkk3 +# uSxkTEBh1NtAl7BivIEsAWdgX1qZ+EdZMYbQKasY6IhSLXRMxF1B3OKdR9K/kccp +# kvNcGl8D7YyYS4mhCUMBR+VLrg3f8PUj38A9V5aiY2/Jok7WZFOAmjPRNNGnyeg7 +# l0lTiThFqE+2aOs6+heegqAdelGgNJKRHLWRuhGKuLIw5lkgx9Ky+QvZrn/Ddi8u +# TIgWKp+MGG8xY6PBvvjgt9jQShlnPrZ3UY8Bvwy6rynhXBaV0V0TTL0gEx7eh/K1 +# o8Miaru6s/7FyqOLeUS4vTHh9TgBL5DtxCYurXbSBVtL1Fj44+Od/6cmC9mmvrti +# yG709Y3Rd3YdJj2f3GJq7Y7KdWq0QYhatKhBeg4fxjhg0yut2g6aM1mxjNPrE48z +# 6HWCNGu9gMK5ZudldRw4a45Z06Aoktof0CqOyTErvq0YjoE4Xpa0+87T/PVUXNqf +# 7Y+qSU7+9LtLQuMYR4w3cSPjuNusvLf9gBnch5RqM7kaDtYWDgLyB42EfsxeMqwK +# WwA+TVi0HrWRqfSx2olbE56hJcEkMjOSKz3sRuupFCX3UroyYf52L+2iVTrda8XW +# esPG62Mnn3T8AuLfzeJFuAbfOSERx7IFZO92UPoXE1uEjL5skl1yTZB3MubgOA4F +# 8KoRNhviFAEST+nG8c8uIsbZeb08SeYQMqjVEmkwggd6MIIFYqADAgECAgphDpDS +# AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 +# ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla +# MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS +# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT +# H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB +# AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG +# OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S +# 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz +# y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 +# 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u +# M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 +# X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl +# XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP +# 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB +# l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF +# RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM +# CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ +# BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud +# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO +# 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 +# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y +# Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p +# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y +# Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB +# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw +# cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA +# XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY +# 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj +# 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd +# d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ +# Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf +# wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ +# aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j +# NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B +# xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 +# eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 +# r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I +# RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIZjzCCGYsCAQEwgZUwfjELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z +# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAlKLM6r4lfM52wAAAAACUjAN +# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor +# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgF1ypFyzl +# AvvWGVCeXczrfpXmJNm9vpyjcwd4y4ivfqowQgYKKwYBBAGCNwIBDDE0MDKgFIAS +# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN +# BgkqhkiG9w0BAQEFAASCAQAvi2rSDkhC82RJ4uqq/0WbHkOkzq1hrF6HxneBTNj8 +# KX+niFtee3CYVfWaSAQ6xvOiLupRX3fsSfhabRQ+Jl8k28voGrTK1OC906OO3tUN +# jdmv1PooWdxJNt2EbzQrap5Ui9KTUv4mJ4c836HAVMBPCJiq5NwmzAHfbgBxCaYq +# +hupIf+gk8vuNB1bltILgNmU/smJt9OuGqSo5TrFajzb+35SqjnCz9JtAtbPNZvA +# X9N37UPhITOecceAQmrHiEPbA7eu6VDp6VPjPfCEO7a+frWa83chEd4qzyou9xu5 +# 3gnj7Ro8nFDnGyUe0+0oCaYGXO9fbIMN1HG2IZg5suj5oYIXGTCCFxUGCisGAQQB +# gjcDAwExghcFMIIXAQYJKoZIhvcNAQcCoIIW8jCCFu4CAQMxDzANBglghkgBZQME +# AgEFADCCAVkGCyqGSIb3DQEJEAEEoIIBSASCAUQwggFAAgEBBgorBgEEAYRZCgMB +# MDEwDQYJYIZIAWUDBAIBBQAEIH+XBTHuyyHZnIXrFWIe64WLvHx5GUFMCM6A56T1 +# KwBtAgZh/WKJ52UYEzIwMjIwMjExMTkwMzQwLjU0OFowBIACAfSggdikgdUwgdIx +# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt +# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p +# Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhh +# bGVzIFRTUyBFU046M0JENC00QjgwLTY5QzMxJTAjBgNVBAMTHE1pY3Jvc29mdCBU +# aW1lLVN0YW1wIFNlcnZpY2WgghFoMIIHFDCCBPygAwIBAgITMwAAAYm0v4YwhBxL +# jwABAAABiTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK +# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 +# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg +# MjAxMDAeFw0yMTEwMjgxOTI3NDFaFw0yMzAxMjYxOTI3NDFaMIHSMQswCQYDVQQG +# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG +# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg +# SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg +# RVNOOjNCRDQtNEI4MC02OUMzMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt +# cCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvQZXxZFm +# a6plmuOyvNpV8xONOwcYolZG/BjyZWGSk5JOGaLyrKId5VxVHWHlsmJE4Svnzsdp +# sKmVx8otONveIUFvSceEZp8VXmu5m1fu8L7c+3lwXcibjccqtEvtQslokQVx0r+L +# 54abrNDarwFG73IaRidIS1i9c+unJ8oYyhDRLrCysFAVxyQhPNZkWK7Z8/VGukaK +# LAWHXCh/+R53h42gFL+9/mAALxzCXXuofi8f/XKCm7xNwVc1hONCCz6oq94AufzV +# NkkIW4brUQgYpCcJm9U0XNmQvtropYDn9UtY8YQ0NKenXPtdgLHdQ8Nnv3igErKL +# rWI0a5n5jjdKfwk+8mvakqdZmlOseeOS1XspQNJAK1uZllAITcnQZOcO5ofjOQ33 +# ujWckAXdz+/x3o7l4AU/TSOMzGZMwhUdtVwC3dSbItpSVFgnjM2COEJ9zgCadvOi +# rGDLN471jZI2jClkjsJTdgPk343TQA4JFvds/unZq0uLr+niZ3X44OBx2x+gVlln +# 2c4UbZXNueA4yS1TJGbbJFIILAmTUA9Auj5eISGTbNiyWx79HnCOTar39QEKozm4 +# LnTmDXy0/KI/H/nYZGKuTHfckP28wQS06rD+fDS5xLwcRMCW92DkHXmtbhGyRilB +# OL5LxZelQfxt54wl4WUC0AdAEolPekODwO8CAwEAAaOCATYwggEyMB0GA1UdDgQW +# BBSXbx+zR1p4IIAeguA6rHKkrfl7UDAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl +# pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j +# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx +# MCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3 +# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3Rh +# bXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoG +# CCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4ICAQCOtLdpWUI4KwfLLrfaKrLB92Dq +# bAspGWM41TaO4Jl+sHxPo522uu3GKQCjmkRWreHtlfyy9kOk7LWax3k3ke8Gtfet +# fbh7qH0LeV2XOWg39BOnHf6mTcZq7FYSZZch1JDQjc98+Odlow+oWih0Dbt4CV/e +# 19ZcE+1n1zzWkskUEd0f5jPIUis33p+vkY8szduAtCcIcPFUhI8Hb5alPUAPMjGz +# wKb7NIKbnf8j8cP18As5IveckF0oh1cw63RY/vPK62LDYdpi7WnG2ObvngfWVKtw +# iwTI4jHj2cO9q37HDe/PPl216gSpUZh0ap24mKmMDfcKp1N4mEdsxz4oseOrPYeF +# sHHWJFJ6Aivvqn70KTeJpp5r+DxSqbeSy0mxIUOq/lAaUxgNSQVUX26t8r+fciko +# fKv23WHrtRV3t7rVTsB9YzrRaiikmz68K5HWdt9MqULxPQPo+ppZ0LRqkOae466+ +# UKRY0JxWtdrMc5vHlHZfnqjawj/RsM2S6Q6fa9T9CnY1Nz7DYBG3yZJyCPFsrgU0 +# 5s9ljqfsSptpFdUh9R4ce+L71SWDLM2x/1MFLLHAMbXsEp8KloEGtaDULnxtfS2t +# YhfuKGqRXoEfDPAMnIdTvQPh3GHQ4SjkkBARHL0MY75alhGTKHWjC2aLVOo8obKI +# Bk8hfnFDUf/EyVw4uTCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUw +# DQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n +# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y +# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv +# cml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z +# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +# ggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg +# 4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aO +# RmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41 +# JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5 +# LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL +# 64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9 +# QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj +# 0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqE +# UUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0 +# kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435 +# UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB +# 3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTE +# mr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwG +# A1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93 +# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNV +# HSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNV +# HQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo +# 0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29m +# dC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5j +# cmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jv +# c29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDAN +# BgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4 +# sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th54 +# 2DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRX +# ud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBew +# VIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0 +# DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+Cljd +# QDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFr +# DZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFh +# bHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7n +# tdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+ +# oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6Fw +# ZvKhggLXMIICQAIBATCCAQChgdikgdUwgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv +# ZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh +# dGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JENC00Qjgw +# LTY5QzMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoB +# ATAHBgUrDgMCGgMVACGlCa3ketyeuey7bJNpWkMuiCcQoIGDMIGApH4wfDELMAkG +# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx +# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9z +# b2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDlsRtBMCIY +# DzIwMjIwMjEyMDEyODMzWhgPMjAyMjAyMTMwMTI4MzNaMHcwPQYKKwYBBAGEWQoE +# ATEvMC0wCgIFAOWxG0ECAQAwCgIBAAICDbMCAf8wBwIBAAICEW8wCgIFAOWybMEC +# AQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEK +# MAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQCImCpEJ2AlAWBBkDABmkqIh1kM +# LPDyea3b7evhOk+YSwXCzxnBIXuppujFT3tnk7w0p0a5YS9uwqbDM/M6rAUMBAR0 +# boHamumEITNF5nVh0rlYyRZQ3WraVD2YPhouUINQavmS8ueYoh6r3HeM9QPBAnNB +# vv7GDrZ637+2Dfe60jGCBA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYD +# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy +# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w +# IFBDQSAyMDEwAhMzAAABibS/hjCEHEuPAAEAAAGJMA0GCWCGSAFlAwQCAQUAoIIB +# SjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIKY2 +# Onyhltfi0+oc/UMKaXc0H6Ckw2gGK1/qmjRZNiXnMIH6BgsqhkiG9w0BCRACLzGB +# 6jCB5zCB5DCBvQQgZndHMdxQV1VsbpWHOTHqWEycvcRJm7cY69l/UmT8j0UwgZgw +# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE +# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD +# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAYm0v4YwhBxL +# jwABAAABiTAiBCDET+l3keOFFxaIqOZWSSuWNO774Ng/t5pe3p4QXoKcvjANBgkq +# hkiG9w0BAQsFAASCAgB7AQ0Dv3muHoNAt+cccMfYk23lHgh8LGBitCSFwu0q7ufv +# sXkoaIpwW0U0GikWhQoCH0U38SuzVbafg49FiE6ftkjOtiE03PwPYi1S6NSoDdaV +# kUuvjz3OcuN1IHg3CyLn2dO8xbUlWCUfgoWhI1nax9ch7wT4Sw8RdmGKdYTZoZmq +# vPXFRtDyZdmJDMDbTql/Brye8oEsDMoYKMmEYhY1t9TlusnWfUbxuBnyMqg/FkBy +# QF78WFfT8mygMqUGmINxPGT6daxqmq3nfAC2vOtLT4DplNYMEymfDceJzBhb8VCT +# UHc2CWK0qKT+eqwn30NBkwh//8aNHlXaA9Yq/9k2y+axIGdxFfG+X0stipRRpEXb +# xCFm7FPD5/S4ddBH829yEZLZ4XTwSZ6YS/d3mFzu5rgZl3UhjOJPXx40GQtUiDP4 +# XQZ/wW3154X/KtTypv62/Hl+CiMUrsO7MXtgwClfbJ3osg+zlpJgdraetVgmAUc1 +# mjz2GCYX7rIliGkAJREKn4rV2MZzuGLEpTjz9dB+1Xp9Ndi9q3jQgs6k3IDIUube +# YjPFFuPmFWRyi6oPTXmc4ExtTIewPvrOhwQ5q4ysxylkXoTS+UQt94BY2SvR+TMu +# 6doU+0Y73xsO8Zz+lREh3fjBsDbPAgOV5989X6bmkJEEIwIK8LYgqvyED8XXTg== +# SIG # End signature block diff --git a/DenChika_Analyzer.Test/DenChika_Analyzer.Test.csproj b/DenChika_Analyzer.Test/DenChika_Analyzer.Test.csproj new file mode 100644 index 0000000..4444211 --- /dev/null +++ b/DenChika_Analyzer.Test/DenChika_Analyzer.Test.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + + true + true + DenChika_Analyzer.Test + + + + + + + + + + + + + + + + + + + + + diff --git a/DenChika_Analyzer.Test/TestClass.cs b/DenChika_Analyzer.Test/TestClass.cs new file mode 100644 index 0000000..f565ca3 --- /dev/null +++ b/DenChika_Analyzer.Test/TestClass.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace DenChika_Analyzer.Test; + +public class TestClass +{ + public Dictionary>[], Dictionary[]>> dictionary { get; set; } + public List TestMethod1(List> list, List ling) + { + var x = new List(); + return x; + } + + private List TestMethod2(List> list, List ling) + { + var x = new List(); + return x; + } + + public int TestMethod3(int magic1 = 10) + { + string magic2 = "magic"; + magic2 = "MaGiC"; + string magic3 = string.Empty; + string magic4 = magic2; + if (magic3 == "MaGiC") + { + string magic5 = "magic"; + magic3 = "MAGIC"; + int a = 10; + } + for (int i = 0; i < 3; i++) + { + magic3 += "magiC"; + } + + return magic1; + } + + public int TestMethod4() + { + return TestMethod3(5); + } +} \ No newline at end of file diff --git a/DenChika_Analyzer.Vsix/DenChika_Analyzer.Vsix.csproj b/DenChika_Analyzer.Vsix/DenChika_Analyzer.Vsix.csproj new file mode 100644 index 0000000..3537fd8 --- /dev/null +++ b/DenChika_Analyzer.Vsix/DenChika_Analyzer.Vsix.csproj @@ -0,0 +1,48 @@ + + + + + + net472 + DenChika_Analyzer.Vsix + DenChika_Analyzer.Vsix + + + + false + false + false + false + false + false + Roslyn + + + + + + + + Program + $(DevEnvDir)devenv.exe + /rootsuffix $(VSSDKTargetPlatformRegRootSuffix) + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DenChika_Analyzer.Vsix/source.extension.vsixmanifest b/DenChika_Analyzer.Vsix/source.extension.vsixmanifest new file mode 100644 index 0000000..207ab75 --- /dev/null +++ b/DenChika_Analyzer.Vsix/source.extension.vsixmanifest @@ -0,0 +1,24 @@ + + + + + DenChika_Analyzer + This is a sample diagnostic extension for the .NET Compiler Platform ("Roslyn"). + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DenChika_Analyzer.sln b/DenChika_Analyzer.sln new file mode 100644 index 0000000..b0a9989 --- /dev/null +++ b/DenChika_Analyzer.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32314.265 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DenChika_Analyzer", "DenChika_Analyzer\DenChika_Analyzer.csproj", "{222D058A-6844-4EA0-9DFC-052141EA4B06}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DenChika_Analyzer.CodeFixes", "DenChika_Analyzer.CodeFixes\DenChika_Analyzer.CodeFixes.csproj", "{CE3AFBD9-4E58-4C08-9C15-327F63691319}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DenChika_Analyzer.Package", "DenChika_Analyzer.Package\DenChika_Analyzer.Package.csproj", "{A4984373-2F31-4203-A095-A6DFE7B71FAE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DenChika_Analyzer.Test", "DenChika_Analyzer.Test\DenChika_Analyzer.Test.csproj", "{4238F7DC-700E-46D2-B1EA-2C2A70E2F210}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DenChika_Analyzer.Vsix", "DenChika_Analyzer.Vsix\DenChika_Analyzer.Vsix.csproj", "{20877B67-5C15-4135-AE56-40FB80DFBB26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {222D058A-6844-4EA0-9DFC-052141EA4B06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {222D058A-6844-4EA0-9DFC-052141EA4B06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {222D058A-6844-4EA0-9DFC-052141EA4B06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {222D058A-6844-4EA0-9DFC-052141EA4B06}.Release|Any CPU.Build.0 = Release|Any CPU + {CE3AFBD9-4E58-4C08-9C15-327F63691319}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE3AFBD9-4E58-4C08-9C15-327F63691319}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE3AFBD9-4E58-4C08-9C15-327F63691319}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE3AFBD9-4E58-4C08-9C15-327F63691319}.Release|Any CPU.Build.0 = Release|Any CPU + {A4984373-2F31-4203-A095-A6DFE7B71FAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4984373-2F31-4203-A095-A6DFE7B71FAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4984373-2F31-4203-A095-A6DFE7B71FAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4984373-2F31-4203-A095-A6DFE7B71FAE}.Release|Any CPU.Build.0 = Release|Any CPU + {4238F7DC-700E-46D2-B1EA-2C2A70E2F210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4238F7DC-700E-46D2-B1EA-2C2A70E2F210}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4238F7DC-700E-46D2-B1EA-2C2A70E2F210}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4238F7DC-700E-46D2-B1EA-2C2A70E2F210}.Release|Any CPU.Build.0 = Release|Any CPU + {20877B67-5C15-4135-AE56-40FB80DFBB26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20877B67-5C15-4135-AE56-40FB80DFBB26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20877B67-5C15-4135-AE56-40FB80DFBB26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20877B67-5C15-4135-AE56-40FB80DFBB26}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {07315937-5C62-46A0-A23F-B2BF1DEB08BE} + EndGlobalSection +EndGlobal diff --git a/DenChika_Analyzer/AnalyzerListsAndArrays.cs b/DenChika_Analyzer/AnalyzerListsAndArrays.cs new file mode 100644 index 0000000..3fd8b17 --- /dev/null +++ b/DenChika_Analyzer/AnalyzerListsAndArrays.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading; +using DenChika_Analyzer; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace DenChika_Analyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public class AnalyzerListsAndArrays : DiagnosticAnalyzer + { + public const string DiagnosticId = "CollectionReplacer"; + private static readonly LocalizableString Title = new LocalizableResourceString(nameof(ResourcesListsAndArrays.AnalyzerTitle), ResourcesListsAndArrays.ResourceManager, typeof(ResourcesListsAndArrays)); + private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(ResourcesListsAndArrays.AnalyzerMessageFormat), ResourcesListsAndArrays.ResourceManager, typeof(ResourcesListsAndArrays)); + private static readonly LocalizableString Description = new LocalizableResourceString(nameof(ResourcesListsAndArrays.AnalyzerDescription), ResourcesListsAndArrays.ResourceManager, typeof(ResourcesListsAndArrays)); + private const string Category = "Naming"; + + private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + + public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(c => + { + var node = c.Node; + + bool methodFlag = false; + + if (node.Ancestors().OfType().ToList().Count != 0) + { + var method = node.Ancestors().OfType().First(); + if (method.Modifiers.First().IsKind(SyntaxKind.PublicKeyword)) + methodFlag = true; + } + + if (((node.Ancestors().OfType().ToList().Count != 0 && methodFlag) || + (node.Ancestors().OfType().ToList().Count != 0 && methodFlag) || + node.Ancestors().OfType().ToList().Count != 0) && + node.Ancestors().OfType().ToList().Count == 0) + { + if (c.Node.IsKind(SyntaxKind.GenericName)) + { + var newNode = (GenericNameSyntax)node; + var genToken = newNode.Identifier; + + if (genToken.Text.Equals("List")) + { + var diag = Diagnostic.Create(Rule, genToken.GetLocation(), genToken.Text); + c.ReportDiagnostic(diag); + } + } + else + { + var newNode = (ArrayTypeSyntax)node; + var message = string.Empty; + + if (newNode.ChildNodes().OfType().ToList().Count != 0) + message = newNode.ChildNodes().OfType().First().Identifier.Text; + else + message = newNode.ElementType.ToString(); + + var diag = Diagnostic.Create(Rule, newNode.GetLocation(), message + "[]"); + c.ReportDiagnostic(diag); + } + } + } + , SyntaxKind.GenericName, SyntaxKind.ArrayType); + } + } +} \ No newline at end of file diff --git a/DenChika_Analyzer/AnalyzerMagicLiterals.cs b/DenChika_Analyzer/AnalyzerMagicLiterals.cs new file mode 100644 index 0000000..d95b78d --- /dev/null +++ b/DenChika_Analyzer/AnalyzerMagicLiterals.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading; +using DenChika_Analyzer; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace DenChika_Analyzer +{ + [DiagnosticAnalyzer(LanguageNames.CSharp)] + public class AnalyzerLiterals : DiagnosticAnalyzer + { + public const string DiagnosticId = "MagicLiteralsReplacer"; + private static readonly LocalizableString Title = new LocalizableResourceString(nameof(ResourcesMagicLiterals.AnalyzerTitle), ResourcesMagicLiterals.ResourceManager, typeof(ResourcesMagicLiterals)); + private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(ResourcesMagicLiterals.AnalyzerMessageFormat), ResourcesMagicLiterals.ResourceManager, typeof(ResourcesMagicLiterals)); + private static readonly LocalizableString Description = new LocalizableResourceString(nameof(ResourcesMagicLiterals.AnalyzerDescription), ResourcesMagicLiterals.ResourceManager, typeof(ResourcesMagicLiterals)); + private const string Category = "Naming"; + + private static readonly DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description); + + public class Lol + { + public const int MagicNumber1 = 10; + public const string MagicNumber2 = "Fredi"; + } + + public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterSyntaxNodeAction(c => + { + var literalExpression = c.Node; + + if (literalExpression.Ancestors().OfType().ToList().Count() != 0) + { + var message = ((LiteralExpressionSyntax)literalExpression).ChildTokens().First().Value.ToString(); + var diag = Diagnostic.Create(Rule, literalExpression.GetLocation(), message); + c.ReportDiagnostic(diag); + } + + } + , SyntaxKind.NumericLiteralExpression, SyntaxKind.StringLiteralExpression, SyntaxKind.CharacterLiteralExpression); + } + } +} \ No newline at end of file diff --git a/DenChika_Analyzer/DenChika_Analyzer - Backup.csproj b/DenChika_Analyzer/DenChika_Analyzer - Backup.csproj new file mode 100644 index 0000000..7f826c1 --- /dev/null +++ b/DenChika_Analyzer/DenChika_Analyzer - Backup.csproj @@ -0,0 +1,24 @@ + + + + netstandard2.0 + false + + + *$(MSBuildProjectFile)* + AnalyzerTemplate + + + + + + + + + + + ResourcesPointO.Designer.cs + + + + diff --git a/DenChika_Analyzer/DenChika_Analyzer.csproj b/DenChika_Analyzer/DenChika_Analyzer.csproj new file mode 100644 index 0000000..a426412 --- /dev/null +++ b/DenChika_Analyzer/DenChika_Analyzer.csproj @@ -0,0 +1,26 @@ + + + + netstandard2.0 + false + + + *$(MSBuildProjectFile)* + DenChika_Analyzer + + + + + + + + + + ResourcesListsAndArrays.resx + + + ResourcesOPoint.Designer.cs + + + + diff --git a/DenChika_Analyzer/ResourcesListsAndArrays.Designer.cs b/DenChika_Analyzer/ResourcesListsAndArrays.Designer.cs new file mode 100644 index 0000000..3c21ad7 --- /dev/null +++ b/DenChika_Analyzer/ResourcesListsAndArrays.Designer.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DenChika_Analyzer { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class ResourcesListsAndArrays { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResourcesListsAndArrays() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DenChika_Analyzer.ResourcesListsAndArrays", typeof(ResourcesListsAndArrays).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Type should be converted in IReadOnlyCollection<T>. + /// + internal static string AnalyzerDescription { + get { + return ResourceManager.GetString("AnalyzerDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type name '{0}' should be converted in IReadOnlyCollection<T>. + /// + internal static string AnalyzerMessageFormat { + get { + return ResourceManager.GetString("AnalyzerMessageFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type should be converted. + /// + internal static string AnalyzerTitle { + get { + return ResourceManager.GetString("AnalyzerTitle", resourceCulture); + } + } + } +} diff --git a/DenChika_Analyzer/ResourcesListsAndArrays.resx b/DenChika_Analyzer/ResourcesListsAndArrays.resx new file mode 100644 index 0000000..9d36b27 --- /dev/null +++ b/DenChika_Analyzer/ResourcesListsAndArrays.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Type should be converted in IReadOnlyCollection<T> + An optional longer localizable description of the diagnostic. + + + Type name '{0}' should be converted in IReadOnlyCollection<T> + The format-able message the diagnostic displays. + + + Type should be converted + The title of the diagnostic. + + \ No newline at end of file diff --git a/DenChika_Analyzer/ResourcesMagicLiterals.Designer.cs b/DenChika_Analyzer/ResourcesMagicLiterals.Designer.cs new file mode 100644 index 0000000..947f722 --- /dev/null +++ b/DenChika_Analyzer/ResourcesMagicLiterals.Designer.cs @@ -0,0 +1,90 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DenChika_Analyzer { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class ResourcesMagicLiterals { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResourcesMagicLiterals() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DenChika_Analyzer.ResourcesMagicLiterals", typeof(ResourcesMagicLiterals).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Type should be converted in IReadOnlyCollection<T>. + /// + internal static string AnalyzerDescription { + get { + return ResourceManager.GetString("AnalyzerDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type name '{0}' should be converted in IReadOnlyCollection<T>. + /// + internal static string AnalyzerMessageFormat { + get { + return ResourceManager.GetString("AnalyzerMessageFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type should be converted. + /// + internal static string AnalyzerTitle { + get { + return ResourceManager.GetString("AnalyzerTitle", resourceCulture); + } + } + } +} diff --git a/DenChika_Analyzer/ResourcesMagicLiterals.resx b/DenChika_Analyzer/ResourcesMagicLiterals.resx new file mode 100644 index 0000000..3723e46 --- /dev/null +++ b/DenChika_Analyzer/ResourcesMagicLiterals.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Value should be replaced on const field + An optional longer localizable description of the diagnostic. + + + Const value '{0}' should be replaced on const field + The format-able message the diagnostic displays. + + + Replace declaration + The title of the diagnostic. + + \ No newline at end of file diff --git a/JavaDecompiler.md b/JavaDecompiler.md new file mode 100644 index 0000000..bd88fcf --- /dev/null +++ b/JavaDecompiler.md @@ -0,0 +1,163 @@ +```java +// class version 52.0 (52) +// access flags 0x21 +public class ScalaTrial { + + // compiled from: ScalaTrial.scala + + @Lscala/reflect/ScalaSignature;(bytes="\u0006\u0005\r2A!\u0002\u0004\u0001\u0013!)\u0001\u0003\u0001C\u0001#!)A\u0003\u0001C\u0001+!)Q\u0004\u0001C\u0001=!)\u0011\u0005\u0001C\u0001E\u0009Q1kY1mCR\u0013\u0018.\u00197\u000b\u0003\u001d\u0009q\u0001P3naRLhh\u0001\u0001\u0014\u0005\u0001Q\u0001CA\u0006\u000f\u001b\u0005a!\"A\u0007\u0002\u000bM\u001c\u0017\r\\1\n\u0005=a!AB!osJ+g-\u0001\u0004=S:LGO\u0010\u000b\u0002%A\u00111\u0003A\u0007\u0002\r\u0005)Q.\u001e7uSR\u0019a#G\u000e\u0011\u0005-9\u0012B\u0001\r\r\u0005\rIe\u000e\u001e\u0005\u00065\u0009\u0001\rAF\u0001\u0002q\")AD\u0001a\u0001-\u0005\u0009\u00110\u0001\u0003qYV\u001cHc\u0001\u000c A!)!d\u0001a\u0001-!)Ad\u0001a\u0001-\u0005!\u0001/\u001b9f)\u00051\u0002") + + ATTRIBUTE ScalaSig : unknown + + ATTRIBUTE ScalaInlineInfo : unknown + // access flags 0x19 + public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup + // access flags 0x9 + public static INNERCLASS scala/util/package$chaining$ scala/util/package chaining$ + + // access flags 0x1 + public multi(II)I + // parameter final x + // parameter final y + L0 + LINENUMBER 4 L0 + ILOAD 1 + ILOAD 2 + IMUL + IRETURN + L1 + LOCALVARIABLE this LScalaTrial; L0 L1 0 + LOCALVARIABLE x I L0 L1 1 + LOCALVARIABLE y I L0 L1 2 + MAXSTACK = 2 + MAXLOCALS = 3 + + // access flags 0x1 + public plus(II)I + // parameter final x + // parameter final y + L0 + LINENUMBER 5 L0 + ILOAD 1 + ILOAD 2 + IADD + IRETURN + L1 + LOCALVARIABLE this LScalaTrial; L0 L1 0 + LOCALVARIABLE x I L0 L1 1 + LOCALVARIABLE y I L0 L1 2 + MAXSTACK = 2 + MAXLOCALS = 3 + + // access flags 0x1 + public pipe()I + L0 + LINENUMBER 8 L0 + GETSTATIC scala/util/ChainingOps$.MODULE$ : Lscala/util/ChainingOps$; + GETSTATIC scala/util/package$chaining$.MODULE$ : Lscala/util/package$chaining$; + GETSTATIC scala/util/ChainingOps$.MODULE$ : Lscala/util/ChainingOps$; + GETSTATIC scala/util/package$chaining$.MODULE$ : Lscala/util/package$chaining$; + ICONST_2 + INVOKESTATIC scala/runtime/BoxesRunTime.boxToInteger (I)Ljava/lang/Integer; + INVOKEVIRTUAL scala/util/package$chaining$.scalaUtilChainingOps (Ljava/lang/Object;)Ljava/lang/Object; + ALOAD 0 + INVOKEDYNAMIC apply$mcII$sp(LScalaTrial;)Lscala/runtime/java8/JFunction1$mcII$sp; [ + // handle kind 0x6 : INVOKESTATIC + java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + // arguments: + (I)I, + // handle kind 0x6 : INVOKESTATIC + ScalaTrial.$anonfun$pipe$1(LScalaTrial;I)I, + (I)I, + 1 + ] + INVOKEVIRTUAL scala/util/ChainingOps$.pipe$extension (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object; + INVOKEVIRTUAL scala/util/package$chaining$.scalaUtilChainingOps (Ljava/lang/Object;)Ljava/lang/Object; + ALOAD 0 + INVOKEDYNAMIC apply$mcII$sp(LScalaTrial;)Lscala/runtime/java8/JFunction1$mcII$sp; [ + // handle kind 0x6 : INVOKESTATIC + java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + // arguments: + (I)I, + // handle kind 0x6 : INVOKESTATIC + ScalaTrial.$anonfun$pipe$2(LScalaTrial;I)I, + (I)I, + 1 + ] + INVOKEVIRTUAL scala/util/ChainingOps$.pipe$extension (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object; + INVOKESTATIC scala/runtime/BoxesRunTime.unboxToInt (Ljava/lang/Object;)I + ISTORE 1 + L1 + LINENUMBER 9 L1 + ILOAD 1 + L2 + IRETURN + L3 + LOCALVARIABLE x I L1 L2 1 + LOCALVARIABLE this LScalaTrial; L0 L3 0 + MAXSTACK = 5 + MAXLOCALS = 2 + + // access flags 0x1019 + public final static synthetic $anonfun$pipe$1(LScalaTrial;I)I + // parameter final synthetic $this + // parameter final x$1 + L0 + LINENUMBER 8 L0 + ALOAD 0 + ILOAD 1 + ICONST_3 + INVOKEVIRTUAL ScalaTrial.plus (II)I + IRETURN + L1 + LOCALVARIABLE $this LScalaTrial; L0 L1 0 + LOCALVARIABLE x$1 I L0 L1 1 + MAXSTACK = 3 + MAXLOCALS = 2 + + // access flags 0x1019 + public final static synthetic $anonfun$pipe$2(LScalaTrial;I)I + // parameter final synthetic $this + // parameter final x$2 + L0 + LINENUMBER 8 L0 + ALOAD 0 + ILOAD 1 + ICONST_2 + INVOKEVIRTUAL ScalaTrial.multi (II)I + IRETURN + L1 + LOCALVARIABLE $this LScalaTrial; L0 L1 0 + LOCALVARIABLE x$2 I L0 L1 1 + MAXSTACK = 3 + MAXLOCALS = 2 + + // access flags 0x1 + public ()V + L0 + LINENUMBER 3 L0 + ALOAD 0 + INVOKESPECIAL java/lang/Object. ()V + RETURN + L1 + LOCALVARIABLE this LScalaTrial; L0 L1 0 + MAXSTACK = 1 + MAXLOCALS = 1 + + // access flags 0x100A + private static synthetic $deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; + ALOAD 0 + INVOKEDYNAMIC lambdaDeserialize(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; [ + // handle kind 0x6 : INVOKESTATIC + scala/runtime/LambdaDeserialize.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite; + // arguments: + // handle kind 0x6 : INVOKESTATIC + ScalaTrial.$anonfun$pipe$1(LScalaTrial;I)I, + // handle kind 0x6 : INVOKESTATIC + ScalaTrial.$anonfun$pipe$2(LScalaTrial;I)I + ] + ARETURN + MAXSTACK = 1 + MAXLOCALS = 1 +} +``` diff --git a/SharpDecompiler.md b/SharpDecompiler.md new file mode 100644 index 0000000..5250352 --- /dev/null +++ b/SharpDecompiler.md @@ -0,0 +1,327 @@ +```cs +// Decompiled with JetBrains decompiler +// Type: Program +// Assembly: FSharpTrial, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null +// MVID: D85670CC-88CF-0636-AC1A-2F1C7D3E921B +// Assembly location: C:\Users\volok\RiderProjects\Solution1\CSharpTesting\bin\Debug\net6.0\FSharpTrial.dll + +using Microsoft.FSharp.Core; +using System; +using System.Collections; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[CompilationMapping(SourceConstructFlags.Module)] +public static class Program +{ + [CompilationArgumentCounts(new int[] {1, 1})] + public static int multi(int x, int y) => x * y; + + [CompilationArgumentCounts(new int[] {1, 1})] + public static int plus(int x, int y) => x + y; + + [CompilationArgumentCounts(new int[] {1, 1, 1})] + public static int result(int x, int y, int z) + { + int y1 = Program.multi(x, y); + return Program.plus(z, y1); + } + + public static void unionTrial(int x) + { + Program.IntOrBool intOrBool1 = Program.IntOrBool.NewI(x); + Program.IntOrBool intOrBool2 = Program.IntOrBool.NewB(x % 2 == 0); + ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%d%P()", new object[1] + { + (object) x + }, (Type[]) null)); + ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%P() is odd?", new object[1] + { + (object) intOrBool1 + }, (Type[]) null)); + ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%P()!", new object[1] + { + (object) intOrBool2 + }, (Type[]) null)); + } + + [DebuggerDisplay("{__DebugDisplay(),nq}")] + [CompilationMapping(SourceConstructFlags.SumType)] + [Serializable] + [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] + public abstract class IntOrBool : + IEquatable, + IStructuralEquatable, + IComparable, + IComparable, + IStructuralComparable + { + [CompilerGenerated] + [DebuggerNonUserCode] + internal IntOrBool() + { + } + + [CompilationMapping(SourceConstructFlags.UnionCase, 0)] + public static Program.IntOrBool NewI(int item) => (Program.IntOrBool) new Program.IntOrBool.I(item); + + [CompilerGenerated] + [DebuggerNonUserCode] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public bool IsI + { + [DebuggerNonUserCode] get => this is Program.IntOrBool.I; + } + + [DebuggerNonUserCode] + public bool get_IsI() => this is Program.IntOrBool.I; + + [CompilationMapping(SourceConstructFlags.UnionCase, 1)] + public static Program.IntOrBool NewB(bool item) => (Program.IntOrBool) new Program.IntOrBool.B(item); + + [CompilerGenerated] + [DebuggerNonUserCode] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public bool IsB + { + [DebuggerNonUserCode] get => this is Program.IntOrBool.B; + } + + [DebuggerNonUserCode] + public bool get_IsB() => this is Program.IntOrBool.B; + + [CompilerGenerated] + [DebuggerNonUserCode] + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + public int Tag + { + [DebuggerNonUserCode] get => this is Program.IntOrBool.B ? 1 : 0; + } + + [DebuggerNonUserCode] + public int get_Tag() => this is Program.IntOrBool.B ? 1 : 0; + + [CompilerGenerated] + [DebuggerNonUserCode] + [SpecialName] + internal object __DebugDisplay() => (object) ExtraTopLevelOperators.PrintFormatToString>((PrintfFormat, Unit, string, string>) new PrintfFormat, Unit, string, string, string>("%+0.8A")).Invoke(this); + + [CompilerGenerated] + public override string ToString() => ExtraTopLevelOperators.PrintFormatToString>((PrintfFormat, Unit, string, string>) new PrintfFormat, Unit, string, string, Program.IntOrBool>("%+A")).Invoke(this); + + [CompilerGenerated] + public virtual int CompareTo(Program.IntOrBool obj) + { + if (this != null) + { + if (obj == null) + return 1; + int num1 = !(this is Program.IntOrBool.B) ? 0 : 1; + int num2 = !(obj is Program.IntOrBool.B) ? 0 : 1; + if (num1 != num2) + return num1 - num2; + if (this is Program.IntOrBool.I) + { + Program.IntOrBool.I i1 = (Program.IntOrBool.I) this; + Program.IntOrBool.I i2 = (Program.IntOrBool.I) obj; + IComparer genericComparer = LanguagePrimitives.GenericComparer; + int num3 = i1.item; + int num4 = i2.item; + return num3 < num4 ? -1 : (num3 > num4 ? 1 : 0); + } + Program.IntOrBool.B b1 = (Program.IntOrBool.B) this; + Program.IntOrBool.B b2 = (Program.IntOrBool.B) obj; + IComparer genericComparer1 = LanguagePrimitives.GenericComparer; + bool flag1 = b1.item; + bool flag2 = b2.item; + return (flag1 ? 1 : 0) < (flag2 ? 1 : 0) ? -1 : ((flag1 ? 1 : 0) > (flag2 ? 1 : 0) ? 1 : 0); + } + return obj != null ? -1 : 0; + } + + [CompilerGenerated] + public virtual int CompareTo(object obj) => this.CompareTo((Program.IntOrBool) obj); + + [CompilerGenerated] + public virtual int CompareTo(object obj, IComparer comp) + { + Program.IntOrBool intOrBool = (Program.IntOrBool) obj; + if (this != null) + { + if ((Program.IntOrBool) obj == null) + return 1; + int num1 = !(this is Program.IntOrBool.B) ? 0 : 1; + int num2 = !(intOrBool is Program.IntOrBool.B) ? 0 : 1; + if (num1 != num2) + return num1 - num2; + if (this is Program.IntOrBool.I) + { + Program.IntOrBool.I i1 = (Program.IntOrBool.I) this; + Program.IntOrBool.I i2 = (Program.IntOrBool.I) intOrBool; + int num3 = i1.item; + int num4 = i2.item; + return num3 < num4 ? -1 : (num3 > num4 ? 1 : 0); + } + Program.IntOrBool.B b1 = (Program.IntOrBool.B) this; + Program.IntOrBool.B b2 = (Program.IntOrBool.B) intOrBool; + bool flag1 = b1.item; + bool flag2 = b2.item; + return (flag1 ? 1 : 0) < (flag2 ? 1 : 0) ? -1 : ((flag1 ? 1 : 0) > (flag2 ? 1 : 0) ? 1 : 0); + } + return (Program.IntOrBool) obj != null ? -1 : 0; + } + + [CompilerGenerated] + public virtual int GetHashCode(IEqualityComparer comp) + { + if (this == null) + return 0; + if (this is Program.IntOrBool.I) + { + Program.IntOrBool.I i = (Program.IntOrBool.I) this; + int num = 0; + return i.item + ((num << 6) + (num >> 2)) - 1640531527; + } + Program.IntOrBool.B b = (Program.IntOrBool.B) this; + int num1 = 1; + return (b.item ? 1 : 0) + ((num1 << 6) + (num1 >> 2)) - 1640531527; + } + + [CompilerGenerated] + public override sealed int GetHashCode() => this.GetHashCode(LanguagePrimitives.GenericEqualityComparer); + + [CompilerGenerated] + public virtual bool Equals(object obj, IEqualityComparer comp) + { + if (this == null) + return obj == null; + if (!(obj is Program.IntOrBool intOrBool) || (!(this is Program.IntOrBool.B) ? 0 : 1) != (!(intOrBool is Program.IntOrBool.B) ? 0 : 1)) + return false; + return this is Program.IntOrBool.I ? ((Program.IntOrBool.I) this).item == ((Program.IntOrBool.I) intOrBool).item : ((Program.IntOrBool.B) this).item == ((Program.IntOrBool.B) intOrBool).item; + } + + [CompilerGenerated] + public virtual bool Equals(Program.IntOrBool obj) + { + if (this == null) + return obj == null; + if (obj == null || (!(this is Program.IntOrBool.B) ? 0 : 1) != (!(obj is Program.IntOrBool.B) ? 0 : 1)) + return false; + return this is Program.IntOrBool.I ? ((Program.IntOrBool.I) this).item == ((Program.IntOrBool.I) obj).item : ((Program.IntOrBool.B) this).item == ((Program.IntOrBool.B) obj).item; + } + + [CompilerGenerated] + public override sealed bool Equals(object obj) => obj is Program.IntOrBool intOrBool && this.Equals(intOrBool); + + public static class Tags + { + public const int I = 0; + public const int B = 1; + } + + [DebuggerTypeProxy(typeof (Program.IntOrBool.I\u0040DebugTypeProxy))] + [DebuggerDisplay("{__DebugDisplay(),nq}")] + [Serializable] + [SpecialName] + public class I : Program.IntOrBool + { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + [CompilerGenerated] + [DebuggerNonUserCode] + internal readonly int item; + + [CompilerGenerated] + [DebuggerNonUserCode] + internal I(int item) => this.item = item; + + [CompilationMapping(SourceConstructFlags.Field, 0, 0)] + [CompilerGenerated] + [DebuggerNonUserCode] + public int Item + { + [DebuggerNonUserCode] get => this.item; + } + + [DebuggerNonUserCode] + public int get_Item() => this.item; + } + + [DebuggerTypeProxy(typeof (Program.IntOrBool.B\u0040DebugTypeProxy))] + [DebuggerDisplay("{__DebugDisplay(),nq}")] + [Serializable] + [SpecialName] + public class B : Program.IntOrBool + { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + [CompilerGenerated] + [DebuggerNonUserCode] + internal readonly bool item; + + [CompilerGenerated] + [DebuggerNonUserCode] + internal B(bool item) => this.item = item; + + [CompilationMapping(SourceConstructFlags.Field, 1, 0)] + [CompilerGenerated] + [DebuggerNonUserCode] + public bool Item + { + [DebuggerNonUserCode] get => this.item; + } + + [DebuggerNonUserCode] + public bool get_Item() => this.item; + } + + [SpecialName] + internal class I\u0040DebugTypeProxy + { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + [CompilerGenerated] + [DebuggerNonUserCode] + internal Program.IntOrBool.I _obj; + + [CompilerGenerated] + [DebuggerNonUserCode] + public I\u0040DebugTypeProxy(Program.IntOrBool.I obj) => this._obj = obj; + + [CompilationMapping(SourceConstructFlags.Field, 0, 0)] + [CompilerGenerated] + [DebuggerNonUserCode] + public int Item + { + [DebuggerNonUserCode] get => this._obj.item; + } + + [DebuggerNonUserCode] + public int get_Item() => this._obj.item; + } + + [SpecialName] + internal class B\u0040DebugTypeProxy + { + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + [CompilerGenerated] + [DebuggerNonUserCode] + internal Program.IntOrBool.B _obj; + + [CompilerGenerated] + [DebuggerNonUserCode] + public B\u0040DebugTypeProxy(Program.IntOrBool.B obj) => this._obj = obj; + + [CompilationMapping(SourceConstructFlags.Field, 1, 0)] + [CompilerGenerated] + [DebuggerNonUserCode] + public bool Item + { + [DebuggerNonUserCode] get => this._obj.item; + } + + [DebuggerNonUserCode] + public bool get_Item() => this._obj.item; + } + } +} +``` diff --git a/TechLab1.md b/TechLab1.md new file mode 100644 index 0000000..c46bdf5 --- /dev/null +++ b/TechLab1.md @@ -0,0 +1,591 @@ +# TechLabs +## Лабораторная работа 1 +### Point 1 +```cpp +#include "pch.h" +#include "framework.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +#include + +extern "C" +{ + __declspec (dllexport) void __stdcall Java_MyClass_MyMethod() + { + std::cout << "Hello Java from C++"; + } + + __declspec (dllexport) void MyMethod() + { + std::cout << "Hello C# from C++"; + } +} +``` +Для начала, нужно создать срр файл и подключить dll библиотеку, а также перевести конфигурацию с Debug на Release. В конце исходника нужно написать extern "C", а внутри методы, которые мы хотим чтоб вызывались в Java и C#. "__declspec (dllexport)" - требование для каждого dll метода. Без этой приписки работать не будет. "__stdcall" - требование для Java, чтобы вызвать метод из dll. Лично у меня метод называется с припиской Java_"имя класса". В источнике, с которого я брал информацию, было сказано, что это тоже требование для вызова в Java, однако я знаю людей, у которых работало и без этого. В C# приписка "__stdcall" необязательна. + +#### Для работы с Java: +Нужно сбилдить проект и скопировать dll файл (не наш cpp файл, а именно dll) в проект в IDE, но только не внутрь src или каких-то других папок. Код в Java выглядит так: +```java +public class MyClass { + public native void MyMethod(); + + static + { + System.loadLibrary("Dll1"); + } + public static void main(String args[]) { + new MyClass().MyMethod(); + } +} +``` +Мы объявляем метод срр файла с модификатором native как раз для того, чтобы вызывать его из dll. Через System.loadLibrary("имя dll") загружаем библиотеку и в main вызываем метод. + +#### Для работы с C#: +Нужно сбилдить проект и скопировать путь на dll файл, затем импортировать dll: в DllImport указать этот путь и указать CallingConvention = Cdecl, иначе выкинется ошибка. У метода ставится модификатор extern (как в Java native). Код выглядит так: +```cs +using System; +using System.Runtime.InteropServices; + +namespace CPPInterop +{ + internal static class Program + { + private const string _dllPath = @"C:\Users\volok\source\repos\InteropCPP\x64\Release\Dll1"; + + [DllImport(_dllPath, CallingConvention = CallingConvention.Cdecl)] + + public static extern void MyMethod(); + + private static void Main() + { + MyMethod(); + } + } +} +``` + +Из сложностей работы с интеропом особо ничего не могу выделить - у меня проблем не было. Ограничений работы я тоже не увидел. +Источники информации: +https://www.youtube.com/watch?v=o-ass4mkdiA&t=0s +https://www.youtube.com/watch?v=41leCIAzSd0&t=0s + +### Point 2 +#### F# и декомпиляция в C#: +Код на F#: +```fs +let multi x y = x * y +let plus x y = x + y +type IntOrBool = + | I of int + | B of bool +let result x y z = multi x y |> plus z +let unionTrial x = + let i = I x + let b = B (x % 2 = 0) + printfn $"%d{x} + printfn $"{i} is odd?" + printfn $"{b}!" +``` +Честно, разбирался с Computation Expressions, но мало что понял, поэтому код очень простой и написан с использованием Pipe Operator и Discriminated Union. Его вызов в C#: +```cs +using System; + +namespace CSharpTesting +{ + internal static class Program + { + private static void Main() + { + var res = global::Program.result(1, 2, 3); + global::Program.unionTrial(res); + } + } +} +``` +Для вызова F# методов в C# требуется только вызвать их с global(и то, насколько я знаю, у некоторых работало и без него). Чтобы декомпилировать в C# я использовал dotPeek. +При декомпиляции в C# Discriminated Union превращается в абстрактный класс, и из-за этого код значительно раздувается. Сам код декомпиляции лежит в [SharpDecompiler.md](SharpDecompiler.md) +#### Scala и декомпиляция в Java: +Код на Scala: +```scala +import scala.util.chaining.scalaUtilChainingOps + +class ScalaTrial { + def multi(x : Int, y : Int): Int = x * y + def plus(x : Int, y : Int): Int = x + y + + def pipe() : Int = { + val x = 2.pipe(plus(_, 3)).pipe(multi(_, 2)) + x + } +} +``` +Что касается Scala, то, насколько я понял, там нет ни Discriminated Union, ни Computation Expressions, поэтому я написал максимально простой код с использованием .pipe(). Вызов кода в Java: +```java +public class JavaTesting { + public static void main(String[] args) { + ScalaTrial myObj = new ScalaTrial(); + int x = myObj.pipe(); + System.out.println(x); + } +} +``` +Как видно, ничего не мешает просто вызвать Scala метод в Java. Декомпилировал я с помощью View->Show Bytecode в IntelliJ. Код декомпиляции лежит в [JavaDecompiler.md](JavaDecompiler.md), и по факту декомпилятор просто подключил модуль Scala и использовал .pipe(). +### Point 3 +#### Работа с C# +DFS и BFS: +```cs +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace CSharpGraphFs +{ + public class Graph + { + private int _V; + + private LinkedList[] _adj; + public Graph(int V) + { + _adj = new LinkedList[V]; + for(var i = 0; i < _adj.Length; i++) + { + _adj[i] = new LinkedList(); + } + _V = V; + } + + + public void AddEdge(int v, int w) + { + _adj[v].AddLast(w); + + } + + public void DFSUtil(int v, bool[] visited) + { + visited[v] = true; + Console.Write(v + " "); + var vList = _adj[v]; + foreach (var n in vList.Where(n => !visited[n])) + { + DFSUtil(n, visited); + } + } + + public void DFS(int v) + { + var visited = new bool[_V]; + DFSUtil(v, visited); + } + + public void BFS(int s) + { + + var visited = new bool[_V]; + for(var i = 0; i < _V; i++) + visited[i] = false; + + var queue = new LinkedList(); + visited[s] = true; + queue.AddLast(s); + + while(queue.Any()) + { + s = queue.First(); + Console.Write(s + " " ); + queue.RemoveFirst(); + var list = _adj[s]; + + foreach (var val in list.Where(val => !visited[val])) + { + visited[val] = true; + queue.AddLast(val); + } + } + } + } +} +``` +Собрать пакет можно с помощью NuGet. Для этого надо нажать пкм по проекту, выбрать Advanced Build Actions -> Pack Selected Project. После этого зайти в NuGet, нажать на sources, а затем New feed, а путь указать до Debug нашего проекта. Все готово, можно использовать пакет в другом проекте, добавив в начале using: +```cs +using CSharpGraphFs; + +namespace PackageUsing +{ + internal static class Program + { + private static void Main() + { + Graph graph = new Graph(6); + graph.AddEdge(0, 1); + graph.AddEdge(0, 2); + graph.AddEdge(1, 0); + graph.AddEdge(1, 3); + graph.AddEdge(2, 0); + graph.AddEdge(2, 3); + graph.AddEdge(3, 4); + graph.AddEdge(3, 5); + graph.AddEdge(4, 3); + graph.AddEdge(5, 3); + + graph.DFS(0); + Console.WriteLine('\n'); + graph.BFS(0); + } + } +} +``` +Для себя могу отметить сложность, которая у меня возникала: если обходы графа были изначально не совсем правильно написаны, а мы уже запаковали, то я не нашёл другого способа, кроме как пересоздать проект и запаковать заново. +#### Работа с Java +DFS и BFS: +```java +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Stack; + +public class JavaGraph { + int V; + + LinkedList[] adj; + + JavaGraph(int V) + { + this.V = V; + adj = new LinkedList[V]; + for (int i = 0; i < adj.length; i++) + adj[i] = new LinkedList(); + } + + void addEdge(int v, int w) + { + adj[v].add(w); + } + + void DFS(int n) + { + boolean[] nodes = new boolean[V]; + Stack stack = new Stack<>(); + stack.push(n); + int a = 0; + while(!stack.empty()) + { + n = stack.peek(); + stack.pop(); + if(!nodes[n]) + { + System.out.print(n + " "); + nodes[n] = true; + } + for (int i = 0; i < adj[n].size(); i++) + { + a = adj[n].get(i); + if (!nodes[a]) + { + stack.push(a); + } + } + } + } + + void BFS(int n) + { + boolean visited[] = new boolean[V]; + LinkedList queue = new LinkedList(); + visited[n]=true; + queue.add(n); + + while (queue.size() != 0) + { + n = queue.poll(); + System.out.print(n + " "); + Iterator i = adj[n].listIterator(); + while (i.hasNext()) + { + int next = i.next(); + if (!visited[next]) + { + visited[next] = true; + queue.add(next); + } + } + } + } +} +``` +С Java все немного сложнее. Лично я использовал Framework поддержку Maven и Groovy. Сначала с помощью Maven пакетируем проект, а потом нажимаем пкм по проекту -> Open Module Settings и добавляем в Libraries .jar файл, который создался, когда мы пакетировали проект (лежит в target). Все, пакет создался, можем его использовать: +```java +public class MyOwnMavenPackageTesting { + public static void main(String[] args) { + JavaGraph graph = new JavaGraph(6); + graph.addEdge(0, 1); + graph.addEdge(0, 2); + graph.addEdge(1, 0); + graph.addEdge(1, 3); + graph.addEdge(2, 0); + graph.addEdge(2, 3); + graph.addEdge(3, 4); + graph.addEdge(3, 5); + graph.addEdge(4, 3); + graph.addEdge(5, 3); + + graph.DFS(0); + System.out.println('\n'); + graph.BFS(0); + } +} +``` +При использовании пакета ничего добавлять не нужно, пакет используется автоматически. +### Point 4 +Я выбрал Gnome sort, Bubble sort и встроенную сортировку для анализа их работы с помощью Benchmark. +#### Работа с C# +Алгоритмы сортировок: +```cs +using System; +using BenchmarkDotNet.Attributes; + +namespace Benchmarks +{ + [MemoryDiagnoser] + public class Sorting + { + private const int Size = 10000; + + private readonly int[] _arr; + + public Sorting() + { + _arr = new int[Size]; + for (var i = 0; i < Size; i++) + { + _arr[i] = new Random().Next(); + } + } + + [Benchmark] + public int[] BubbleSort() + { + int temp; + var arr = _arr.ToArray(); + for (var i = 0; i < arr.Length; i++) + { + for (var j = i + 1; j < arr.Length; j++) + { + if (arr[i] <= arr[j]) continue; + temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + } + + return arr; + } + private void Swap(ref int item1, ref int item2) + { + (item1, item2) = (item2, item1); + } + + [Benchmark] + public int[] GnomeSort() + { + var index = 1; + var nextIndex = index + 1; + var arr = _arr.ToArray(); + while (index < arr.Length) + { + if (arr[index - 1] < arr[index]) + { + index = nextIndex; + nextIndex++; + } + else + { + Swap(ref arr[index - 1], ref arr[index]); + index--; + if (index != 0) continue; + index = nextIndex; + nextIndex++; + } + } + + return arr; + } + + [Benchmark] + public int[] BuiltInSort() + { + var arr = _arr.ToArray(); + Array.Sort(arr); + return arr; + } + + } +} +``` +Нам нужно установить BenchmarkDotNet NuGet пакет. Затем для анализа аллокации памяти добавить атрибут "MemoryDiagnoser" перед объявлением класса, а для анализа времени выполнения добавить атрибут "Benchmark" до каждого определения функции. Код выполнения Benchmark: +```cs +using BenchmarkDotNet.Reports; +using BenchmarkDotNet.Running; + +namespace Benchmarks +{ + internal static class Program + { + private static void Main() + { + var summary = BenchmarkRunner.Run(); + } + } +} +``` +Результат выполнения:\ +![image](https://user-images.githubusercontent.com/79001610/156830279-ae95ce74-8fa2-45d8-b640-fde9382e8c60.png)\ +Как и ожидалось, bubble sort отработала медленней всех, а встроенная быстрее всех, при этом память выделяется почти одинаково во всех алгоритмах. +#### Работа с Java +Алгоритмы сортировок: +```java +package com.Benchmarks; + +import org.openjdk.jmh.annotations.*; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 2, jvmArgs = {"-Xms2G", "-Xmx2G"}) +public class Sorting { + + @Param({"10000"}) + private int Size; + + private int[] _arr; + + public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } + + public Sorting() + { + _arr = new int[Size]; + for (var i = 0; i < Size; i++) + { + _arr[i] = (int) (Math.random() * 10000); + } + } + + @org.openjdk.jmh.annotations.Benchmark + @Fork(value = 1, warmups = 1) + @Warmup(iterations = 2) + public int[] BubbleSort() + { + var arr = _arr; + for (int i = 0; i < arr.length - 1; i++) { + for (int j = 0; j < arr.length - i - 1; j++) + if (arr[j] > arr[j + 1]) { + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + + return arr; + } + + @org.openjdk.jmh.annotations.Benchmark + @Fork(value = 1, warmups = 1) + @Warmup(iterations = 2) + public int[] GnomeSort() + { + int index = 0; + var arr = _arr; + while (index < arr.length) { + if (index == 0) + index++; + if (arr[index] >= arr[index - 1]) + index++; + else { + int temp = 0; + temp = arr[index]; + arr[index] = arr[index - 1]; + arr[index - 1] = temp; + index--; + } + } + return arr; + } + + @org.openjdk.jmh.annotations.Benchmark + @Fork(value = 1, warmups = 1) + @Warmup(iterations = 2) + public int[] BuiltInSort() + { + var arr = _arr; + Arrays.sort(arr); + return arr; + } +} +``` +В Java JMH работает крайне сложно и неприятно. Для начала запустить Maven и открыть pom файл, туда добавить зависимостей: +```xml + + + org.openjdk.jmh + jmh-core + 1.33 + + + org.openjdk.jmh + jmh-generator-annprocess + 1.33 + + +``` +Затем в Maven обновить все проекты. Касаемо алгоритмов сортировок: лично я добавил +```java +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Benchmark) +@Fork(value = 2, jvmArgs = {"-Xms2G", "-Xmx2G"}) +``` +до объявления класса, а перед каждым алгоритмом добавлял вот это: +```java +@org.openjdk.jmh.annotations.Benchmark +@Fork(value = 1, warmups = 1) +@Warmup(iterations = 2) +``` +Затем надо запустить JMH: +```java +public static void main(String[] args) throws Exception { + org.openjdk.jmh.Main.main(args); + } +``` +Некоторые из атрибутов опциональны и нужны просто для большей информации.\ +Результат работы:\ +![image](https://user-images.githubusercontent.com/79001610/156833698-8e0fd4c4-24cb-4283-8190-6ee699d3ce75.png)\ +Очень странно получилось, но почему-то в Java получилось всё наоборот, скорость bubble sort самая большая, а встроенная самая медленная (по количеству операций в наносекунду). +Источники: https://mkyong.com/java/java-jmh-benchmark-tutorial/ +### Point 5 +Для анализа я использовал dotMemory.\ +С файловой системой:\ +![image](https://user-images.githubusercontent.com/79001610/156853257-5195520c-b8b6-4dd5-8450-052de1b28928.png)\ +Не с файловой системой:\ +![image](https://user-images.githubusercontent.com/79001610/156853438-42919d60-4b0c-4c2e-b94f-d89e8286e319.png)\ +Почему-то получились абсолютно одинаковые результаты, хотя с файловой системой сборщик мусора начинает удалять точки, и общая картина должна выглядеть примерно как зубы акулы, но этого не происходит - странно. diff --git a/TestProject/Program.cs b/TestProject/Program.cs new file mode 100644 index 0000000..3751555 --- /dev/null +++ b/TestProject/Program.cs @@ -0,0 +1,2 @@ +// See https://aka.ms/new-console-template for more information +Console.WriteLine("Hello, World!"); diff --git a/TestProject/TestProject.csproj b/TestProject/TestProject.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/TestProject/TestProject.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + From 9f15e4fdc1bf93b21b4eb79e3745a6579d6e7e90 Mon Sep 17 00:00:00 2001 From: DenChika <79001610+DenChika@users.noreply.github.com> Date: Mon, 15 Aug 2022 16:50:09 +0500 Subject: [PATCH 2/4] Delete JavaDecompiler.md --- JavaDecompiler.md | 163 ---------------------------------------------- 1 file changed, 163 deletions(-) delete mode 100644 JavaDecompiler.md diff --git a/JavaDecompiler.md b/JavaDecompiler.md deleted file mode 100644 index bd88fcf..0000000 --- a/JavaDecompiler.md +++ /dev/null @@ -1,163 +0,0 @@ -```java -// class version 52.0 (52) -// access flags 0x21 -public class ScalaTrial { - - // compiled from: ScalaTrial.scala - - @Lscala/reflect/ScalaSignature;(bytes="\u0006\u0005\r2A!\u0002\u0004\u0001\u0013!)\u0001\u0003\u0001C\u0001#!)A\u0003\u0001C\u0001+!)Q\u0004\u0001C\u0001=!)\u0011\u0005\u0001C\u0001E\u0009Q1kY1mCR\u0013\u0018.\u00197\u000b\u0003\u001d\u0009q\u0001P3naRLhh\u0001\u0001\u0014\u0005\u0001Q\u0001CA\u0006\u000f\u001b\u0005a!\"A\u0007\u0002\u000bM\u001c\u0017\r\\1\n\u0005=a!AB!osJ+g-\u0001\u0004=S:LGO\u0010\u000b\u0002%A\u00111\u0003A\u0007\u0002\r\u0005)Q.\u001e7uSR\u0019a#G\u000e\u0011\u0005-9\u0012B\u0001\r\r\u0005\rIe\u000e\u001e\u0005\u00065\u0009\u0001\rAF\u0001\u0002q\")AD\u0001a\u0001-\u0005\u0009\u00110\u0001\u0003qYV\u001cHc\u0001\u000c A!)!d\u0001a\u0001-!)Ad\u0001a\u0001-\u0005!\u0001/\u001b9f)\u00051\u0002") - - ATTRIBUTE ScalaSig : unknown - - ATTRIBUTE ScalaInlineInfo : unknown - // access flags 0x19 - public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup - // access flags 0x9 - public static INNERCLASS scala/util/package$chaining$ scala/util/package chaining$ - - // access flags 0x1 - public multi(II)I - // parameter final x - // parameter final y - L0 - LINENUMBER 4 L0 - ILOAD 1 - ILOAD 2 - IMUL - IRETURN - L1 - LOCALVARIABLE this LScalaTrial; L0 L1 0 - LOCALVARIABLE x I L0 L1 1 - LOCALVARIABLE y I L0 L1 2 - MAXSTACK = 2 - MAXLOCALS = 3 - - // access flags 0x1 - public plus(II)I - // parameter final x - // parameter final y - L0 - LINENUMBER 5 L0 - ILOAD 1 - ILOAD 2 - IADD - IRETURN - L1 - LOCALVARIABLE this LScalaTrial; L0 L1 0 - LOCALVARIABLE x I L0 L1 1 - LOCALVARIABLE y I L0 L1 2 - MAXSTACK = 2 - MAXLOCALS = 3 - - // access flags 0x1 - public pipe()I - L0 - LINENUMBER 8 L0 - GETSTATIC scala/util/ChainingOps$.MODULE$ : Lscala/util/ChainingOps$; - GETSTATIC scala/util/package$chaining$.MODULE$ : Lscala/util/package$chaining$; - GETSTATIC scala/util/ChainingOps$.MODULE$ : Lscala/util/ChainingOps$; - GETSTATIC scala/util/package$chaining$.MODULE$ : Lscala/util/package$chaining$; - ICONST_2 - INVOKESTATIC scala/runtime/BoxesRunTime.boxToInteger (I)Ljava/lang/Integer; - INVOKEVIRTUAL scala/util/package$chaining$.scalaUtilChainingOps (Ljava/lang/Object;)Ljava/lang/Object; - ALOAD 0 - INVOKEDYNAMIC apply$mcII$sp(LScalaTrial;)Lscala/runtime/java8/JFunction1$mcII$sp; [ - // handle kind 0x6 : INVOKESTATIC - java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; - // arguments: - (I)I, - // handle kind 0x6 : INVOKESTATIC - ScalaTrial.$anonfun$pipe$1(LScalaTrial;I)I, - (I)I, - 1 - ] - INVOKEVIRTUAL scala/util/ChainingOps$.pipe$extension (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object; - INVOKEVIRTUAL scala/util/package$chaining$.scalaUtilChainingOps (Ljava/lang/Object;)Ljava/lang/Object; - ALOAD 0 - INVOKEDYNAMIC apply$mcII$sp(LScalaTrial;)Lscala/runtime/java8/JFunction1$mcII$sp; [ - // handle kind 0x6 : INVOKESTATIC - java/lang/invoke/LambdaMetafactory.altMetafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; - // arguments: - (I)I, - // handle kind 0x6 : INVOKESTATIC - ScalaTrial.$anonfun$pipe$2(LScalaTrial;I)I, - (I)I, - 1 - ] - INVOKEVIRTUAL scala/util/ChainingOps$.pipe$extension (Ljava/lang/Object;Lscala/Function1;)Ljava/lang/Object; - INVOKESTATIC scala/runtime/BoxesRunTime.unboxToInt (Ljava/lang/Object;)I - ISTORE 1 - L1 - LINENUMBER 9 L1 - ILOAD 1 - L2 - IRETURN - L3 - LOCALVARIABLE x I L1 L2 1 - LOCALVARIABLE this LScalaTrial; L0 L3 0 - MAXSTACK = 5 - MAXLOCALS = 2 - - // access flags 0x1019 - public final static synthetic $anonfun$pipe$1(LScalaTrial;I)I - // parameter final synthetic $this - // parameter final x$1 - L0 - LINENUMBER 8 L0 - ALOAD 0 - ILOAD 1 - ICONST_3 - INVOKEVIRTUAL ScalaTrial.plus (II)I - IRETURN - L1 - LOCALVARIABLE $this LScalaTrial; L0 L1 0 - LOCALVARIABLE x$1 I L0 L1 1 - MAXSTACK = 3 - MAXLOCALS = 2 - - // access flags 0x1019 - public final static synthetic $anonfun$pipe$2(LScalaTrial;I)I - // parameter final synthetic $this - // parameter final x$2 - L0 - LINENUMBER 8 L0 - ALOAD 0 - ILOAD 1 - ICONST_2 - INVOKEVIRTUAL ScalaTrial.multi (II)I - IRETURN - L1 - LOCALVARIABLE $this LScalaTrial; L0 L1 0 - LOCALVARIABLE x$2 I L0 L1 1 - MAXSTACK = 3 - MAXLOCALS = 2 - - // access flags 0x1 - public ()V - L0 - LINENUMBER 3 L0 - ALOAD 0 - INVOKESPECIAL java/lang/Object. ()V - RETURN - L1 - LOCALVARIABLE this LScalaTrial; L0 L1 0 - MAXSTACK = 1 - MAXLOCALS = 1 - - // access flags 0x100A - private static synthetic $deserializeLambda$(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; - ALOAD 0 - INVOKEDYNAMIC lambdaDeserialize(Ljava/lang/invoke/SerializedLambda;)Ljava/lang/Object; [ - // handle kind 0x6 : INVOKESTATIC - scala/runtime/LambdaDeserialize.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/CallSite; - // arguments: - // handle kind 0x6 : INVOKESTATIC - ScalaTrial.$anonfun$pipe$1(LScalaTrial;I)I, - // handle kind 0x6 : INVOKESTATIC - ScalaTrial.$anonfun$pipe$2(LScalaTrial;I)I - ] - ARETURN - MAXSTACK = 1 - MAXLOCALS = 1 -} -``` From cbe6b4899204c2f00b260e7f4ebf0493885239be Mon Sep 17 00:00:00 2001 From: DenChika <79001610+DenChika@users.noreply.github.com> Date: Mon, 15 Aug 2022 16:50:21 +0500 Subject: [PATCH 3/4] Delete SharpDecompiler.md --- SharpDecompiler.md | 327 --------------------------------------------- 1 file changed, 327 deletions(-) delete mode 100644 SharpDecompiler.md diff --git a/SharpDecompiler.md b/SharpDecompiler.md deleted file mode 100644 index 5250352..0000000 --- a/SharpDecompiler.md +++ /dev/null @@ -1,327 +0,0 @@ -```cs -// Decompiled with JetBrains decompiler -// Type: Program -// Assembly: FSharpTrial, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null -// MVID: D85670CC-88CF-0636-AC1A-2F1C7D3E921B -// Assembly location: C:\Users\volok\RiderProjects\Solution1\CSharpTesting\bin\Debug\net6.0\FSharpTrial.dll - -using Microsoft.FSharp.Core; -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[CompilationMapping(SourceConstructFlags.Module)] -public static class Program -{ - [CompilationArgumentCounts(new int[] {1, 1})] - public static int multi(int x, int y) => x * y; - - [CompilationArgumentCounts(new int[] {1, 1})] - public static int plus(int x, int y) => x + y; - - [CompilationArgumentCounts(new int[] {1, 1, 1})] - public static int result(int x, int y, int z) - { - int y1 = Program.multi(x, y); - return Program.plus(z, y1); - } - - public static void unionTrial(int x) - { - Program.IntOrBool intOrBool1 = Program.IntOrBool.NewI(x); - Program.IntOrBool intOrBool2 = Program.IntOrBool.NewB(x % 2 == 0); - ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%d%P()", new object[1] - { - (object) x - }, (Type[]) null)); - ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%P() is odd?", new object[1] - { - (object) intOrBool1 - }, (Type[]) null)); - ExtraTopLevelOperators.PrintFormatLine((PrintfFormat) new PrintfFormat("%P()!", new object[1] - { - (object) intOrBool2 - }, (Type[]) null)); - } - - [DebuggerDisplay("{__DebugDisplay(),nq}")] - [CompilationMapping(SourceConstructFlags.SumType)] - [Serializable] - [StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)] - public abstract class IntOrBool : - IEquatable, - IStructuralEquatable, - IComparable, - IComparable, - IStructuralComparable - { - [CompilerGenerated] - [DebuggerNonUserCode] - internal IntOrBool() - { - } - - [CompilationMapping(SourceConstructFlags.UnionCase, 0)] - public static Program.IntOrBool NewI(int item) => (Program.IntOrBool) new Program.IntOrBool.I(item); - - [CompilerGenerated] - [DebuggerNonUserCode] - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - public bool IsI - { - [DebuggerNonUserCode] get => this is Program.IntOrBool.I; - } - - [DebuggerNonUserCode] - public bool get_IsI() => this is Program.IntOrBool.I; - - [CompilationMapping(SourceConstructFlags.UnionCase, 1)] - public static Program.IntOrBool NewB(bool item) => (Program.IntOrBool) new Program.IntOrBool.B(item); - - [CompilerGenerated] - [DebuggerNonUserCode] - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - public bool IsB - { - [DebuggerNonUserCode] get => this is Program.IntOrBool.B; - } - - [DebuggerNonUserCode] - public bool get_IsB() => this is Program.IntOrBool.B; - - [CompilerGenerated] - [DebuggerNonUserCode] - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - public int Tag - { - [DebuggerNonUserCode] get => this is Program.IntOrBool.B ? 1 : 0; - } - - [DebuggerNonUserCode] - public int get_Tag() => this is Program.IntOrBool.B ? 1 : 0; - - [CompilerGenerated] - [DebuggerNonUserCode] - [SpecialName] - internal object __DebugDisplay() => (object) ExtraTopLevelOperators.PrintFormatToString>((PrintfFormat, Unit, string, string>) new PrintfFormat, Unit, string, string, string>("%+0.8A")).Invoke(this); - - [CompilerGenerated] - public override string ToString() => ExtraTopLevelOperators.PrintFormatToString>((PrintfFormat, Unit, string, string>) new PrintfFormat, Unit, string, string, Program.IntOrBool>("%+A")).Invoke(this); - - [CompilerGenerated] - public virtual int CompareTo(Program.IntOrBool obj) - { - if (this != null) - { - if (obj == null) - return 1; - int num1 = !(this is Program.IntOrBool.B) ? 0 : 1; - int num2 = !(obj is Program.IntOrBool.B) ? 0 : 1; - if (num1 != num2) - return num1 - num2; - if (this is Program.IntOrBool.I) - { - Program.IntOrBool.I i1 = (Program.IntOrBool.I) this; - Program.IntOrBool.I i2 = (Program.IntOrBool.I) obj; - IComparer genericComparer = LanguagePrimitives.GenericComparer; - int num3 = i1.item; - int num4 = i2.item; - return num3 < num4 ? -1 : (num3 > num4 ? 1 : 0); - } - Program.IntOrBool.B b1 = (Program.IntOrBool.B) this; - Program.IntOrBool.B b2 = (Program.IntOrBool.B) obj; - IComparer genericComparer1 = LanguagePrimitives.GenericComparer; - bool flag1 = b1.item; - bool flag2 = b2.item; - return (flag1 ? 1 : 0) < (flag2 ? 1 : 0) ? -1 : ((flag1 ? 1 : 0) > (flag2 ? 1 : 0) ? 1 : 0); - } - return obj != null ? -1 : 0; - } - - [CompilerGenerated] - public virtual int CompareTo(object obj) => this.CompareTo((Program.IntOrBool) obj); - - [CompilerGenerated] - public virtual int CompareTo(object obj, IComparer comp) - { - Program.IntOrBool intOrBool = (Program.IntOrBool) obj; - if (this != null) - { - if ((Program.IntOrBool) obj == null) - return 1; - int num1 = !(this is Program.IntOrBool.B) ? 0 : 1; - int num2 = !(intOrBool is Program.IntOrBool.B) ? 0 : 1; - if (num1 != num2) - return num1 - num2; - if (this is Program.IntOrBool.I) - { - Program.IntOrBool.I i1 = (Program.IntOrBool.I) this; - Program.IntOrBool.I i2 = (Program.IntOrBool.I) intOrBool; - int num3 = i1.item; - int num4 = i2.item; - return num3 < num4 ? -1 : (num3 > num4 ? 1 : 0); - } - Program.IntOrBool.B b1 = (Program.IntOrBool.B) this; - Program.IntOrBool.B b2 = (Program.IntOrBool.B) intOrBool; - bool flag1 = b1.item; - bool flag2 = b2.item; - return (flag1 ? 1 : 0) < (flag2 ? 1 : 0) ? -1 : ((flag1 ? 1 : 0) > (flag2 ? 1 : 0) ? 1 : 0); - } - return (Program.IntOrBool) obj != null ? -1 : 0; - } - - [CompilerGenerated] - public virtual int GetHashCode(IEqualityComparer comp) - { - if (this == null) - return 0; - if (this is Program.IntOrBool.I) - { - Program.IntOrBool.I i = (Program.IntOrBool.I) this; - int num = 0; - return i.item + ((num << 6) + (num >> 2)) - 1640531527; - } - Program.IntOrBool.B b = (Program.IntOrBool.B) this; - int num1 = 1; - return (b.item ? 1 : 0) + ((num1 << 6) + (num1 >> 2)) - 1640531527; - } - - [CompilerGenerated] - public override sealed int GetHashCode() => this.GetHashCode(LanguagePrimitives.GenericEqualityComparer); - - [CompilerGenerated] - public virtual bool Equals(object obj, IEqualityComparer comp) - { - if (this == null) - return obj == null; - if (!(obj is Program.IntOrBool intOrBool) || (!(this is Program.IntOrBool.B) ? 0 : 1) != (!(intOrBool is Program.IntOrBool.B) ? 0 : 1)) - return false; - return this is Program.IntOrBool.I ? ((Program.IntOrBool.I) this).item == ((Program.IntOrBool.I) intOrBool).item : ((Program.IntOrBool.B) this).item == ((Program.IntOrBool.B) intOrBool).item; - } - - [CompilerGenerated] - public virtual bool Equals(Program.IntOrBool obj) - { - if (this == null) - return obj == null; - if (obj == null || (!(this is Program.IntOrBool.B) ? 0 : 1) != (!(obj is Program.IntOrBool.B) ? 0 : 1)) - return false; - return this is Program.IntOrBool.I ? ((Program.IntOrBool.I) this).item == ((Program.IntOrBool.I) obj).item : ((Program.IntOrBool.B) this).item == ((Program.IntOrBool.B) obj).item; - } - - [CompilerGenerated] - public override sealed bool Equals(object obj) => obj is Program.IntOrBool intOrBool && this.Equals(intOrBool); - - public static class Tags - { - public const int I = 0; - public const int B = 1; - } - - [DebuggerTypeProxy(typeof (Program.IntOrBool.I\u0040DebugTypeProxy))] - [DebuggerDisplay("{__DebugDisplay(),nq}")] - [Serializable] - [SpecialName] - public class I : Program.IntOrBool - { - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [CompilerGenerated] - [DebuggerNonUserCode] - internal readonly int item; - - [CompilerGenerated] - [DebuggerNonUserCode] - internal I(int item) => this.item = item; - - [CompilationMapping(SourceConstructFlags.Field, 0, 0)] - [CompilerGenerated] - [DebuggerNonUserCode] - public int Item - { - [DebuggerNonUserCode] get => this.item; - } - - [DebuggerNonUserCode] - public int get_Item() => this.item; - } - - [DebuggerTypeProxy(typeof (Program.IntOrBool.B\u0040DebugTypeProxy))] - [DebuggerDisplay("{__DebugDisplay(),nq}")] - [Serializable] - [SpecialName] - public class B : Program.IntOrBool - { - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [CompilerGenerated] - [DebuggerNonUserCode] - internal readonly bool item; - - [CompilerGenerated] - [DebuggerNonUserCode] - internal B(bool item) => this.item = item; - - [CompilationMapping(SourceConstructFlags.Field, 1, 0)] - [CompilerGenerated] - [DebuggerNonUserCode] - public bool Item - { - [DebuggerNonUserCode] get => this.item; - } - - [DebuggerNonUserCode] - public bool get_Item() => this.item; - } - - [SpecialName] - internal class I\u0040DebugTypeProxy - { - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [CompilerGenerated] - [DebuggerNonUserCode] - internal Program.IntOrBool.I _obj; - - [CompilerGenerated] - [DebuggerNonUserCode] - public I\u0040DebugTypeProxy(Program.IntOrBool.I obj) => this._obj = obj; - - [CompilationMapping(SourceConstructFlags.Field, 0, 0)] - [CompilerGenerated] - [DebuggerNonUserCode] - public int Item - { - [DebuggerNonUserCode] get => this._obj.item; - } - - [DebuggerNonUserCode] - public int get_Item() => this._obj.item; - } - - [SpecialName] - internal class B\u0040DebugTypeProxy - { - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - [CompilerGenerated] - [DebuggerNonUserCode] - internal Program.IntOrBool.B _obj; - - [CompilerGenerated] - [DebuggerNonUserCode] - public B\u0040DebugTypeProxy(Program.IntOrBool.B obj) => this._obj = obj; - - [CompilationMapping(SourceConstructFlags.Field, 1, 0)] - [CompilerGenerated] - [DebuggerNonUserCode] - public bool Item - { - [DebuggerNonUserCode] get => this._obj.item; - } - - [DebuggerNonUserCode] - public bool get_Item() => this._obj.item; - } - } -} -``` From c557b48064666eb6e19fb96025ee586a49b276ef Mon Sep 17 00:00:00 2001 From: DenChika <79001610+DenChika@users.noreply.github.com> Date: Mon, 15 Aug 2022 16:50:35 +0500 Subject: [PATCH 4/4] Delete TechLab1.md --- TechLab1.md | 591 ---------------------------------------------------- 1 file changed, 591 deletions(-) delete mode 100644 TechLab1.md diff --git a/TechLab1.md b/TechLab1.md deleted file mode 100644 index c46bdf5..0000000 --- a/TechLab1.md +++ /dev/null @@ -1,591 +0,0 @@ -# TechLabs -## Лабораторная работа 1 -### Point 1 -```cpp -#include "pch.h" -#include "framework.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - -#include - -extern "C" -{ - __declspec (dllexport) void __stdcall Java_MyClass_MyMethod() - { - std::cout << "Hello Java from C++"; - } - - __declspec (dllexport) void MyMethod() - { - std::cout << "Hello C# from C++"; - } -} -``` -Для начала, нужно создать срр файл и подключить dll библиотеку, а также перевести конфигурацию с Debug на Release. В конце исходника нужно написать extern "C", а внутри методы, которые мы хотим чтоб вызывались в Java и C#. "__declspec (dllexport)" - требование для каждого dll метода. Без этой приписки работать не будет. "__stdcall" - требование для Java, чтобы вызвать метод из dll. Лично у меня метод называется с припиской Java_"имя класса". В источнике, с которого я брал информацию, было сказано, что это тоже требование для вызова в Java, однако я знаю людей, у которых работало и без этого. В C# приписка "__stdcall" необязательна. - -#### Для работы с Java: -Нужно сбилдить проект и скопировать dll файл (не наш cpp файл, а именно dll) в проект в IDE, но только не внутрь src или каких-то других папок. Код в Java выглядит так: -```java -public class MyClass { - public native void MyMethod(); - - static - { - System.loadLibrary("Dll1"); - } - public static void main(String args[]) { - new MyClass().MyMethod(); - } -} -``` -Мы объявляем метод срр файла с модификатором native как раз для того, чтобы вызывать его из dll. Через System.loadLibrary("имя dll") загружаем библиотеку и в main вызываем метод. - -#### Для работы с C#: -Нужно сбилдить проект и скопировать путь на dll файл, затем импортировать dll: в DllImport указать этот путь и указать CallingConvention = Cdecl, иначе выкинется ошибка. У метода ставится модификатор extern (как в Java native). Код выглядит так: -```cs -using System; -using System.Runtime.InteropServices; - -namespace CPPInterop -{ - internal static class Program - { - private const string _dllPath = @"C:\Users\volok\source\repos\InteropCPP\x64\Release\Dll1"; - - [DllImport(_dllPath, CallingConvention = CallingConvention.Cdecl)] - - public static extern void MyMethod(); - - private static void Main() - { - MyMethod(); - } - } -} -``` - -Из сложностей работы с интеропом особо ничего не могу выделить - у меня проблем не было. Ограничений работы я тоже не увидел. -Источники информации: -https://www.youtube.com/watch?v=o-ass4mkdiA&t=0s -https://www.youtube.com/watch?v=41leCIAzSd0&t=0s - -### Point 2 -#### F# и декомпиляция в C#: -Код на F#: -```fs -let multi x y = x * y -let plus x y = x + y -type IntOrBool = - | I of int - | B of bool -let result x y z = multi x y |> plus z -let unionTrial x = - let i = I x - let b = B (x % 2 = 0) - printfn $"%d{x} - printfn $"{i} is odd?" - printfn $"{b}!" -``` -Честно, разбирался с Computation Expressions, но мало что понял, поэтому код очень простой и написан с использованием Pipe Operator и Discriminated Union. Его вызов в C#: -```cs -using System; - -namespace CSharpTesting -{ - internal static class Program - { - private static void Main() - { - var res = global::Program.result(1, 2, 3); - global::Program.unionTrial(res); - } - } -} -``` -Для вызова F# методов в C# требуется только вызвать их с global(и то, насколько я знаю, у некоторых работало и без него). Чтобы декомпилировать в C# я использовал dotPeek. -При декомпиляции в C# Discriminated Union превращается в абстрактный класс, и из-за этого код значительно раздувается. Сам код декомпиляции лежит в [SharpDecompiler.md](SharpDecompiler.md) -#### Scala и декомпиляция в Java: -Код на Scala: -```scala -import scala.util.chaining.scalaUtilChainingOps - -class ScalaTrial { - def multi(x : Int, y : Int): Int = x * y - def plus(x : Int, y : Int): Int = x + y - - def pipe() : Int = { - val x = 2.pipe(plus(_, 3)).pipe(multi(_, 2)) - x - } -} -``` -Что касается Scala, то, насколько я понял, там нет ни Discriminated Union, ни Computation Expressions, поэтому я написал максимально простой код с использованием .pipe(). Вызов кода в Java: -```java -public class JavaTesting { - public static void main(String[] args) { - ScalaTrial myObj = new ScalaTrial(); - int x = myObj.pipe(); - System.out.println(x); - } -} -``` -Как видно, ничего не мешает просто вызвать Scala метод в Java. Декомпилировал я с помощью View->Show Bytecode в IntelliJ. Код декомпиляции лежит в [JavaDecompiler.md](JavaDecompiler.md), и по факту декомпилятор просто подключил модуль Scala и использовал .pipe(). -### Point 3 -#### Работа с C# -DFS и BFS: -```cs -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace CSharpGraphFs -{ - public class Graph - { - private int _V; - - private LinkedList[] _adj; - public Graph(int V) - { - _adj = new LinkedList[V]; - for(var i = 0; i < _adj.Length; i++) - { - _adj[i] = new LinkedList(); - } - _V = V; - } - - - public void AddEdge(int v, int w) - { - _adj[v].AddLast(w); - - } - - public void DFSUtil(int v, bool[] visited) - { - visited[v] = true; - Console.Write(v + " "); - var vList = _adj[v]; - foreach (var n in vList.Where(n => !visited[n])) - { - DFSUtil(n, visited); - } - } - - public void DFS(int v) - { - var visited = new bool[_V]; - DFSUtil(v, visited); - } - - public void BFS(int s) - { - - var visited = new bool[_V]; - for(var i = 0; i < _V; i++) - visited[i] = false; - - var queue = new LinkedList(); - visited[s] = true; - queue.AddLast(s); - - while(queue.Any()) - { - s = queue.First(); - Console.Write(s + " " ); - queue.RemoveFirst(); - var list = _adj[s]; - - foreach (var val in list.Where(val => !visited[val])) - { - visited[val] = true; - queue.AddLast(val); - } - } - } - } -} -``` -Собрать пакет можно с помощью NuGet. Для этого надо нажать пкм по проекту, выбрать Advanced Build Actions -> Pack Selected Project. После этого зайти в NuGet, нажать на sources, а затем New feed, а путь указать до Debug нашего проекта. Все готово, можно использовать пакет в другом проекте, добавив в начале using: -```cs -using CSharpGraphFs; - -namespace PackageUsing -{ - internal static class Program - { - private static void Main() - { - Graph graph = new Graph(6); - graph.AddEdge(0, 1); - graph.AddEdge(0, 2); - graph.AddEdge(1, 0); - graph.AddEdge(1, 3); - graph.AddEdge(2, 0); - graph.AddEdge(2, 3); - graph.AddEdge(3, 4); - graph.AddEdge(3, 5); - graph.AddEdge(4, 3); - graph.AddEdge(5, 3); - - graph.DFS(0); - Console.WriteLine('\n'); - graph.BFS(0); - } - } -} -``` -Для себя могу отметить сложность, которая у меня возникала: если обходы графа были изначально не совсем правильно написаны, а мы уже запаковали, то я не нашёл другого способа, кроме как пересоздать проект и запаковать заново. -#### Работа с Java -DFS и BFS: -```java -import java.util.Iterator; -import java.util.LinkedList; -import java.util.Stack; - -public class JavaGraph { - int V; - - LinkedList[] adj; - - JavaGraph(int V) - { - this.V = V; - adj = new LinkedList[V]; - for (int i = 0; i < adj.length; i++) - adj[i] = new LinkedList(); - } - - void addEdge(int v, int w) - { - adj[v].add(w); - } - - void DFS(int n) - { - boolean[] nodes = new boolean[V]; - Stack stack = new Stack<>(); - stack.push(n); - int a = 0; - while(!stack.empty()) - { - n = stack.peek(); - stack.pop(); - if(!nodes[n]) - { - System.out.print(n + " "); - nodes[n] = true; - } - for (int i = 0; i < adj[n].size(); i++) - { - a = adj[n].get(i); - if (!nodes[a]) - { - stack.push(a); - } - } - } - } - - void BFS(int n) - { - boolean visited[] = new boolean[V]; - LinkedList queue = new LinkedList(); - visited[n]=true; - queue.add(n); - - while (queue.size() != 0) - { - n = queue.poll(); - System.out.print(n + " "); - Iterator i = adj[n].listIterator(); - while (i.hasNext()) - { - int next = i.next(); - if (!visited[next]) - { - visited[next] = true; - queue.add(next); - } - } - } - } -} -``` -С Java все немного сложнее. Лично я использовал Framework поддержку Maven и Groovy. Сначала с помощью Maven пакетируем проект, а потом нажимаем пкм по проекту -> Open Module Settings и добавляем в Libraries .jar файл, который создался, когда мы пакетировали проект (лежит в target). Все, пакет создался, можем его использовать: -```java -public class MyOwnMavenPackageTesting { - public static void main(String[] args) { - JavaGraph graph = new JavaGraph(6); - graph.addEdge(0, 1); - graph.addEdge(0, 2); - graph.addEdge(1, 0); - graph.addEdge(1, 3); - graph.addEdge(2, 0); - graph.addEdge(2, 3); - graph.addEdge(3, 4); - graph.addEdge(3, 5); - graph.addEdge(4, 3); - graph.addEdge(5, 3); - - graph.DFS(0); - System.out.println('\n'); - graph.BFS(0); - } -} -``` -При использовании пакета ничего добавлять не нужно, пакет используется автоматически. -### Point 4 -Я выбрал Gnome sort, Bubble sort и встроенную сортировку для анализа их работы с помощью Benchmark. -#### Работа с C# -Алгоритмы сортировок: -```cs -using System; -using BenchmarkDotNet.Attributes; - -namespace Benchmarks -{ - [MemoryDiagnoser] - public class Sorting - { - private const int Size = 10000; - - private readonly int[] _arr; - - public Sorting() - { - _arr = new int[Size]; - for (var i = 0; i < Size; i++) - { - _arr[i] = new Random().Next(); - } - } - - [Benchmark] - public int[] BubbleSort() - { - int temp; - var arr = _arr.ToArray(); - for (var i = 0; i < arr.Length; i++) - { - for (var j = i + 1; j < arr.Length; j++) - { - if (arr[i] <= arr[j]) continue; - temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } - - return arr; - } - private void Swap(ref int item1, ref int item2) - { - (item1, item2) = (item2, item1); - } - - [Benchmark] - public int[] GnomeSort() - { - var index = 1; - var nextIndex = index + 1; - var arr = _arr.ToArray(); - while (index < arr.Length) - { - if (arr[index - 1] < arr[index]) - { - index = nextIndex; - nextIndex++; - } - else - { - Swap(ref arr[index - 1], ref arr[index]); - index--; - if (index != 0) continue; - index = nextIndex; - nextIndex++; - } - } - - return arr; - } - - [Benchmark] - public int[] BuiltInSort() - { - var arr = _arr.ToArray(); - Array.Sort(arr); - return arr; - } - - } -} -``` -Нам нужно установить BenchmarkDotNet NuGet пакет. Затем для анализа аллокации памяти добавить атрибут "MemoryDiagnoser" перед объявлением класса, а для анализа времени выполнения добавить атрибут "Benchmark" до каждого определения функции. Код выполнения Benchmark: -```cs -using BenchmarkDotNet.Reports; -using BenchmarkDotNet.Running; - -namespace Benchmarks -{ - internal static class Program - { - private static void Main() - { - var summary = BenchmarkRunner.Run(); - } - } -} -``` -Результат выполнения:\ -![image](https://user-images.githubusercontent.com/79001610/156830279-ae95ce74-8fa2-45d8-b640-fde9382e8c60.png)\ -Как и ожидалось, bubble sort отработала медленней всех, а встроенная быстрее всех, при этом память выделяется почти одинаково во всех алгоритмах. -#### Работа с Java -Алгоритмы сортировок: -```java -package com.Benchmarks; - -import org.openjdk.jmh.annotations.*; - -import java.util.Arrays; -import java.util.concurrent.TimeUnit; - -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.NANOSECONDS) -@State(Scope.Benchmark) -@Fork(value = 2, jvmArgs = {"-Xms2G", "-Xmx2G"}) -public class Sorting { - - @Param({"10000"}) - private int Size; - - private int[] _arr; - - public static void main(String[] args) throws Exception { - org.openjdk.jmh.Main.main(args); - } - - public Sorting() - { - _arr = new int[Size]; - for (var i = 0; i < Size; i++) - { - _arr[i] = (int) (Math.random() * 10000); - } - } - - @org.openjdk.jmh.annotations.Benchmark - @Fork(value = 1, warmups = 1) - @Warmup(iterations = 2) - public int[] BubbleSort() - { - var arr = _arr; - for (int i = 0; i < arr.length - 1; i++) { - for (int j = 0; j < arr.length - i - 1; j++) - if (arr[j] > arr[j + 1]) { - int temp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = temp; - } - } - - return arr; - } - - @org.openjdk.jmh.annotations.Benchmark - @Fork(value = 1, warmups = 1) - @Warmup(iterations = 2) - public int[] GnomeSort() - { - int index = 0; - var arr = _arr; - while (index < arr.length) { - if (index == 0) - index++; - if (arr[index] >= arr[index - 1]) - index++; - else { - int temp = 0; - temp = arr[index]; - arr[index] = arr[index - 1]; - arr[index - 1] = temp; - index--; - } - } - return arr; - } - - @org.openjdk.jmh.annotations.Benchmark - @Fork(value = 1, warmups = 1) - @Warmup(iterations = 2) - public int[] BuiltInSort() - { - var arr = _arr; - Arrays.sort(arr); - return arr; - } -} -``` -В Java JMH работает крайне сложно и неприятно. Для начала запустить Maven и открыть pom файл, туда добавить зависимостей: -```xml - - - org.openjdk.jmh - jmh-core - 1.33 - - - org.openjdk.jmh - jmh-generator-annprocess - 1.33 - - -``` -Затем в Maven обновить все проекты. Касаемо алгоритмов сортировок: лично я добавил -```java -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.NANOSECONDS) -@State(Scope.Benchmark) -@Fork(value = 2, jvmArgs = {"-Xms2G", "-Xmx2G"}) -``` -до объявления класса, а перед каждым алгоритмом добавлял вот это: -```java -@org.openjdk.jmh.annotations.Benchmark -@Fork(value = 1, warmups = 1) -@Warmup(iterations = 2) -``` -Затем надо запустить JMH: -```java -public static void main(String[] args) throws Exception { - org.openjdk.jmh.Main.main(args); - } -``` -Некоторые из атрибутов опциональны и нужны просто для большей информации.\ -Результат работы:\ -![image](https://user-images.githubusercontent.com/79001610/156833698-8e0fd4c4-24cb-4283-8190-6ee699d3ce75.png)\ -Очень странно получилось, но почему-то в Java получилось всё наоборот, скорость bubble sort самая большая, а встроенная самая медленная (по количеству операций в наносекунду). -Источники: https://mkyong.com/java/java-jmh-benchmark-tutorial/ -### Point 5 -Для анализа я использовал dotMemory.\ -С файловой системой:\ -![image](https://user-images.githubusercontent.com/79001610/156853257-5195520c-b8b6-4dd5-8450-052de1b28928.png)\ -Не с файловой системой:\ -![image](https://user-images.githubusercontent.com/79001610/156853438-42919d60-4b0c-4c2e-b94f-d89e8286e319.png)\ -Почему-то получились абсолютно одинаковые результаты, хотя с файловой системой сборщик мусора начинает удалять точки, и общая картина должна выглядеть примерно как зубы акулы, но этого не происходит - странно.