Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

657
Visualizações
Reemplazo de múltiples nodos en el árbol de sintaxis de Roslyn

Estoy tratando de reemplazar un par de nodos en un árbol de sintaxis usando roslyn. Pero su naturaleza inmutable parece interponerse en mi camino.

 public static string Rewrite(string content) { var tree = CSharpSyntaxTree.ParseText(content); var root = tree.GetRoot(); var methods =root .DescendantNodes(node=>true) .OfType<MethodDeclarationSyntax>() .ToList(); foreach(var method in methods) { var returnActions = method .DescendantNodes(node => true) .OfType<BinaryExpressionSyntax>() //Ok this is cheating .Where(node => node.OperatorToken.ValueText == "==") .Where(node => node.Right.ToString() == "\"#exit#\"" || node.Right.ToString() == "\"#break#\"") .Select(node => node.Parent as IfStatementSyntax) .ToList(); var lookup = new Dictionary<StatementSyntax,StatementSyntax>(); if (returnActions.Count > 0) { foreach(var ifStatement in returnActions) { var mainCall = ifStatement.GetPrevious() as ExpressionStatementSyntax; var newIfStatement = ifStatement.WithCondition(mainCall.Expression.WithoutTrivia()); lookup[mainCall] = null; lookup[ifStatement] = newIfStatement; } //this only replace some of the nodes root = root.ReplaceNodes(lookup.Keys, (s, d) => lookup[s]); } } return root.ToFullString(); }

El problema es que cuando llamo a root.ReplaceNodes solo se reemplazan algunos de los nodos.

Supongo que el reemplazo cambia el árbol para que los otros nodos ya no coincidan con el árbol original y, por lo tanto, no puedan ser reemplazados.

Pero, ¿cuál es la mejor manera de lidiar con esto?

Repasar el proceso una y otra vez hasta que no se produzcan más cambios se siente tonto :)

Los cambios pueden ocurrir anidados, y creo que eso es lo que causa los problemas aquí. ¿Puedo ordenar el conjunto de cambios de alguna manera para evitar esto o hay una forma idiomática de hacer las cosas aquí?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Supongo que el reemplazo cambia el árbol para que los otros nodos ya no coincidan con el árbol original y, por lo tanto, no puedan ser reemplazados.

Tienes razón. Reemplazar nodos crea árboles de sintaxis completamente nuevos. Los nodos de árboles de sintaxis anteriores no se pueden comparar con estos nuevos árboles de sintaxis.

Hay cuatro formas de aplicar varios cambios a un árbol de sintaxis:

  1. Utilice el Editor de DocumentEditor : consulte: https://stackoverflow.com/a/30563669/300908
  2. Usar Annotations (líneas 236 y 240)
  3. Usar .TrackNodes()
  4. Cree un CSharpSyntaxRewriter que reemplace los nodos con un enfoque ascendente. He escrito sobre esto en mi blog .

De estas opciones, creo que DocumentEditor tiene la reputación de ser la más fácil de usar. Es muy posible que sea la forma idiomática de aplicar múltiples cambios en el futuro.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda