В VS Code, если это предусмотрено расширением вашего языка, вы получите кодовые обозначения, показывающие счетчик ссылок над функциями, переменными и другими символами. Вот так: https://i.imgur.com/HXzgjGh.png
Я беру проект, и одна из моих первых задач - реструктуризация. Как часть этого, я бы хотел перетащить ссылки на локальные / внешние без необходимости «показывать все ссылки».
Я просмотрел пример API расширения и был просматривая API. Впоследствии я построил несколько, в основном бессмысленных, расширений, чтобы узнать немного больше о том, как они работают. Я могу вставить кодовые линзы с любыми данными, которые захочу, но теперь я застрял. Кажется, не существует способа получить существующие кодовые линзы или действительно сделать что-нибудь для доступа к той информации, которая создала «ссылки i».
Еще одна подсказка, которую я нашел на своем пути: это работает с помощью языка, определяющего символы. Однако, похоже, нет никакого способа их перебрать? Я мог бы заново проанализировать все и провести свой собственный анализ кодовых линз, но это займет больше времени, чем ручная проверка области видимости. Это тоже кажется более сложным, чем необходимо.
Я надеялся на событие, которое запускается, когда кодовые линзы генерируются / меняются и возвращают мне эти кодовые линзы. Похоже, коделенс пузырится, и у меня нет к нему доступа.
Я бы хотел получить два элемента информации:
Возможно ли это или выходит за рамки API? Я могу переписать синтаксический анализ, но что-то уже генерирует эту информацию, поэтому я предпочел бы получить к ней доступ.






В конце концов я нашел ответ на свой вопрос. А именно встроенные команды. Оказывается, вы можете получить символы документа и запустить поставщика ссылок с помощью двух команд (которые я здесь превратил в функции):
async function getSymbols(document: TextDocument): Promise<SymbolInformation[]>
{
return await commands.executeCommand<SymbolInformation[]>('vscode.executeDocumentSymbolProvider',
document.uri) || [];
}
async function getReferences(location: Location): Promise<Location[]>
{
return await commands.executeCommand<Location[]>('vscode.executeReferenceProvider',
location.uri,
new Position(
location.range.start.line,
location.range.start.character)) || [];
}
Позже я объединю эти две функции в отдельный вызов функции, включающий определенные условия.
Это не совсем то, что я хотел сделать (получить возвращаемое значение codelens), но это позволяет мне повторно использовать то, что реализовано, без необходимости изобретать колесо.
Привет, @K.Symbol, не могу сказать, что у меня была такая проблема. Я использовал это для определенной цели, чтобы найти объекты, помеченные как глобальные, и сделать их локальными, когда у них нет внешних ссылок. Я сделал это специально для проекта ERP, над которым работал: github.com/mjmatthiesen/localize-lens Вы можете увидеть, что я в итоге делал, в коде. Я добавил довольно много комментариев, так как я редко использую TS или пишу расширения кода.
Спасибо за ответ, я наконец понял, что виновато расширение LS. Но я также хочу знать, найдете ли вы, наконец, способ получить доступ или изменить существующую линзу кода? Я тоже не нашел API для этого.
Я не пытался модифицировать существующий. Это просто отвлекает от существующей информации, поэтому мне не нужно заново запускать весь этот процесс. Поскольку он возвращает эту информацию, возможно, вы можете попробовать изменить его там, но это все, что я могу сказать на самом деле.
Привет, очень рад видеть ваше решение здесь, потому что я почти столкнулся с аналогичной проблемой и пришел к той же идее с вами! Однако меня беспокоит то, что кажется, что эти API не гарантируют возврата полных и ожидаемых ответов. Например, для некоторых файлов в Java возвращаемые символы часто содержат только уровень члена класса, но не локальные переменные; а для справок у меня всегда был пустой список. Я предполагаю, что это проблема языковых серверов, предоставляемых расширениями, вы заметили те же проблемы и какие-либо решения?