Могу ли я использовать Roslyn для переписывания кода времени компиляции? - PullRequest
16 голосов
/ 20 октября 2011

Например, у меня есть

class Foo: INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    public int Bar {get;set;}
}

Могу ли я получить класс Foo AST и переписать Bar во время компиляции на

    public string Bar
    {
        get { return this.bar; }

        set 
        {
            if (value != this.bar)
            {
                this.phoneNumberValue = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Bar"));
            }
        }
    }

.

Ответы [ 2 ]

16 голосов
/ 20 октября 2011

Переписывание во время компиляции напрямую не поддерживается Roslyn сегодня, но синтаксические и семантические преобразования определенно поддерживаются. Фактически, посмотрите на образец «ImplementNotifyPropertyChanged», включенный в CTP, чтобы увидеть кое-что из того, что вы хотите сделать. Образец реализован как преобразование времени разработки и функция IDE, но вы можете извлечь логику и превратить ее в нечто вроде задачи перед сборкой, которая переписывает файлы перед компиляцией.

2 голосов
/ 20 октября 2011

Я не думаю, что это возможно в текущем CTP, который был выпущен, так как компилятор находится в качестве службы, но нет такой вещи, которая позволила бы вам подключиться к процессу компиляции, как вы можете сделать в Nemerle.

...