Skip to content

Instantly share code, notes, and snippets.

@alex-y-su
Created November 5, 2014 13:27
Show Gist options
  • Save alex-y-su/276e7e93a8ec8025cfb4 to your computer and use it in GitHub Desktop.
Save alex-y-su/276e7e93a8ec8025cfb4 to your computer and use it in GitHub Desktop.
Roslyn trims space after syntax node change
namespace RoslynFeatureDemo
using Xunit;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
internal class ExperimentalRewriter : CSharpSyntaxRewriter
{
public override SyntaxNode VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
{
var rootIdentifier = node.DescendantNodes().OfType<IdentifierNameSyntax>().FirstOrDefault();
if (null != rootIdentifier && rootIdentifier.Identifier.Text == "node")
{
SyntaxNode res = this.Visit(node.Expression);
var replaced = string.Format("{0}?.{1}", res, node.Name);
return SyntaxFactory.ParseExpression(replaced);
}
return base.VisitMemberAccessExpression(node);
}
}
public class RewriterTests
{
[Fact] //FAIL
public void ExperimentalRewriter_AsCastingShouldWorks_Success()
{
const string original = @"
public void Express(dynamic node){
var x = node.A as string;
}";
const string target = @"
public void Express(dynamic node){
var x = node?.A as string;
}";
var opt = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.Experimental);
var originalTree = CSharpSyntaxTree.ParseText(original, opt);
var targetTree = CSharpSyntaxTree.ParseText(target, opt);
var rewriter = new ExperimentalRewriter();
var rewritedTree = CSharpSyntaxTree.ParseText(rewriter.Visit(originalTree.GetRoot()).ToFullString(), opt);
// var x = node?.Aas string;
Assert.True(rewritedTree.IsEquivalentTo(targetTree));
}
[Fact] //FAIL
public void ExperimentalRewriter_AsCastingWithSpacebarsShouldWorks_Success()
{
const string original = @"
public void Express(dynamic node){
var x = node.A as string;
}";
const string target = @"
public void Express(dynamic node){
var x = node?.A as string;
}";
var opt = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.Experimental);
var originalTree = CSharpSyntaxTree.ParseText(original, opt);
var targetTree = CSharpSyntaxTree.ParseText(target, opt);
var rewriter = new ExperimentalRewriter();
var rewritedTree = CSharpSyntaxTree.ParseText(rewriter.Visit(originalTree.GetRoot()).ToFullString(), opt);
// var x = node?.Aas string;
Assert.True(rewritedTree.IsEquivalentTo(targetTree));
}
[Fact] //FAIL
public void ExperimentalRewriter_CompareShouldWorks_Success()
{
const string original = @"
public void Express(dynamic node){
var x = node.A == 10;
}";
const string target = @"
public void Express(dynamic node){
var x = node?.A == 10;
}";
var opt = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.Experimental);
var originalTree = CSharpSyntaxTree.ParseText(original, opt);
var targetTree = CSharpSyntaxTree.ParseText(target, opt);
var rewriter = new ExperimentalRewriter();
var rewritedTree = CSharpSyntaxTree.ParseText(rewriter.Visit(originalTree.GetRoot()).ToFullString(), opt);
//var x = node?.A== 10;
Assert.True(rewritedTree.IsEquivalentTo(targetTree));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment