Roslyn #7
نویسنده: وحید نصیری
تاریخ: ۱۳۹۴/۰۷/۰۱ ۱۵:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Print the root of the solution.
Console.WriteLine(Path.GetFileName(sln.FilePath));
// Get dependency graph to perform a sort.
var g = sln.GetProjectDependencyGraph();
var ps = g.GetTopologicallySortedProjects();
// Print all projects, their documents, and references.
foreach (var p in ps)
{
var proj = sln.GetProject(p);
Console.WriteLine("> " + proj.Name);
Console.WriteLine(" > References");
foreach (var r in proj.ProjectReferences)
{
Console.WriteLine(" - " + sln.GetProject(r.ProjectId).Name);
}
foreach (var d in proj.Documents)
{
Console.WriteLine(" - " + d.Name);
}
} Roslyn.sln > Roslyn01 > References - Program.cs - AssemblyInfo.cs - .NETFramework,Version=v4.6.AssemblyAttributes.cs
var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get the Tests\Bar.cs document.
var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var test = proj.Documents.Single(d => d.Name == "Bar.cs");
var tree = test.GetSyntaxTreeAsync().Result;
var root = tree.GetRootAsync().Result;
// Get all the spans in the document that are classified as language elements.
var spans = Classifier.GetClassifiedSpansAsync(test, root.FullSpan).Result.ToDictionary(c => c.TextSpan.Start, c => c);
// Print the source text with appropriate colorization.
var txt = tree.GetText().ToString();
var i = 0;
foreach (var c in txt)
{
var span = default(ClassifiedSpan);
if (spans.TryGetValue(i, out span))
{
var color = ConsoleColor.Gray;
switch (span.ClassificationType)
{
case ClassificationTypeNames.Keyword:
color = ConsoleColor.Cyan;
break;
case ClassificationTypeNames.StringLiteral:
case ClassificationTypeNames.VerbatimStringLiteral:
color = ConsoleColor.Red;
break;
case ClassificationTypeNames.Comment:
color = ConsoleColor.Green;
break;
case ClassificationTypeNames.ClassName:
case ClassificationTypeNames.InterfaceName:
case ClassificationTypeNames.StructName:
case ClassificationTypeNames.EnumName:
case ClassificationTypeNames.TypeParameterName:
case ClassificationTypeNames.DelegateName:
color = ConsoleColor.Yellow;
break;
case ClassificationTypeNames.Identifier:
color = ConsoleColor.DarkGray;
break;
}
Console.ForegroundColor = color;
}
Console.Write(c);
i++;
}
var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get the Tests\Qux.cs document.
var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var qux = proj.Documents.Single(d => d.Name == "Qux.cs");
Console.WriteLine("Before:");
Console.WriteLine();
Console.WriteLine(qux.GetSyntaxTreeAsync().Result.GetText());
Console.WriteLine();
Console.WriteLine();
// Apply formatting and print the result.
var res = Formatter.FormatAsync(qux).Result;
Console.WriteLine("After:");
Console.WriteLine();
Console.WriteLine(res.GetSyntaxTreeAsync().Result.GetText());
Console.WriteLine(); Before:
using System;
namespace Roslyn04.Tests
{
class Qux {
public void Baz()
{ Console.WriteLine(42);
return; }
}
}
After:
using System;
namespace Roslyn04.Tests
{
class Qux
{
public void Baz()
{
Console.WriteLine(42);
return;
}
}
} var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get the Tests project.
var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
// Locate the symbol for the Bar.Foo method and the Bar.Qux property.
var comp = proj.GetCompilationAsync().Result;
var barType = comp.GetTypeByMetadataName("Roslyn04.Tests.Bar");
var fooMethod = barType.GetMembers().Single(m => m.Name == "Foo");
var quxProp = barType.GetMembers().Single(m => m.Name == "Qux");
// Find callers across the solution.
Console.WriteLine("Find callers of Foo");
Console.WriteLine();
var callers = SymbolFinder.FindCallersAsync(fooMethod, sln).Result;
foreach (var caller in callers)
{
Console.WriteLine(caller.CallingSymbol);
foreach (var location in caller.Locations)
{
Console.WriteLine(" " + location);
}
}
Console.WriteLine();
Console.WriteLine();
// Find all references across the solution.
Console.WriteLine("Find all references to Qux");
Console.WriteLine();
var references = SymbolFinder.FindReferencesAsync(quxProp, sln).Result;
foreach (var reference in references)
{
Console.WriteLine(reference.Definition);
foreach (var location in reference.Locations)
{
Console.WriteLine(" " + location.Location);
}
} var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get the Tests\Foo.cs document.
var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var foo = proj.Documents.Single(d => d.Name == "Foo.cs");
// Find the 'dot' token in the first Console.WriteLine member access expression.
var tree = foo.GetSyntaxTreeAsync().Result;
var model = proj.GetCompilationAsync().Result.GetSemanticModel(tree);
var consoleDot = tree.GetRoot().DescendantNodes().OfType<MemberAccessExpressionSyntax>().First().OperatorToken;
// Get recommendations at the indicated cursor position.
//
// Console.WriteLine
// ^
var res = Recommender.GetRecommendedSymbolsAtPosition(
model, consoleDot.GetLocation().SourceSpan.Start + 1, ws).ToList();
foreach (var rec in res)
{
Console.WriteLine(rec);
} System.Console.Beep() System.Console.Beep(int, int) System.Console.Clear()
var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get Tests\Bar.cs before making changes.
var oldProj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var oldDoc = oldProj.Documents.Single(d => d.Name == "Bar.cs");
Console.WriteLine("Before:");
Console.WriteLine();
var oldTxt = oldDoc.GetTextAsync().Result;
Console.WriteLine(oldTxt);
Console.WriteLine();
Console.WriteLine();
// Get the symbol for the Bar.Foo method.
var comp = oldProj.GetCompilationAsync().Result;
var barType = comp.GetTypeByMetadataName("Roslyn04.Tests.Bar");
var fooMethod = barType.GetMembers().Single(m => m.Name == "Foo");
// Perform the rename.
var newSln = Renamer.RenameSymbolAsync(sln, fooMethod, "Foo2", ws.Options).Result;
// Get Tests\Bar.cs after making changes.
var newProj = newSln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var newDoc = newProj.Documents.Single(d => d.Name == "Bar.cs");
Console.WriteLine("After:");
Console.WriteLine();
var newTxt = newDoc.GetTextAsync().Result;
Console.WriteLine(newTxt); var ws = MSBuildWorkspace.Create();
var sln = ws.OpenSolutionAsync(@"..\..\..\Roslyn.sln").Result;
// Get the Tests\Baz.cs document.
var proj = sln.Projects.Single(p => p.Name == "Roslyn04.Tests");
var baz = proj.Documents.Single(d => d.Name == "Baz.cs");
Console.WriteLine("Before:");
Console.WriteLine();
Console.WriteLine(baz.GetSyntaxTreeAsync().Result.GetText());
Console.WriteLine();
Console.WriteLine();
var oldRoot = baz.GetSyntaxRootAsync().Result;
var memberAccesses = oldRoot.DescendantNodes().OfType<CastExpressionSyntax>();
var newRoot = oldRoot.ReplaceNodes(memberAccesses, (_, m) => m.WithAdditionalAnnotations(Simplifier.Annotation));
var newDoc = baz.WithSyntaxRoot(newRoot);
// Invoke the simplifier and print the result.
var res = Simplifier.ReduceAsync(newDoc).Result;
Console.WriteLine("After:");
Console.WriteLine();
Console.WriteLine(res.GetSyntaxTreeAsync().Result.GetText());
Console.WriteLine();