es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Especificar la versión de idioma para Roslyn SyntaxFactory

Actualmente estoy construyendo un generador de código fuente en C# con Roslyn en una biblioteca de netstandard2.0. En el archivo .csproj, he referenciado los siguientes paquetes de Roslyn:

<itemgroup>
    <packagereference include="Microsoft.CodeAnalysis.CSharp" version="4.0.1"></packagereference>
    <packagereference include="Microsoft.CodeAnalysis.Analyzers" version="3.3.3"></packagereference>
</itemgroup>

El generador de código fuente utiliza SyntaxFactory de Roslyn para crear código adicional. Luego utiliza context.Compilation.AddSyntaxTrees() para agregar el código generado a la compilación (context es el GeneratorExecutionContext que se pasa al método Execute del generador).

El problema es que obtengo la siguiente excepción al llamar a AddSyntaxTrees():

System.ArgumentException: Versiones de lenguaje inconsistentes. Nombre del parámetro: syntaxTrees

Entiendo el motivo de la excepción. Los árboles de sintaxis creados por SyntaxFactory tienen sus versiones de lenguaje establecidas en CSharp10. Pero la versión de lenguaje del contexto de compilación está establecida en CSharp8.

¿Hay alguna manera de indicarle a SyntaxFactory la versión de lenguaje que debe producir?

Entiendo que también podría usar la versión 3.7 de Microsoft.CodeAnalysis.Analyzers (según esta tabla). Pero, ¿esto no me impediría usar las últimas características de Roslyn (aunque no estoy seguro de cuáles podrían ser)? Además, ¿cómo puedo asegurarme de que las bibliotecas de destino que utilizan el generador de código solo se compilen con la misma versión de lenguaje? ¿O necesito diferentes versiones del generador de código fuente para diferentes versiones de lenguaje? ¿Y podría variar esto en diferentes IDEs?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para especificar la versión del lenguaje para SyntaxFactory, puedes utilizar la clase CSharpParseOptions para crear una instancia con la versión del lenguaje deseada y pasarla a los métodos de SyntaxFactory. Por ejemplo:

    var parseOptions = new CSharpParseOptions(LanguageVersion.CSharp8);
    var newMethod = SyntaxFactory.MethodDeclaration(...).WithAdditionalAnnotations(new SyntaxAnnotation("Generated")).WithAdditionalAnnotations(new SyntaxTrivia());
    var newSyntaxTree = SyntaxFactory.SyntaxTree(newMethod, parseOptions);
    

    De esta manera, newSyntaxTree tendrá la versión del lenguaje establecida en CSharp8, que coincidirá con el contexto de la compilación.

    En cuanto al uso de diferentes versiones de los paquetes de Roslyn, es posible tener diferentes versiones para el generador de código fuente y las bibliotecas de destino. Lo importante es que las bibliotecas de destino se compilen con una versión del lenguaje que sea compatible con los árboles de sintaxis generados por el generador de código fuente. Esto se puede lograr especificando la versión correcta del lenguaje en la configuración de compilación del proyecto de destino.

    Diferentes IDE pueden utilizar diferentes versiones de los paquetes de Roslyn, por lo que es importante probar el generador de código fuente en diferentes entornos para garantizar la compatibilidad.

Comments are closed.