Я ищу ряд классов (предпочтительно в платформе .NET), который проанализирует код C# и возвратит список функций с параметрами, классов с их методами, свойства и т.д. Идеально это обеспечило бы все, что это необходимо для создания моего собственного intellisense.
У меня есть чувство, что что-то вроде этого должно быть в платформе .NET, учитывая весь отражательный материал, который они предлагают, но если не затем альтернатива с открытым исходным кодом достаточно хороша.
То, что я пытаюсь создать, является в основном чем-то как Компилятор Отрывка, но со скручиванием. Я пытаюсь выяснить, как получить код dom сначала.
Я пытался гуглить для этого, но я не уверен, что правильный термин для этого так, я подошел пустой.
Править: Так как я надеюсь использовать, это для подобной intellisense обработки, на самом деле компилируя код не будет работать, так как это, скорее всего, будет неполно. Извините я должен был упомянуть это сначала.
Хотя пространство имен .NET CodeDom предоставляет базовый API для синтаксических анализаторов языка кода , они не реализованы. Visual Studio делает это с помощью собственных языковых служб. Они недоступны в распространяемой среде.
Вы можете либо ...
Может быть что-то есть на CodePlex или на подобном сайте.
ОБНОВЛЕНИЕ
См. Этот связанный пост. Синтаксический анализатор для C #
Пробовали ли вы использовать класс Microsoft.CSharp.CSharpCodeProvider ? Это полный поставщик кода C #, поддерживающий CodeDom. Вам просто нужно вызвать .Parse () в текстовом потоке, и вы получите обратно CodeCompileUnit.
var codeStream = new StringReader(code);
var codeProvider = new CSharpCodeProvider();
var compileUnit = codeProvider.Parse(codeStream);
// compileUnit contains your code dom
Что ж, поскольку вышеперечисленное не работает (я только что протестировал), следующая статья может быть интересна. Я давно добавил его в закладки, поэтому считаю, что он поддерживает только C # 2.0, но, возможно, оно того стоит:
Посмотрите на CSharpCodeCompiler
в пространстве имен Microsoft.CSharp
. Вы можете компилировать с помощью CSharpCodeCompiler
и получить доступ к результирующей сборке с помощью CompilerResults.CompiledAssembly
. Из этой сборки вы сможете получить типы, а из типов вы сможете получить всю информацию о свойствах и методах, используя отражение.
Производительность будет довольно средней, так как вам придется компилировать весь исходный код каждый раз, когда что-то изменится. Я не знаю никаких методов, которые позволят вам инкрементально компилировать фрагменты кода.
Если вам нужно, чтобы он работал с неполным кодом или кодом с ошибками, то я считаю, что вы в значительной степени сами по себе (то есть вы не сможете использовать CSharpCodeCompiler
класс или что-нибудь в этом роде).
Есть такие инструменты, как ReSharper, который выполняет собственный синтаксический анализ, но это предварительный вариант. Возможно, вы сможете начать с компилятора Mono, но, по моему опыту, написание парсера, работающего с неполным кодом, - это совершенно другая игра по сравнению с написанием того, который просто должен выдавать ошибки в неполном коде.
Если вам нужны просто имена классов и методов (в основном метаданные), вы можете выполнить синтаксический анализ «вручную», но я думаю, это зависит от того, насколько точны вам нужны результаты.
Компилятор GMCS проекта Mono содержит довольно многоразовый парсер для C#4.0. И относительно легко написать свой собственный парсер, который будет удовлетворить ваши конкретные потребности. Например, вы можете повторно использовать это: http://antlrcsharp.codeplex.com/