using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Rename;
using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Z { class AClass{} }
B1 i; // We need to programmatically replace 'B1' with 'B.B1'
using (var ws = new AdhocWorkspace()) {
projId = ProjectId.CreateNewId();
docId = DocumentId.CreateNewId(projId);
sol = ws.CurrentSolution.AddProject(projId, "a", "a", LanguageNames.CSharp).AddDocument(docId, "b", code);
doc = sol.GetDocument(docId);
model = doc.GetSemanticModelAsync().Result;
rename<MethodDeclarationSyntax>();
Console.WriteLine(newCode);
static void rename<T>() where T : SyntaxNode {
var decls = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<T>();
int limit = decls.Count();
for (int i = 0; i < limit; i++) {
var curDecl = decls.ToList()[i];
var sym = model.GetDeclaredSymbol(curDecl);
newCode = Renamer.RenameSymbolAsync(sol, sym, "_" + symName, null).Result
.GetDocument(docId).GetTextAsync().Result.ToString();
sol = createSolution(sol, projId, docId, newCode);
doc = sol.GetDocument(docId);
model = doc.GetSemanticModelAsync().Result;
decls = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<T>();
static Solution createSolution(Solution sol, ProjectId projId, DocumentId docId, string code) {
if (sol.GetProject(projId) != null)
sol = sol.RemoveProject(projId);
return sol.AddProject(projId, "a", "a", LanguageNames.CSharp).AddDocument(docId, "b", code);
public static Solution sol;
public static ProjectId projId;
public static DocumentId docId;
public static Document doc;
public static SemanticModel model;
public static string newCode = @"";