Yöntemlerden öznitelikleri kaldırmak için kullanıyorum bir CSharpSyntaxRewriter
yazdım, ancak bir yöntemi tüm öznitelikleri kaldırırken öznitelik (önceki yönteme kadar) önce bir şey tutmak için mücadele ediyorum.Üyelik özelliği nasıl kaldırılır, boş bir satır mı bırakılır?
Bu, birden fazla özniteliği olan yöntemlerde mükemmel çalışır, ancak yalnızca bir tanesini değil.
İşte minimal üreme var:
void Main()
{
var code = @"namespace P
{
class Program
{
public void NoAttributes() { }
//???
[TestCategory(""Atomic"")]
public void OneAtt1() { }
[TestCategory(""Atomic"")]
public void OneAtt2() { }
[TestMethod, TestCategory(""Atomic"")]
public void TwoAtts() { }
}
}";
var tree = CSharpSyntaxTree.ParseText(code);
var rewriter = new AttributeRemoverRewriter();
var rewrittenRoot = rewriter.Visit(tree.GetRoot());
Console.WriteLine(rewrittenRoot.GetText().ToString());
}
public class AttributeRemoverRewriter : CSharpSyntaxRewriter
{
public override SyntaxNode VisitAttributeList(AttributeListSyntax attributeList)
{
var nodesToRemove =
attributeList
.Attributes
.Where(att => (att.Name as IdentifierNameSyntax).Identifier.Text.StartsWith("TestCategory"))
.ToArray();
if (nodesToRemove.Length == attributeList.Attributes.Count)
{
//Remove the entire attribute
return
attributeList
.RemoveNode(attributeList, SyntaxRemoveOptions.KeepNoTrivia);
}
else
{
//Remove just the matching ones recursively
foreach (var node in nodesToRemove)
return
VisitAttributeList(attributeList.RemoveNode(node, SyntaxRemoveOptions.KeepNoTrivia));
}
return
base.VisitAttributeList(attributeList);
}
}
Tam sürüm üzerinde burada benim gist (herkes diğer sorunları işaret önce).
Beklenen çıktısı:
namespace P
{
class Program
{
public void NoAttributes() { }
//???
public void OneAtt1() { }
public void OneAtt2() { }
[TestMethod]
public void TwoAtts() { }
}
}
Gerçek çıktısı:
namespace P
{
class Program
{
public void NoAttributes() { }
public void OneAtt1() { }
public void OneAtt2() { }
[TestMethod]
public void TwoAtts() { }
}
}
herhangi bir fikir Ben boşluk tutmak için yapmanız gerekenler üzerinde (veya hatta yorum !!)?
Trivia
'un her kombinasyonu ile uğraştım. SyntaxRemoveOptions
'un değiştirilmesi, Roslyn kod tabanının içinde NullReferenceException
5 s'nin bulunmasıyla sonuçlanır ve *Trivia
uzantı yöntemlerinin kullanılması, artık kaldırılmayan özelliklerle sonuçlanır - sadece beyaz boşluk.
Bu istisnalar bana hata gibi görünüyor. Bunları yerel olarak yeniden ürettim ve 'SyntaxRemoveOptions' değiştirilmesinin istisnalara neden olması gerektiğini düşünmüyorum. Bir sorun yaratmalısınız: https://github.com/dotnet/roslyn/issues – JoshVarty