diff --git a/.vscode/launch.json b/.vscode/launch.json index 377cb83acf..d88a00df50 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -24,7 +24,9 @@ "csharp-test-profile", "${workspaceRoot}/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/slnWithCsproj.code-workspace", "--extensionDevelopmentPath=${workspaceRoot}", - "--extensionTestsPath=${workspaceRoot}/out/test/lsptoolshost/integrationTests" + "--extensionTestsPath=${workspaceRoot}/out/test/lsptoolshost/integrationTests", + "--log", + "ms-dotnettools.csharp:trace" ], "env": { "CODE_EXTENSIONS_PATH": "${workspaceRoot}", @@ -49,7 +51,9 @@ "csharp-test-profile", "${workspaceRoot}/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/devkit_slnWithCsproj.code-workspace", "--extensionDevelopmentPath=${workspaceRoot}", - "--extensionTestsPath=${workspaceRoot}/out/test/lsptoolshost/integrationTests" + "--extensionTestsPath=${workspaceRoot}/out/test/lsptoolshost/integrationTests", + "--log", + "ms-dotnettools.csharp:trace" ], "env": { "CODE_EXTENSIONS_PATH": "${workspaceRoot}", @@ -74,7 +78,9 @@ "csharp-test-profile", "${workspaceRoot}/test/razor/razorIntegrationTests/testAssets/BasicRazorApp2_1/.vscode/lsp_tools_host_BasicRazorApp2_1.code-workspace", "--extensionDevelopmentPath=${workspaceRoot}", - "--extensionTestsPath=${workspaceRoot}/out/test/razor/razorIntegrationTests" + "--extensionTestsPath=${workspaceRoot}/out/test/razor/razorIntegrationTests", + "--log", + "ms-dotnettools.csharp:trace" ], "env": { "CODE_EXTENSIONS_PATH": "${workspaceRoot}", diff --git a/SUPPORT.md b/SUPPORT.md index 6a60ce3642..0c3ea01601 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -19,6 +19,8 @@ We highly recommend using the C# extension's built-in command, `CSharp: Report a The template has a section to include the `C#` output window logs. These logs are not automatically included as they may contain personal information (such as full file paths and project names), but they are key to resolving problems. +TODO UPDATE ON NEW INSTRUCTIONS + 1. First, set `dotnet.server.trace` to `Trace` in VSCode settings ![settings window showing trace option](./docs/trace_logs.png) 2. Reload the window via the `Developer: Reload Window` (`workbench.action.reloadWindow`) command diff --git a/package-lock.json b/package-lock.json index c77e54d1f6..105bc1546b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "@types/tmp": "0.0.33", "@types/unzipper": "^0.9.1", "@types/uuid": "^9.0.1", - "@types/vscode": "1.73.0", + "@types/vscode": "1.93.0", "@types/yauzl": "2.10.0", "@typescript-eslint/eslint-plugin": "^8.5.0", "@typescript-eslint/parser": "^8.5.0", @@ -97,7 +97,7 @@ "webpack-cli": "4.6.0" }, "engines": { - "vscode": "^1.75.0" + "vscode": "^1.93.0" } }, "node_modules/@ampproject/remapping": { @@ -3191,10 +3191,11 @@ } }, "node_modules/@types/vscode": { - "version": "1.73.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/vscode/-/vscode-1.73.0.tgz", - "integrity": "sha512-FhkfF7V3fj7S3WqXu7AxFesBLO3uMkdCPJJPbwyZXezv2xJ6xBWHYM2CmkkbO8wT9Fr3KipwxGGOoQRrYq7mHg==", - "dev": true + "version": "1.93.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/vscode/-/vscode-1.93.0.tgz", + "integrity": "sha1-HNdXPgJyrvnDV7r8Y1thd8FUAT4=", + "dev": true, + "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.24", @@ -18288,9 +18289,9 @@ } }, "@types/vscode": { - "version": "1.73.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/vscode/-/vscode-1.73.0.tgz", - "integrity": "sha512-FhkfF7V3fj7S3WqXu7AxFesBLO3uMkdCPJJPbwyZXezv2xJ6xBWHYM2CmkkbO8wT9Fr3KipwxGGOoQRrYq7mHg==", + "version": "1.93.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/vscode/-/vscode-1.93.0.tgz", + "integrity": "sha1-HNdXPgJyrvnDV7r8Y1thd8FUAT4=", "dev": true }, "@types/yargs": { diff --git a/package.json b/package.json index 64459c28d0..82b18a9039 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "@types/tmp": "0.0.33", "@types/unzipper": "^0.9.1", "@types/uuid": "^9.0.1", - "@types/vscode": "1.73.0", + "@types/vscode": "1.93.0", "@types/yauzl": "2.10.0", "@typescript-eslint/eslint-plugin": "^8.5.0", "@typescript-eslint/parser": "^8.5.0", @@ -689,7 +689,7 @@ } ], "engines": { - "vscode": "^1.75.0" + "vscode": "^1.93.0" }, "activationEvents": [ "onDebugInitialConfigurations", @@ -1441,21 +1441,6 @@ "default": false, "description": "%configuration.dotnet.server.waitForDebugger%" }, - "dotnet.server.trace": { - "scope": "window", - "type": "string", - "enum": [ - "Trace", - "Debug", - "Information", - "Warning", - "Error", - "Critical", - "None" - ], - "default": "Information", - "description": "%configuration.dotnet.server.trace%" - }, "dotnet.server.extensionPaths": { "scope": "machine-overridable", "type": [ diff --git a/package.nls.cs.json b/package.nls.cs.json index 2c45f5e710..44cd5323a4 100644 --- a/package.nls.cs.json +++ b/package.nls.cs.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Určuje časový limit (v ms), aby se klient úspěšně spustil a připojil k jazykovému serveru.", "configuration.dotnet.server.suppressLspErrorToasts": "Potlačí zobrazování informačních zpráv o chybách, pokud na serveru dojde k chybě, ze které se dá zotavit.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Potlačí zobrazování informačních upozornění, pokud je aktivní dokument mimo otevřený pracovní prostor.", - "configuration.dotnet.server.trace": "Nastaví úroveň protokolování pro jazykový server", "configuration.dotnet.server.useServerGC": "Nakonfigurujte jazykový server tak, aby používal uvolňování paměti serveru .NET. Uvolňování paměti serveru obecně přináší vyšší výkon za cenu vyšší spotřeby paměti.", "configuration.dotnet.server.waitForDebugger": "Při spuštění serveru předá příznak --debug, aby bylo možné připojit ladicí program. (Dříve omnisharp.waitForDebugger)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Hledat symboly v referenčních sestaveních Ovlivňuje funkce, které vyžadují vyhledávání symbolů, například přidání importů.", diff --git a/package.nls.de.json b/package.nls.de.json index c23da78755..fd24a30092 100644 --- a/package.nls.de.json +++ b/package.nls.de.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Gibt ein Timeout (in ms) an, mit dem der Client erfolgreich gestartet und eine Verbindung mit dem Sprachserver hergestellt werden kann.", "configuration.dotnet.server.suppressLspErrorToasts": "Unterdrückt, dass Fehler-Popups angezeigt werden, wenn auf dem Server ein wiederherstellbarer Fehler auftritt.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Hiermit wird die Anzeige von Popupwarnungen unterdrückt, wenn sich das aktive Dokument außerhalb des geöffneten Arbeitsbereichs befindet.", - "configuration.dotnet.server.trace": "Legt den Protokolliergrad für den Sprachserver fest.", "configuration.dotnet.server.useServerGC": "Konfigurieren Sie den Sprachserver für die Verwendung der GC des .NET-Servers. Die GC auf dem Server bietet im Allgemeinen eine bessere Leistung bei einem höheren Arbeitsspeicherverbrauch.", "configuration.dotnet.server.waitForDebugger": "Übergibt das Flag \"--debug\" beim Starten des Servers, damit ein Debugger angefügt werden kann. (Zuvor \"omnisharp.waitForDebugger\")", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Symbole in Verweisassemblys suchen. Dies wirkt sich auf Features aus, die eine Symbolsuche erfordern, z. B. Importe hinzufügen.", diff --git a/package.nls.es.json b/package.nls.es.json index 96374d0492..1809d421a6 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Especifica un tiempo de espera (en ms) para que el cliente se inicie correctamente y se conecte al servidor de lenguaje.", "configuration.dotnet.server.suppressLspErrorToasts": "Suprime la visualización de notificaciones del sistema de error si el servidor encuentra un error recuperable.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Impida que aparezcan notificaciones de advertencia si el documento activo se encuentra fuera del área de trabajo abierta.", - "configuration.dotnet.server.trace": "Establece el nivel de registro para el servidor de lenguaje", "configuration.dotnet.server.useServerGC": "Configure el servidor de idiomas para usar la recolección de elementos no utilizados del servidor de .NET. La recolección de elementos no utilizados del servidor suele proporcionar un mejor rendimiento a costa de un mayor consumo de memoria.", "configuration.dotnet.server.waitForDebugger": "Pasa la marca --debug al iniciar el servidor para permitir que se adjunte un depurador. (Anteriormente \"omnisharp.waitForDebugger\")", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Buscar símbolos en ensamblados de referencia. Afecta a las características y requiere la búsqueda de símbolos, como agregar importaciones.", diff --git a/package.nls.fr.json b/package.nls.fr.json index c75bb555f5..d0cab959ee 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Spécifie un délai d'attente (en ms) pour que le client démarre et se connecte avec succès au serveur de langue.", "configuration.dotnet.server.suppressLspErrorToasts": "Supprime l’affichage des notifications toast d’erreur si le serveur a rencontré une erreur récupérable.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Supprimez l’affichage des toasts d’avertissement si le document actif se situe en dehors de l’espace de travail ouvert.", - "configuration.dotnet.server.trace": "Définit le niveau de journalisation pour le serveur de langage", "configuration.dotnet.server.useServerGC": "Configurez le serveur de langue pour qu’il utilise le serveur .NET GC. Le serveur GC offre généralement un meilleur niveau de performance au prix d’une consommation de mémoire plus élevée.", "configuration.dotnet.server.waitForDebugger": "Passe le drapeau – debug lors du lancement du serveur pour permettre à un débogueur d’être attaché. (Précédemment `omnisharp.waitForDebugger`)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Rechercher des symboles dans les assemblys de référence. Elle affecte les fonctionnalités nécessitant une recherche de symboles, comme l’ajout d’importations.", diff --git a/package.nls.it.json b/package.nls.it.json index 78f65609fb..a931793d7d 100644 --- a/package.nls.it.json +++ b/package.nls.it.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Specifica un timeout (in ms) per l'avvio del client e la sua connessione al server di linguaggio.", "configuration.dotnet.server.suppressLspErrorToasts": "Impedisce la visualizzazione degli avvisi popup di errore se il server rileva un errore reversibile.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Non visualizzare avvisi popup se il documento attivo si trova all'esterno dell'area di lavoro aperta.", - "configuration.dotnet.server.trace": "Imposta il livello di registrazione per il server di linguaggio", "configuration.dotnet.server.useServerGC": "Configurare il server del linguaggio per l'utilizzo di Garbage Collection del server .NET. Garbage Collection del server offre in genere prestazioni migliori a spese di un consumo di memoria più elevato.", "configuration.dotnet.server.waitForDebugger": "Passa il flag --debug all'avvio del server per consentire il collegamento di un debugger. (In precedenza “omnisharp.waitForDebugger”)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Cerca simboli negli assembly di riferimento. Influisce sulle funzionalità che richiedono la ricerca di simboli, ad esempio l'aggiunta di importazioni.", diff --git a/package.nls.ja.json b/package.nls.ja.json index c5410124cf..214ccb506c 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "クライアントが正常に起動して言語サーバーに接続するためのタイムアウト (ミリ秒) を指定します。", "configuration.dotnet.server.suppressLspErrorToasts": "サーバーで回復可能なエラーが発生した場合に、エラー トーストが表示されないようにします。", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "開いているワークスペースに属さないドキュメントがアクティブである場合に、警告トーストを表示しないようにします。", - "configuration.dotnet.server.trace": "言語サーバーのログ記録レベルを設定する", "configuration.dotnet.server.useServerGC": ".NET サーバーのガベージ コレクションを使用するように言語サーバーを構成します。サーバー GC は一般に、メモリ消費量が高いことをコストにパフォーマンスを向上させます。", "configuration.dotnet.server.waitForDebugger": "デバッガーのアタッチを許可するために、サーバーを起動するときに --debug フラグを渡します。(以前の `omnisharp.waitForDebugger`)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "参照アセンブリ内のシンボルを検索します。影響を受ける機能には、インポートの追加などのシンボル検索が必要です。", diff --git a/package.nls.json b/package.nls.json index addcc8d7e5..d751ee61cb 100644 --- a/package.nls.json +++ b/package.nls.json @@ -31,7 +31,6 @@ "configuration.dotnet.server.componentPaths.xamlTools": "Overrides the folder path for the .xamlTools component of the language server", "configuration.dotnet.server.startTimeout": "Specifies a timeout (in ms) for the client to successfully start and connect to the language server.", "configuration.dotnet.server.waitForDebugger": "Passes the --debug flag when launching the server to allow a debugger to be attached. (Previously `omnisharp.waitForDebugger`)", - "configuration.dotnet.server.trace": "Sets the logging level for the language server", "configuration.dotnet.server.extensionPaths": "Override for path to language server --extension arguments", "configuration.dotnet.server.crashDumpPath": "Sets a folder path where crash dumps are written to if the language server crashes. Must be writeable by the user.", "configuration.dotnet.server.suppressLspErrorToasts": "Suppresses error toasts from showing up if the server encounters a recoverable error.", diff --git a/package.nls.ko.json b/package.nls.ko.json index 57c87595dd..ca0efe0549 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "클라이언트가 언어 서버를 시작하고 연결하기 위한 시간 제한(밀리초)을 지정합니다.", "configuration.dotnet.server.suppressLspErrorToasts": "서버에서 복구 가능한 오류가 발생하는 경우 오류 알림이 표시되지 않도록 합니다.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "활성 문서가 열려 있는 작업 영역 밖에 있는 경우 경고 알림이 표시되지 않도록 합니다.", - "configuration.dotnet.server.trace": "언어 서버의 로깅 수준을 설정합니다.", "configuration.dotnet.server.useServerGC": ".NET 서버 가비지 수집을 사용하도록 언어 서버를 구성합니다. 서버 가비지 수집은 일반적으로 메모리 사용량이 많을수록 성능이 향상됩니다.", "configuration.dotnet.server.waitForDebugger": "디버거 연결을 허용하기 위해 서버를 시작할 때 --debug 플래그를 전달합니다(이전 `omnisharp.waitForDebugger`).", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "참조 어셈블리에서 기호를 검색합니다. 가져오기 추가와 같은 기호 검색이 필요한 기능에 영향을 줍니다.", diff --git a/package.nls.pl.json b/package.nls.pl.json index 3dc25006b8..6ba979a59c 100644 --- a/package.nls.pl.json +++ b/package.nls.pl.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Określa limit czasu (w ms) dla pomyślnego uruchomienia klienta i nawiązania połączenia z serwerem języka.", "configuration.dotnet.server.suppressLspErrorToasts": "Pomija wyświetlanie wyskakujących powiadomień o błędach, jeśli serwer napotka błąd do odzyskania.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Pomiń wyświetlanie wyskakujących powiadomień ostrzegawczych, jeśli dokument aktywny znajduje się poza otwartym obszarem roboczym.", - "configuration.dotnet.server.trace": "Ustawia poziom rejestrowania dla serwera języka", "configuration.dotnet.server.useServerGC": "Skonfiguruj serwer językowy do używania funkcji odzyskiwania pamięci serwera .NET. Odzyskiwanie pamięci serwera zasadniczo zapewnia lepszą wydajność przy wyższym zużyciu pamięci.", "configuration.dotnet.server.waitForDebugger": "Przekazuje flagę --debug podczas uruchamiania serwera, aby umożliwić dołączenie debugera. (Wcześniej „omnisharp.waitForDebugger”)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Wyszukaj symbole w zestawach odwołań. Ma to wpływ na funkcje wymagające wyszukiwania symboli, takie jak dodawanie importów.", diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json index b2d572c405..bdb3b6257c 100644 --- a/package.nls.pt-br.json +++ b/package.nls.pt-br.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Especifica um tempo limite (em ms) para o cliente iniciar e conectar-se com êxito ao servidor de idioma.", "configuration.dotnet.server.suppressLspErrorToasts": "Suprime a exibição de notificações do erro se o servidor encontrar um erro recuperável.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Suprima a exibição de notificações de aviso do sistema se o documento ativo estiver fora do workspace aberto.", - "configuration.dotnet.server.trace": "Define o nível de log para o servidor de idiomas", "configuration.dotnet.server.useServerGC": "Configure o servidor de linguagem para usar a coleta de lixo do servidor do .NET. A coleta de lixo do servidor geralmente fornece um melhor desempenho às custas de um consumo de memória mais alto.", "configuration.dotnet.server.waitForDebugger": "Passa o sinalizador --debug ao iniciar o servidor para permitir que um depurador seja anexado. (Anteriormente `omnisharp.waitForDebugger`)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Pesquisar símbolos em montagens de referência. Afeta os recursos que exigem pesquisa de símbolos, como adicionar importações.", diff --git a/package.nls.ru.json b/package.nls.ru.json index 55ce3a09b2..f9c1c1d59d 100644 --- a/package.nls.ru.json +++ b/package.nls.ru.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "Указывает время ожидания (в миллисекундах) для запуска клиента и его подключения к языковому серверу.", "configuration.dotnet.server.suppressLspErrorToasts": "Подавляет появление всплывающих сообщений об ошибках, если сервер обнаруживает устранимую ошибку.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Скрывать всплывающие предупреждения, если активный документ находится за пределами открытого рабочего пространства.", - "configuration.dotnet.server.trace": "Задает уровень ведения журнала для языкового сервера", "configuration.dotnet.server.useServerGC": "Настройте языковой сервер для использования сборки мусора сервера .NET. Сборка мусора сервера обычно обеспечивает более высокую производительность за счет более высокого потребления памяти.", "configuration.dotnet.server.waitForDebugger": "Передает флаг --debug при запуске сервера, чтобы разрешить подключение отладчика. (Ранее — \"omnisharp.waitForDebugger\")", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Поиск символов в эталонных сборках. Он влияет на функции, для которых требуется поиск символов, например добавление импортов.", diff --git a/package.nls.tr.json b/package.nls.tr.json index 84a7277655..70d2d3ec7b 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "İstemcinin başarılı bir şekilde başlatılması ve dil sunucusuna bağlanması için zaman aşımını (ms cinsinden) belirtir.", "configuration.dotnet.server.suppressLspErrorToasts": "Sunucu kurtarılabilir bir hatayla karşılaştığında hata bildirimlerinin görünmesini engeller.", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "Etkin belge açık çalışma alanının dışındaysa, uyarı bildirimlerini göstermeyi durdur.", - "configuration.dotnet.server.trace": "Dil sunucusu için günlük düzeyini ayarlar", "configuration.dotnet.server.useServerGC": "Dil sunucusunu .NET sunucusu atık toplamayı kullanmak üzere yapılandırın. Sunucu atık toplama, genellikle yüksek bellek tüketimi pahasına daha iyi performans sağlar.", "configuration.dotnet.server.waitForDebugger": "Bir hata ayıklayıcının eklenmesine izin vermek için sunucuyu başlatırken --debug bayrağını iletir. (Önceden 'omnisharp.waitForDebugger')", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "Başvuru derlemeleri içinde sembolleri arama. İçeri aktarma ekleme gibi sembol arama gerektiren özellikleri etkiler.", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index c3b5762363..07acc3c483 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "为客户端指定一个超时 (以毫秒为单位),以成功启动并连接到语言服务器。", "configuration.dotnet.server.suppressLspErrorToasts": "当服务器遇到可恢复错误时,禁止显示错误 toast。", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "如果活动文档在打开的工作区之外,则禁止显示警告 toast。", - "configuration.dotnet.server.trace": "设置语言服务器的日志记录级别", "configuration.dotnet.server.useServerGC": "将语言服务器配置为使用 .NET 服务器垃圾回收。服务器垃圾回收在提供更好的性能时通常需要消耗更多内存。", "configuration.dotnet.server.waitForDebugger": "启动服务器时传递 --debug 标志,以允许附加调试器。(之前为 \"omnisharp.waitForDebugger\")", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "在引用程序集中搜索符号。它会影响需要符号搜索的功能,例如添加导入。", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index d5baa322b5..1ff2d493fd 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -69,7 +69,6 @@ "configuration.dotnet.server.startTimeout": "指定用戶端順利啟動並連接到語言伺服器的逾時 (毫秒)。", "configuration.dotnet.server.suppressLspErrorToasts": "如果伺服器發生可復原的錯誤,隱藏不顯示錯誤快顯通知。", "configuration.dotnet.server.suppressMiscellaneousFilesToasts": "如果使用中文件在開啟中工作區之外,則抑制顯示警告快顯通知。", - "configuration.dotnet.server.trace": "設定語言伺服器的記錄層次", "configuration.dotnet.server.useServerGC": "設定語言伺服器以使用 .NET 伺服器垃圾收集。伺服器垃圾收集通常會在耗用較高的記憶體時提供較佳的效能。", "configuration.dotnet.server.waitForDebugger": "啟動伺服器時傳遞 --debug 旗標,以允許附加偵錯工具。(先前為 `omnisharp.waitForDebugger`)", "configuration.dotnet.symbolSearch.searchReferenceAssemblies": "在參考組件中搜尋符號。這會影響需要符號搜尋的功能,例如新增匯入。", diff --git a/src/lsptoolshost/commands.ts b/src/lsptoolshost/commands.ts index 387e35d22b..8ecb6dff4b 100644 --- a/src/lsptoolshost/commands.ts +++ b/src/lsptoolshost/commands.ts @@ -16,7 +16,7 @@ export function registerCommands( context: vscode.ExtensionContext, languageServer: RoslynLanguageServer, hostExecutableResolver: IHostExecutableResolver, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ) { // It is very important to be careful about the types used as parameters for these command callbacks. // If the arguments are coming from the server as json, it is NOT appropriate to use type definitions @@ -101,7 +101,7 @@ async function completionComplexEdit( textEdit: vscode.TextEdit, isSnippetString: boolean, newOffset: number, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ): Promise { const componentName = '[roslyn.client.completionComplexEdit]'; @@ -167,9 +167,9 @@ async function completionComplexEdit( } } -function outputAndThrow(outputChannel: vscode.OutputChannel, message: string): void { +function outputAndThrow(outputChannel: vscode.LogOutputChannel, message: string): void { outputChannel.show(); - outputChannel.appendLine(message); + outputChannel.error(message); throw new Error(message); } diff --git a/src/lsptoolshost/copilot.ts b/src/lsptoolshost/copilot.ts index 65c6519d41..a9c1780f8b 100644 --- a/src/lsptoolshost/copilot.ts +++ b/src/lsptoolshost/copilot.ts @@ -9,7 +9,6 @@ import { CopilotRelatedDocumentsReport, CopilotRelatedDocumentsRequest } from '. import { RoslynLanguageServer } from './roslynLanguageServer'; import { UriConverter } from './uriConverter'; import { TextDocumentIdentifier } from 'vscode-languageserver-protocol'; -import { languageServerOptions } from '../shared/options'; interface CopilotTrait { name: string; @@ -29,34 +28,22 @@ interface CopilotRelatedFilesProviderRegistration { ): vscode.Disposable; } -export function registerCopilotExtension(languageServer: RoslynLanguageServer, channel: vscode.OutputChannel) { - const isTraceLogLevel = - languageServerOptions.logLevel && - (languageServerOptions.logLevel === 'Trace' || languageServerOptions.logLevel === 'Debug'); - +export function registerCopilotExtension(languageServer: RoslynLanguageServer, channel: vscode.LogOutputChannel) { const ext = vscode.extensions.getExtension('github.copilot'); if (!ext) { - if (isTraceLogLevel) { - channel.appendLine( - 'GitHub Copilot extension not installed. Skip registeration of C# related files provider.' - ); - } + channel.debug('GitHub Copilot extension not installed. Skip registeration of C# related files provider.'); return; } ext.activate().then(() => { const relatedAPI = ext.exports as CopilotRelatedFilesProviderRegistration | undefined; if (!relatedAPI) { - if (isTraceLogLevel) { - channel.appendLine( - 'Incompatible GitHub Copilot extension installed. Skip registeration of C# related files provider.' - ); - } + channel.debug( + 'Incompatible GitHub Copilot extension installed. Skip registeration of C# related files provider.' + ); return; } - if (isTraceLogLevel) { - channel.appendLine('registration of C# related files provider for GitHub Copilot extension succeeded.'); - } + channel.debug('registration of C# related files provider for GitHub Copilot extension succeeded.'); const id = { extensionId: CSharpExtensionId, diff --git a/src/lsptoolshost/debugger.ts b/src/lsptoolshost/debugger.ts index f9fbcf57dc..c7d2a3bc0b 100644 --- a/src/lsptoolshost/debugger.ts +++ b/src/lsptoolshost/debugger.ts @@ -20,7 +20,7 @@ export function registerDebugger( languageServer: RoslynLanguageServer, languageServerEvents: RoslynLanguageServerEvents, platformInfo: PlatformInformation, - csharpOutputChannel: vscode.OutputChannel + csharpOutputChannel: vscode.LogOutputChannel ) { const workspaceInformationProvider: IWorkspaceDebugInformationProvider = new RoslynWorkspaceDebugInformationProvider(languageServer, csharpOutputChannel); diff --git a/src/lsptoolshost/fixAllCodeAction.ts b/src/lsptoolshost/fixAllCodeAction.ts index d4a510f946..429b8ad9e6 100644 --- a/src/lsptoolshost/fixAllCodeAction.ts +++ b/src/lsptoolshost/fixAllCodeAction.ts @@ -13,7 +13,7 @@ import { UriConverter } from './uriConverter'; export function registerCodeActionFixAllCommands( context: vscode.ExtensionContext, languageServer: RoslynLanguageServer, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ) { context.subscriptions.push( vscode.commands.registerCommand( @@ -26,7 +26,7 @@ export function registerCodeActionFixAllCommands( export async function getFixAllResponse( data: RoslynProtocol.CodeActionResolveData, languageServer: RoslynLanguageServer, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ) { if (!data.FixAllFlavors) { throw new Error(`FixAllFlavors is missing from data ${JSON.stringify(data)}`); @@ -64,7 +64,7 @@ export async function getFixAllResponse( const componentName = '[roslyn.client.fixAllCodeAction]'; const errorMessage = 'Failed to make a fix all edit for completion.'; outputChannel.show(); - outputChannel.appendLine(`${componentName} ${errorMessage}`); + outputChannel.error(`${componentName} ${errorMessage}`); throw new Error('Tried to insert multiple code action edits, but an error occurred.'); } } @@ -76,7 +76,7 @@ export async function getFixAllResponse( async function registerFixAllResolveCodeAction( languageServer: RoslynLanguageServer, codeActionData: RoslynProtocol.CodeActionResolveData, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ) { if (codeActionData) { const data = codeActionData; diff --git a/src/lsptoolshost/nestedCodeAction.ts b/src/lsptoolshost/nestedCodeAction.ts index 39bc22db73..633d6f19c0 100644 --- a/src/lsptoolshost/nestedCodeAction.ts +++ b/src/lsptoolshost/nestedCodeAction.ts @@ -13,7 +13,7 @@ import { getFixAllResponse } from './fixAllCodeAction'; export function registerNestedCodeActionCommands( context: vscode.ExtensionContext, languageServer: RoslynLanguageServer, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ) { context.subscriptions.push( vscode.commands.registerCommand( @@ -26,7 +26,7 @@ export function registerNestedCodeActionCommands( async function registerNestedResolveCodeAction( languageServer: RoslynLanguageServer, codeActionData: any, - outputChannel: vscode.OutputChannel + outputChannel: vscode.LogOutputChannel ): Promise { if (codeActionData) { const data = codeActionData; @@ -69,7 +69,7 @@ async function registerNestedResolveCodeAction( if (!response.edit) { outputChannel.show(); - outputChannel.appendLine(`Failed to make an edit for completion.`); + outputChannel.error(`Failed to make an edit for completion.`); throw new Error('Tried to retrieve a code action edit, but an error occurred.'); } @@ -81,7 +81,7 @@ async function registerNestedResolveCodeAction( const componentName = '[roslyn.client.nestedCodeAction]'; const errorMessage = 'Failed to make am edit for completion.'; outputChannel.show(); - outputChannel.appendLine(`${componentName} ${errorMessage}`); + outputChannel.error(`${componentName} ${errorMessage}`); throw new Error('Tried to insert code action edit, but an error occurred.'); } } diff --git a/src/lsptoolshost/restore.ts b/src/lsptoolshost/restore.ts index 4ea9f85994..5153becaa6 100644 --- a/src/lsptoolshost/restore.ts +++ b/src/lsptoolshost/restore.ts @@ -14,14 +14,16 @@ import { } from './roslynProtocol'; import path = require('path'); import { showErrorMessage } from '../shared/observers/utils/showMessage'; +import { getCSharpDevKit } from '../utils/getCSharpDevKit'; let _restoreInProgress = false; -export function registerRestoreCommands( - context: vscode.ExtensionContext, - languageServer: RoslynLanguageServer, - restoreChannel: vscode.OutputChannel -) { +export function registerRestoreCommands(context: vscode.ExtensionContext, languageServer: RoslynLanguageServer) { + if (getCSharpDevKit()) { + // We do not need to register restore commands if using C# devkit. + return; + } + const restoreChannel = vscode.window.createOutputChannel('.NET NuGet Restore'); context.subscriptions.push( vscode.commands.registerCommand('dotnet.restore.project', async (_request): Promise => { return chooseProjectAndRestore(languageServer, restoreChannel); diff --git a/src/lsptoolshost/roslynLanguageServer.ts b/src/lsptoolshost/roslynLanguageServer.ts index 817321b9d7..9e7adf6b2a 100644 --- a/src/lsptoolshost/roslynLanguageServer.ts +++ b/src/lsptoolshost/roslynLanguageServer.ts @@ -77,7 +77,7 @@ import { import { registerSourceGeneratedFilesContentProvider } from './sourceGeneratedFilesContentProvider'; import { registerMiscellaneousFileNotifier } from './miscellaneousFileNotifier'; -let _channel: vscode.OutputChannel; +let _channel: vscode.LogOutputChannel; let _traceChannel: vscode.OutputChannel; // Flag indicating if C# Devkit was installed the last time we activated. @@ -164,11 +164,25 @@ export class RoslynLanguageServer { // setTrace only works after the client is already running. this._languageClient.onDidChangeState(async (state) => { if (state.newState === State.Running) { - const languageClientTraceLevel = RoslynLanguageServer.GetTraceLevel(languageServerOptions.logLevel); - - await this._languageClient.setTrace(languageClientTraceLevel); + await this.updateLogLevel(); } }); + // Register for changes to the log level. + _channel.onDidChangeLogLevel(async () => { + await this.updateLogLevel(); + }); + } + + private async updateLogLevel(): Promise { + if (this._languageClient.state === State.Running) { + const languageClientTraceLevel = RoslynLanguageServer.GetTraceLevel(_channel.logLevel); + // Update the server's log level. + await this.sendNotification('roslyn/updateLogLevel', { + logLevel: RoslynLanguageServer.GetServerLogLevel(_channel.logLevel), + }); + // Update the trace level that the client uses to log trace messages. + await this._languageClient.setTrace(languageClientTraceLevel); + } } private registerServerStateChanged() { @@ -467,7 +481,7 @@ export class RoslynLanguageServer { } if (!(error instanceof vscode.CancellationError)) { - _channel.appendLine(`Error making ${request} request: ${error.message}`); + _channel.error(`Error making ${request} request`, error); } return error; } @@ -565,7 +579,7 @@ export class RoslynLanguageServer { const dotnetInfo = await hostExecutableResolver.getHostExecutableInfo(); const dotnetExecutablePath = dotnetInfo.path; - _channel.appendLine('Dotnet path: ' + dotnetExecutablePath); + _channel.info('Dotnet path: ' + dotnetExecutablePath); let args: string[] = []; @@ -573,7 +587,10 @@ export class RoslynLanguageServer { args.push('--debug'); } - const logLevel = languageServerOptions.logLevel; + // Get the initial log level from the channel. + // Changes to the channel log level will be picked up by the server after + // LSP finishes initializing and we're able to pick up the new value. + const logLevel = this.GetServerLogLevel(_channel.logLevel); if (logLevel) { args.push('--logLevel', logLevel); } @@ -602,14 +619,14 @@ export class RoslynLanguageServer { csharpDevkitIntelliCodeExtensionId ); if (csharpDevkitIntelliCodeExtension) { - _channel.appendLine('Activating C# + C# Dev Kit + C# IntelliCode...'); + _channel.info('Activating C# + C# Dev Kit + C# IntelliCode...'); const csharpDevkitIntelliCodeArgs = await this.getCSharpDevkitIntelliCodeExportArgs( csharpDevkitIntelliCodeExtension, context ); args = args.concat(csharpDevkitIntelliCodeArgs); } else { - _channel.appendLine('Activating C# + C# Dev Kit...'); + _channel.info('Activating C# + C# Dev Kit...'); } // Set command enablement as soon as we know devkit is available. @@ -621,7 +638,7 @@ export class RoslynLanguageServer { await this.setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension); } else { // C# Dev Kit is not installed - continue C#-only activation. - _channel.appendLine('Activating C# standalone...'); + _channel.info('Activating C# standalone...'); // Set command enablement to use roslyn standalone commands. await vscode.commands.executeCommand('setContext', 'dotnet.server.activationContext', 'Roslyn'); @@ -632,11 +649,7 @@ export class RoslynLanguageServer { args.push('--extension', extensionPath); } - const isTraceLogLevel = logLevel && [Trace.Messages, Trace.Verbose].includes(this.GetTraceLevel(logLevel)); - - if (isTraceLogLevel) { - _channel.appendLine(`Starting server at ${serverPath}`); - } + _channel.debug(`Starting server at ${serverPath}`); // shouldn't this arg only be set if it's running with CSDevKit? args.push('--telemetryLevel', telemetryReporter.telemetryLevel); @@ -647,9 +660,7 @@ export class RoslynLanguageServer { if (!languageServerOptions.useServerGC) { // The server by default uses serverGC, if the user opts out we need to set the environment variable to disable it. env.DOTNET_gcServer = '0'; - if (isTraceLogLevel) { - _channel.appendLine('ServerGC disabled'); - } + _channel.debug('ServerGC disabled'); } let childProcess: cp.ChildProcessWithoutNullStreams; @@ -663,16 +674,12 @@ export class RoslynLanguageServer { // If we were given a path to a dll, launch that via dotnet. const argsWithPath = [serverPath].concat(args); - if (logLevel && [Trace.Messages, Trace.Verbose].includes(this.GetTraceLevel(logLevel))) { - _channel.appendLine(`Server arguments ${argsWithPath.join(' ')}`); - } + _channel.debug(`Server arguments ${argsWithPath.join(' ')}`); childProcess = cp.spawn(dotnetExecutablePath, argsWithPath, cpOptions); } else { // Otherwise assume we were given a path to an executable. - if (logLevel && [Trace.Messages, Trace.Verbose].includes(this.GetTraceLevel(logLevel))) { - _channel.appendLine(`Server arguments ${args.join(' ')}`); - } + _channel.debug(`Server arguments ${args.join(' ')}`); childProcess = cp.spawn(serverPath, args, cpOptions); } @@ -680,14 +687,14 @@ export class RoslynLanguageServer { // Record the stdout and stderr streams from the server process. childProcess.stdout.on('data', (data: { toString: (arg0: any) => any }) => { const result: string = isString(data) ? data : data.toString(RoslynLanguageServer.encoding); - _channel.append('[stdout] ' + result); + _channel.info('[stdout] ' + result); }); childProcess.stderr.on('data', (data: { toString: (arg0: any) => any }) => { const result: string = isString(data) ? data : data.toString(RoslynLanguageServer.encoding); - _channel.append('[stderr] ' + result); + _channel.error('[stderr] ' + result); }); childProcess.on('exit', (code) => { - _channel.appendLine(`Language server process exited with ${code}`); + _channel.info(`Language server process exited with ${code}`); }); // Timeout promise used to time out the connection process if it takes too long. @@ -707,14 +714,14 @@ export class RoslynLanguageServer { // The server process will create the named pipe used for communication. Wait for it to be created, // and listen for the server to pass back the connection information via stdout. const namedPipePromise = new Promise((resolve) => { - _channel.appendLine('waiting for named pipe information from server...'); + _channel.debug('waiting for named pipe information from server...'); childProcess.stdout.on('data', (data: { toString: (arg0: any) => any }) => { const result: string = isString(data) ? data : data.toString(RoslynLanguageServer.encoding); // Use the regular expression to find all JSON lines const jsonLines = result.match(RoslynLanguageServer.namedPipeKeyRegex); if (jsonLines) { const transmittedPipeNameInfo: NamedPipeInformation = JSON.parse(jsonLines[0]); - _channel.appendLine('received named pipe information from server'); + _channel.info('received named pipe information from server'); resolve(transmittedPipeNameInfo); } }); @@ -722,9 +729,9 @@ export class RoslynLanguageServer { const socketPromise = namedPipePromise.then(async (pipeConnectionInfo) => { return new Promise((resolve, reject) => { - _channel.appendLine('attempting to connect client to server...'); + _channel.debug('attempting to connect client to server...'); const socket = net.createConnection(pipeConnectionInfo.pipeName, () => { - _channel.appendLine('client has connected to server'); + _channel.info('client has connected to server'); resolve(socket); }); @@ -879,7 +886,7 @@ export class RoslynLanguageServer { if (csharpDevkitExtension && !_wasActivatedWithCSharpDevkit) { // We previously started without C# Dev Kit and its now installed. // Offer a prompt to restart the server to use C# Dev Kit. - _channel.appendLine(`Detected new installation of ${csharpDevkitExtensionId}`); + _channel.info(`Detected new installation of ${csharpDevkitExtensionId}`); const message = `Detected installation of ${csharpDevkitExtensionId}. Would you like to relaunch the language server for added features?`; showInformationMessage(vscode, message, title); } else { @@ -942,10 +949,9 @@ export class RoslynLanguageServer { ]; return csharpIntelliCodeArgs; } catch (e) { - _channel.appendLine(`Activation of ${csharpDevkitIntelliCodeExtensionId} failed`); - _channel.appendLine(e instanceof Error ? e.message : (e as string)); + _channel.error(`Activation of ${csharpDevkitIntelliCodeExtensionId} failed`, e); if (e instanceof Error && e.stack) { - _channel.appendLine(e.stack); + _channel.info(e.stack); } const stateKey = 'disableIntellicodeFailedPopup'; @@ -991,26 +997,44 @@ export class RoslynLanguageServer { await exports.setupTelemetryEnvironmentAsync(env); } - private static GetTraceLevel(logLevel: string): Trace { + /** + * Returns the C# Microsoft.Extensions.Logging.LogLevel enum string value + * corresponding to the given vscode.LogLevel. + */ + private static GetServerLogLevel(logLevel: vscode.LogLevel): string { + switch (logLevel) { + case vscode.LogLevel.Trace: + return 'Trace'; + case vscode.LogLevel.Debug: + return 'Debug'; + case vscode.LogLevel.Info: + return 'Information'; + case vscode.LogLevel.Warning: + return 'Warning'; + case vscode.LogLevel.Error: + return 'Error'; + case vscode.LogLevel.Off: + return 'None'; + default: + throw new Error(`Invalid log level ${logLevel}`); + } + } + + private static GetTraceLevel(logLevel: vscode.LogLevel): Trace { switch (logLevel) { - case 'Trace': + case vscode.LogLevel.Trace: return Trace.Verbose; - case 'Debug': + case vscode.LogLevel.Debug: return Trace.Messages; - case 'Information': + case vscode.LogLevel.Info: return Trace.Off; - case 'Warning': + case vscode.LogLevel.Warning: return Trace.Off; - case 'Error': + case vscode.LogLevel.Error: return Trace.Off; - case 'Critical': - return Trace.Off; - case 'None': + case vscode.LogLevel.Off: return Trace.Off; default: - _channel.appendLine( - `Invalid log level ${logLevel}, server will not start. Please set the 'dotnet.server.trace' configuration to a valid value` - ); throw new Error(`Invalid log level ${logLevel}`); } } @@ -1038,15 +1062,14 @@ export async function activateRoslynLanguageServer( context: vscode.ExtensionContext, platformInfo: PlatformInformation, optionObservable: Observable, - outputChannel: vscode.OutputChannel, - dotnetTestChannel: vscode.OutputChannel, - dotnetChannel: vscode.OutputChannel, + outputChannel: vscode.LogOutputChannel, reporter: TelemetryReporter, languageServerEvents: RoslynLanguageServerEvents ): Promise { // Create a channel for outputting general logs from the language server. _channel = outputChannel; // Create a separate channel for outputting trace logs - these are incredibly verbose and make other logs very difficult to see. + // The trace channel verbosity is controlled by the _channel verbosity. _traceChannel = vscode.window.createOutputChannel('C# LSP Trace Logs'); const hostExecutableResolver = new DotnetRuntimeExtensionResolver( @@ -1077,12 +1100,12 @@ export async function activateRoslynLanguageServer( registerRazorCommands(context, languageServer); - registerUnitTestingCommands(context, languageServer, dotnetTestChannel); + registerUnitTestingCommands(context, languageServer); // Register any needed debugger components that need to communicate with the language server. registerDebugger(context, languageServer, languageServerEvents, platformInfo, _channel); - registerRestoreCommands(context, languageServer, dotnetChannel); + registerRestoreCommands(context, languageServer); registerSourceGeneratedFilesContentProvider(context, languageServer); @@ -1094,19 +1117,19 @@ export async function activateRoslynLanguageServer( const extensionsFromPackageJson = vscode.extensions.all.flatMap((extension) => { let loadPaths = extension.packageJSON.contributes?.['csharpExtensionLoadPaths']; if (loadPaths === undefined || loadPaths === null) { - _traceChannel.appendLine(`Extension ${extension.id} does not contribute csharpExtensionLoadPaths`); + _channel.debug(`Extension ${extension.id} does not contribute csharpExtensionLoadPaths`); return []; } if (!Array.isArray(loadPaths) || loadPaths.some((loadPath) => typeof loadPath !== 'string')) { - _channel.appendLine( + _channel.warn( `Extension ${extension.id} has invalid csharpExtensionLoadPaths. Expected string array, found ${loadPaths}` ); return []; } loadPaths = loadPaths.map((loadPath) => path.join(extension.extensionPath, loadPath)); - _traceChannel.appendLine(`Extension ${extension.id} contributes csharpExtensionLoadPaths: ${loadPaths}`); + _channel.trace(`Extension ${extension.id} contributes csharpExtensionLoadPaths: ${loadPaths}`); return loadPaths; }); const extensionsFromOptions = languageServerOptions.extensionsPaths ?? []; diff --git a/src/lsptoolshost/roslynWorkspaceDebugConfigurationProvider.ts b/src/lsptoolshost/roslynWorkspaceDebugConfigurationProvider.ts index 9e820c6568..2b5666c835 100644 --- a/src/lsptoolshost/roslynWorkspaceDebugConfigurationProvider.ts +++ b/src/lsptoolshost/roslynWorkspaceDebugConfigurationProvider.ts @@ -19,7 +19,7 @@ import { import { UriConverter } from './uriConverter'; export class RoslynWorkspaceDebugInformationProvider implements IWorkspaceDebugInformationProvider { - constructor(private server: RoslynLanguageServer, private outputChannel: vscode.OutputChannel) {} + constructor(private server: RoslynLanguageServer, private outputChannel: vscode.LogOutputChannel) {} public async getWorkspaceDebugInformation( workspaceFolder: vscode.Uri @@ -43,7 +43,7 @@ export class RoslynWorkspaceDebugInformationProvider implements IWorkspaceDebugI // Server errors are already logged by the language client, but its totally possible // that we fail because the server is restarting or a process got killed, etc. // Catch the error and log to the correct output (instead of going to the extension host output). - this.outputChannel.appendLine(`Failed to get debug configuration: ${e}`); + this.outputChannel.error(`Failed to get debug configuration`, e); return; } diff --git a/src/lsptoolshost/unitTesting.ts b/src/lsptoolshost/unitTesting.ts index 27da8f892e..956be85fcb 100644 --- a/src/lsptoolshost/unitTesting.ts +++ b/src/lsptoolshost/unitTesting.ts @@ -12,12 +12,14 @@ import { RunTestsParams, RunTestsPartialResult, RunTestsRequest, TestProgress } import { commonOptions } from '../shared/options'; import { UriConverter } from './uriConverter'; import { showErrorMessage } from '../shared/observers/utils/showMessage'; +import { getCSharpDevKit } from '../utils/getCSharpDevKit'; -export function registerUnitTestingCommands( - context: vscode.ExtensionContext, - languageServer: RoslynLanguageServer, - dotnetTestChannel: vscode.OutputChannel -) { +export function registerUnitTestingCommands(context: vscode.ExtensionContext, languageServer: RoslynLanguageServer) { + if (getCSharpDevKit()) { + // If using C# devkit, we don't need to register any test commands. + return; + } + const dotnetTestChannel = vscode.window.createOutputChannel('.NET Test Log'); context.subscriptions.push( vscode.commands.registerCommand( 'dotnet.test.run', diff --git a/src/main.ts b/src/main.ts index 3e560dc323..1f7eaa7f8e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -65,9 +65,7 @@ export async function activate( // ensure it gets properly disposed. Upon disposal the events will be flushed. context.subscriptions.push(reporter); - const dotnetTestChannel = vscode.window.createOutputChannel('.NET Test Log'); - const dotnetChannel = vscode.window.createOutputChannel('.NET NuGet Restore'); - const csharpChannel = vscode.window.createOutputChannel('C#'); + const csharpChannel = vscode.window.createOutputChannel('C#', { log: true }); const csharpchannelObserver = new CsharpChannelObserver(csharpChannel); const csharpLogObserver = new CsharpLoggerObserver(csharpChannel); eventStream.subscribe(csharpchannelObserver.post); @@ -141,13 +139,13 @@ export async function activate( platformInfo, optionStream, csharpChannel, - dotnetTestChannel, - dotnetChannel, reporter, roslynLanguageServerEvents ); } else { // activate language services + const dotnetTestChannel = vscode.window.createOutputChannel('.NET Test Log'); + const dotnetChannel = vscode.window.createOutputChannel('.NET NuGet Restore'); omnisharpLangServicePromise = activateOmniSharpLanguageServer( context, platformInfo, diff --git a/src/shared/options.ts b/src/shared/options.ts index 469c01124c..3ed6a19f51 100644 --- a/src/shared/options.ts +++ b/src/shared/options.ts @@ -69,7 +69,6 @@ export interface OmnisharpServerOptions { } export interface LanguageServerOptions { - readonly logLevel: string; readonly documentSelector: DocumentSelector; readonly extensionsPaths: string[] | null; readonly preferCSharpExtension: boolean; @@ -379,9 +378,6 @@ class OmnisharpOptionsImpl implements OmnisharpServerOptions { } class LanguageServerOptionsImpl implements LanguageServerOptions { - public get logLevel() { - return readOption('dotnet.server.trace', 'Information'); - } public get documentSelector() { return readOption('dotnet.server.documentSelector', ['csharp']); } @@ -511,7 +507,6 @@ export const OmnisharpOptionsThatTriggerReload: ReadonlyArray = [ - 'logLevel', 'documentSelector', 'preferCSharpExtension', 'componentPaths', diff --git a/src/shared/reportIssue.ts b/src/shared/reportIssue.ts index 16345aaf51..a818423b15 100644 --- a/src/shared/reportIssue.ts +++ b/src/shared/reportIssue.ts @@ -125,14 +125,14 @@ function getLogInfo(useOmnisharp: boolean): string { return ` ### C# log ###
Post the output from Output-->C# here
### C# LSP Trace Logs ### -
Post the output from Output-->C# LSP Trace Logs here. Requires \`dotnet.server.trace\` to be set to \`Trace\`
`; +
Post the output from Output-->C# LSP Trace Logs here. Requires the \`C#\` output window log level to be set to \`Trace\`
`; } } diff --git a/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/devkit_slnWithCsproj.code-workspace b/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/devkit_slnWithCsproj.code-workspace index cb1af05bdb..e045c46705 100644 --- a/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/devkit_slnWithCsproj.code-workspace +++ b/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/devkit_slnWithCsproj.code-workspace @@ -6,7 +6,6 @@ ], "settings": { "dotnet.defaultSolution": "b_SecondInOrder_SlnFile.sln", - "dotnet.server.trace": "Trace", "dotnet.server.useOmnisharp": false, "dotnet.preferCSharpExtension": false, } diff --git a/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/slnWithCsproj.code-workspace b/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/slnWithCsproj.code-workspace index 6da609d8b5..06c4a6bea6 100644 --- a/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/slnWithCsproj.code-workspace +++ b/test/lsptoolshost/integrationTests/testAssets/slnWithCsproj/.vscode/slnWithCsproj.code-workspace @@ -6,7 +6,6 @@ ], "settings": { "dotnet.defaultSolution": "b_SecondInOrder_SlnFile.sln", - "dotnet.server.trace": "Trace", "dotnet.server.useOmnisharp": false, "dotnet.preferCSharpExtension": true, } diff --git a/test/omnisharp/omnisharpIntegrationTests/testAssets/slnWithCsproj/.vscode/lsp_tools_host_slnWithCsproj.code-workspace b/test/omnisharp/omnisharpIntegrationTests/testAssets/slnWithCsproj/.vscode/lsp_tools_host_slnWithCsproj.code-workspace index 46ef8b6ed9..767f2bb639 100644 --- a/test/omnisharp/omnisharpIntegrationTests/testAssets/slnWithCsproj/.vscode/lsp_tools_host_slnWithCsproj.code-workspace +++ b/test/omnisharp/omnisharpIntegrationTests/testAssets/slnWithCsproj/.vscode/lsp_tools_host_slnWithCsproj.code-workspace @@ -6,7 +6,6 @@ ], "settings": { "dotnet.defaultSolution": "b_SecondInOrder_SlnFile.sln", - "dotnet.server.trace": "Trace", "dotnet.server.useOmnisharp": false, "omnisharp.enableLspDriver": false, "dotnet.preferCSharpExtension": true, diff --git a/test/razor/razorIntegrationTests/testAssets/BasicRazorApp2_1/.vscode/BasicRazorApp2_1.code-workspace b/test/razor/razorIntegrationTests/testAssets/BasicRazorApp2_1/.vscode/BasicRazorApp2_1.code-workspace index 805d62e7e1..7df1142a26 100644 --- a/test/razor/razorIntegrationTests/testAssets/BasicRazorApp2_1/.vscode/BasicRazorApp2_1.code-workspace +++ b/test/razor/razorIntegrationTests/testAssets/BasicRazorApp2_1/.vscode/BasicRazorApp2_1.code-workspace @@ -6,7 +6,6 @@ ], "settings": { "dotnet.defaultSolution": "BasicRazorApp2_1.sln", - "dotnet.server.trace": "Trace", "dotnet.server.useOmnisharp": false, "omnisharp.enableLspDriver": false, "razor.server.trace": "Trace", diff --git a/test/vscodeLauncher.ts b/test/vscodeLauncher.ts index 13e6798aad..76a63d0314 100644 --- a/test/vscodeLauncher.ts +++ b/test/vscodeLauncher.ts @@ -54,7 +54,7 @@ export async function prepareVSCodeAndExecuteTests( extensionDevelopmentPath: extensionDevelopmentPath, extensionTestsPath: extensionTestsPath, // Launch with info logging as anything else is way too verbose and will hide test results. - launchArgs: [workspacePath, '-n', '--log', 'info', '--user-data-dir', userDataDir], + launchArgs: [workspacePath, '-n', '--user-data-dir', userDataDir, '--log', 'ms-dotnettools.csharp:trace'], extensionTestsEnv: env, });