O que é o projeto Roslyn

O projeto Roslyn é uma forma de repensar o compilador do C# e VB de forma modularizada. Dessa forma, o compilador deixa de ser uma caixa preta e passa a transparecer todos os processos de compilação. Desenvolvedores passam a ter acesso a todas as bibliotecas utilizadas pelo compilador. Literalmente, esses compiladores estão sendo reescritos. Por exemplo, o código fonte do projeto csc.exe que está sendo reescrito no projeto Roslyn (rcsc.exe) pode ser encontrado aqui. É o compilador de C# escrito em C#.

Indiretamente, podemos esperar novas ferramentas surgindo para análise de código e refatoração; talvez um Visual Studio mais inteligentes, quem sabe? Você poderia citar mais exemplos?

O código fonte está sendo distribuído através da licença Apache License 2.0 e está disponível no codeplex.

Roslyn é apenas um codinome para o projeto, já deu para perceber que a Microsoft chamará esse conjunto de bibliotecas e ferramentas de .NET Compiler Platform.

Exemplo

Como exemplo, criei um projeto Console em C# e adicionei o pacote NuGet para o Roslyn da seguinte forma:

PM> Install-Package Microsoft.CodeAnalysis -Pre

Depois adicionei o seguinte trecho de código:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace RoslynConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            SyntaxTree tree = CSharpSyntaxTree.ParseText(@"
using System;
using System.Collections.Generic;
using System.Text; 

namespace HelloWorld  {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine(""Hello, World!"");
        }
    }
}");

            var root = tree.GetRoot() as CompilationUnitSyntax;

            var compilation = CSharpCompilation.Create("HelloWorld")
                .AddReferences(new MetadataFileReference(typeof(object).Assembly.Location))
                .AddSyntaxTrees(tree);

            var semanticModel = compilation.GetSemanticModel(tree);
        }
    }
}

Note que foi necessário adicionar uma referência ao assembly mscorelib.dll através da expressão:

typeof(object).Assembly.Location

O objeto root (CompilationUnitSyntax) representa a árvore sintática do código. Você pode usar para navegar pelo código: quais os namespaces, quais classes estão dentro desse namespace, quais métodos da classe, etc.

O objeto compilation (CSharpCompilation) representa uma compilação do código e através dele é possível ter acesso a análise semântica do código (semanticModel). Segundo a documentação, é possível responder perguntas tais como: quais membros são acessíveis a partir de algum método?

Uma observação interessante é que o objeto compilation é imutável, e funciona sob demanda. A partir do momento que você vai acessando suas propriedades ele vai compilando o que for necessário. Não é possível alterar o compilation, apenas criar um novo a partir de um existente, o que possibilita reutilizar o que for possível.

Esse exemplo que coloquei é apenas um pedaço do exemplo citado no artigo Getting Started: Semantic Analysis. Leia lá para mais detalhes.

Anúncios

One Response to O que é o projeto Roslyn

  1. Pingback: Roslyn e o futuro | Vinicius de Melo Rocha

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: