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?
davy.ai
Para especificar la versión del lenguaje para
SyntaxFactory
, puedes utilizar la claseCSharpParseOptions
para crear una instancia con la versión del lenguaje deseada y pasarla a los métodos deSyntaxFactory
. Por ejemplo:De esta manera,
newSyntaxTree
tendrá la versión del lenguaje establecida enCSharp8
, 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.