2015-07-26 9 views
1

Использование Roslyn, я хотел бы определить, использует ли класс Linq.Как определить, использует ли класс Linq, используя Roslyn?

Предполагая, что некоторый код, как:

//... 
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };  
var lowNums = 
    from n in numbers 
    where n < 5 
    select n; 
//... 

Предположим также, что файл этот код не включает в себяusing System.Linq;

Я хотел бы быть в состоянии обнаружить, что есть LINQ заявление в файл и (скажем) автоматически добавьте using System.Linq. Я хотел бы определить синтаксис запроса или метода для Linq.

Есть ли способ обнаружить это с помощью Roslyn? Я просто хочу знать, использует ли код Linq или нет, и не хочу делать никакой дальнейшей обработки.

+0

Я думаю, что вы можете захотеть найти соответствующие токены, и после того, как вы проанализировали файл, проверьте, существуют ли какие-либо (или минимальный набор) из них как токены – Aviatrix

+0

Я использую что-то вроде http://stackoverflow.com/a/29336378/4415401, но это, похоже, не обнаруживает код linq, приведенный в приведенном выше примере. Понравился бы какой-нибудь рабочий (или что-то, что я могу сделать). – user1234554321

ответ

5

Учитывая дерево синтаксиса, вы можете просто найти узлы SyntaxKind.QueryExpression или связанные с ними типы узлов.

Для получения дополнительных сведений откройте файл VS2015 и посмотрите на визуализатор синтаксиса, чтобы увидеть, как выглядит дерево синтаксиса.

+2

Но это не может обнаружить 'numbers.Where (n => n <5)' version, правильно? –

+2

@JakubLinhart: Правильно. Если вы хотите обнаружить это, вам нужно будет определить, что вы на самом деле хотите (любой метод с именем 'Where'? Конкретный поставщик LINQ? Любой метод расширения с лямбдой?). И вам, вероятно, понадобится семантическая модель. – SLaks