Изменить существующий CodeLens в VS Code Extension

В VS Code, если это предусмотрено расширением вашего языка, вы получите кодовые обозначения, показывающие счетчик ссылок над функциями, переменными и другими символами. Вот так: https://i.imgur.com/HXzgjGh.png

Я беру проект, и одна из моих первых задач - реструктуризация. Как часть этого, я бы хотел перетащить ссылки на локальные / внешние без необходимости «показывать все ссылки».

Я просмотрел пример API расширения и был просматривая API. Впоследствии я построил несколько, в основном бессмысленных, расширений, чтобы узнать немного больше о том, как они работают. Я могу вставить кодовые линзы с любыми данными, которые захочу, но теперь я застрял. Кажется, не существует способа получить существующие кодовые линзы или действительно сделать что-нибудь для доступа к той информации, которая создала «ссылки i».

Еще одна подсказка, которую я нашел на своем пути: это работает с помощью языка, определяющего символы. Однако, похоже, нет никакого способа их перебрать? Я мог бы заново проанализировать все и провести свой собственный анализ кодовых линз, но это займет больше времени, чем ручная проверка области видимости. Это тоже кажется более сложным, чем необходимо.

Я надеялся на событие, которое запускается, когда кодовые линзы генерируются / меняются и возвращают мне эти кодовые линзы. Похоже, коделенс пузырится, и у меня нет к нему доступа.

Я бы хотел получить два элемента информации:

  1. Получите число i из "i ссылок".
  2. Получите строку, к которой он относится.

Возможно ли это или выходит за рамки API? Я могу переписать синтаксический анализ, но что-то уже генерирует эту информацию, поэтому я предпочел бы получить к ней доступ.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
0
395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конце концов я нашел ответ на свой вопрос. А именно встроенные команды. Оказывается, вы можете получить символы документа и запустить поставщика ссылок с помощью двух команд (которые я здесь превратил в функции):

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), но это позволяет мне повторно использовать то, что реализовано, без необходимости изобретать колесо.

Привет, очень рад видеть ваше решение здесь, потому что я почти столкнулся с аналогичной проблемой и пришел к той же идее с вами! Однако меня беспокоит то, что кажется, что эти API не гарантируют возврата полных и ожидаемых ответов. Например, для некоторых файлов в Java возвращаемые символы часто содержат только уровень члена класса, но не локальные переменные; а для справок у меня всегда был пустой список. Я предполагаю, что это проблема языковых серверов, предоставляемых расширениями, вы заметили те же проблемы и какие-либо решения?

K. Symbol 21.05.2021 09:53

Привет, @K.Symbol, не могу сказать, что у меня была такая проблема. Я использовал это для определенной цели, чтобы найти объекты, помеченные как глобальные, и сделать их локальными, когда у них нет внешних ссылок. Я сделал это специально для проекта ERP, над которым работал: github.com/mjmatthiesen/localize-lens Вы можете увидеть, что я в итоге делал, в коде. Я добавил довольно много комментариев, так как я редко использую TS или пишу расширения кода.

MattyMatt 26.05.2021 18:09

Спасибо за ответ, я наконец понял, что виновато расширение LS. Но я также хочу знать, найдете ли вы, наконец, способ получить доступ или изменить существующую линзу кода? Я тоже не нашел API для этого.

K. Symbol 07.06.2021 12:54

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

MattyMatt 08.06.2021 21:37

Другие вопросы по теме