From 6c5b5f8a8bb1c4fd5f716ae7d8d0a7e1ef6ae016 Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Wed, 8 Oct 2025 17:54:22 +0000 Subject: [PATCH 01/36] Localization result of c28be783482a70eaeafdfd5c1bc49cf1355d570c. --- package.nls.es.json | 4 ++-- package.nls.fr.json | 4 ++-- package.nls.ja.json | 4 ++-- package.nls.ko.json | 4 ++-- package.nls.pt-br.json | 4 ++-- package.nls.ru.json | 4 ++-- package.nls.tr.json | 4 ++-- package.nls.zh-cn.json | 4 ++-- package.nls.zh-tw.json | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.nls.es.json b/package.nls.es.json index 6d2c249d7e..4aa159049c 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita la experiencia de vista previa de \"programas basados en archivos\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar información de comentarios cuando se muestra el símbolo.", "configuration.dotnet.server.componentPaths": "Permite invalidar la ruta de acceso de carpeta para los componentes integrados del servidor de lenguaje (por ejemplo, invalidar la ruta de acceso .roslynDevKit en el directorio de extensión para usar componentes compilados localmente).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Invalida la ruta de acceso de la carpeta para el componente Razor Dev Kit del servidor de lenguaje", + "configuration.dotnet.server.componentPaths.razorExtension": "Invalida la ruta de acceso de la carpeta para el componente de extensión Razor del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynCopilot": "Invalida la ruta de acceso de la carpeta para el componente .roslynCopilot del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynDevKit": "Invalida la ruta de acceso de la carpeta para el componente .roslynDevKit del servidor de lenguaje.", "configuration.dotnet.server.componentPaths.xamlTools": "Invalida la ruta de acceso de la carpeta para el componente .xamlTools del servidor de lenguaje.", diff --git a/package.nls.fr.json b/package.nls.fr.json index c23e5ae650..d9f8a18e40 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Active l’expérience de prévisualisation des « programmes basés sur des fichiers » (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Afficher les informations sur les remarques lors de l’affichage du symbole.", "configuration.dotnet.server.componentPaths": "Permet de remplacer le chemin d’accès au dossier des composants intégrés du serveur de langage (par exemple, remplacer le chemin d’accès .roslynDevKit dans le répertoire d’extension pour utiliser les composants générés localement).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Remplace le chemin d’accès du dossier pour le composant du Kit de développement Razor du serveur de langage", + "configuration.dotnet.server.componentPaths.razorExtension": "Remplace le chemin d’accès du dossier pour le composant d’extension Razor du serveur de langage", "configuration.dotnet.server.componentPaths.roslynCopilot": "Remplace le chemin d’accès du dossier pour le composant .roslynCopilot du serveur de langage", "configuration.dotnet.server.componentPaths.roslynDevKit": "Remplace le chemin d’accès au dossier du composant .roslynDevKit du serveur de langage", "configuration.dotnet.server.componentPaths.xamlTools": "Remplace le chemin d’accès du dossier pour le composant .xamlTools du serveur de langage", diff --git a/package.nls.ja.json b/package.nls.ja.json index f54264d384..661b43dd1a 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "プレビューの \"ファイル ベースのプログラム\" (dotnet run app.cs) エクスペリエンスを有効にします。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "シンボルを表示するときに注釈情報を表示します。", "configuration.dotnet.server.componentPaths": "言語サーバーの組み込みコンポーネントのフォルダー パスをオーバーライドできます (たとえば、ローカルにビルドされたコンポーネントを使用するように拡張ディレクトリの .roslynDevKit パスをオーバーライドする)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "言語サーバーの Razor Dev Kit コンポーネントのフォルダー パスを上書きします", + "configuration.dotnet.server.componentPaths.razorExtension": "言語サーバーの Razor 拡張機能コンポーネントのフォルダー パスを上書きします", "configuration.dotnet.server.componentPaths.roslynCopilot": "言語サーバーの .roslynCopilot コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.roslynDevKit": "言語サーバーの .roslynDevKit コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.xamlTools": "言語サーバーの .xamlTools コンポーネントのフォルダー パスをオーバーライドします", diff --git a/package.nls.ko.json b/package.nls.ko.json index ff4fa483c0..fd74ce02cc 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "미리 보기 \"파일 기반 프로그램\"(dotnet run app.cs) 환경을 활성화합니다.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "기호를 표시할 때 설명 정보를 표시합니다.", "configuration.dotnet.server.componentPaths": "언어 서버의 기본 제공 구성 요소에 대한 폴더 경로를 재정의할 수 있습니다(예: 로컬로 빌드된 구성 요소를 사용하도록 확장 디렉터리의 .roslynDevKit 경로 재정의).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "언어 서버의 Razor Dev Kit 구성 요소에 대한 폴더 경로를 재정의합니다.", + "configuration.dotnet.server.componentPaths.razorExtension": "언어 서버의 Razor 확장 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.roslynCopilot": "언어 서버의 .roslynCopilot 구성 요소에 대한 폴더 경로를 덮어씁니다.", "configuration.dotnet.server.componentPaths.roslynDevKit": "언어 서버의 .roslynDevKit 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.xamlTools": "언어 서버의 .xamlTools 구성 요소에 대한 폴더 경로를 재정의합니다.", diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json index 3732b1d020..4eb622bbed 100644 --- a/package.nls.pt-br.json +++ b/package.nls.pt-br.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita a experiência de prévia \"programas baseados em arquivo\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar informações de comentários ao exibir o símbolo.", "configuration.dotnet.server.componentPaths": "Permite substituir o caminho da pasta para componentes internos do servidor de linguagem (por exemplo, substituir o caminho .roslynDevKit no diretório de extensão para usar componentes compilados localmente)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Substitui o caminho da pasta para o componente do Kit de Desenvolvimento do Razor do servidor de linguagem", + "configuration.dotnet.server.componentPaths.razorExtension": "Substitui o caminho da pasta para o componente de extensão Razor do servidor de linguagem", "configuration.dotnet.server.componentPaths.roslynCopilot": "Substitui o caminho da pasta para o componente .roslynCopilot do servidor de idiomas", "configuration.dotnet.server.componentPaths.roslynDevKit": "Substitui o caminho da pasta para o componente .roslynDevKit do servidor de linguagem", "configuration.dotnet.server.componentPaths.xamlTools": "Substitui o caminho da pasta para o componente .xamlTools do servidor de linguagem", diff --git a/package.nls.ru.json b/package.nls.ru.json index f8f6a2f242..1a7018c80a 100644 --- a/package.nls.ru.json +++ b/package.nls.ru.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Включает предварительный просмотр \"программ на основе файлов\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Показывать примечания при отображении символа.", "configuration.dotnet.server.componentPaths": "Позволяет переопределить путь к папке для встроенных компонентов языкового сервера (например, переопределить путь .roslynDevKit в каталоге расширения для использования локально созданных компонентов).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Переопределяет путь к папке для компонента Razor Dev Kit языкового сервера", + "configuration.dotnet.server.componentPaths.razorExtension": "Переопределяет путь к папке для компонента расширения Razor языкового сервера", "configuration.dotnet.server.componentPaths.roslynCopilot": "Переопределяет путь к папке для компонента .roslynCopilot языкового сервера", "configuration.dotnet.server.componentPaths.roslynDevKit": "Переопределяет путь к папке для компонента .roslynDevKit языкового сервера.", "configuration.dotnet.server.componentPaths.xamlTools": "Переопределяет путь к папке для компонента .xamlTools языкового сервера.", diff --git a/package.nls.tr.json b/package.nls.tr.json index a411cd7067..99ac9f5a44 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "\"Dosya tabanlı programlar\" (dotnet run app.cs) önizleme deneyimini etkinleştirir.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Simge görüntülendiğinde açıklama bilgilerini göster.", "configuration.dotnet.server.componentPaths": "Dil sunucusundaki yerleşik bileşenlerin klasör yolunu geçersiz kılmaya olanak tanır (örneğin, yerel olarak oluşturulan bileşenleri kullanmak için uzantı dizinindeki .roslynDevKit yolunu geçersiz kılın)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Dil sunucusundaki Razor Geliştirme Paketi bileşeninin klasör yolunu geçersiz kılar", + "configuration.dotnet.server.componentPaths.razorExtension": "Dil sunucusundaki Razor uzantısı bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynCopilot": "Dil sunucusunun .roslynCopilot bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynDevKit": "Dil sunucusundaki .roslynDevKit bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.xamlTools": "Dil sunucusundaki .xamlTools bileşeninin klasör yolunu geçersiz kılar", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 885fa2f58e..419f5ac4d1 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "启用预览“基于文件的程序”(dotnet run app.cs)体验。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "显示符号时显示备注信息。", "configuration.dotnet.server.componentPaths": "允许替代语言服务器内置组件的文件夹路径(例如,替代扩展目录中的 .roslynDevKit 路径以使用本地生成的组件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "替代语言服务器的 Razor 开发工具包组件的文件夹路径", + "configuration.dotnet.server.componentPaths.razorExtension": "替代语言服务器的 Razor 扩展组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynCopilot": "替代语言服务器的 .roslynCopilot 组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynDevKit": "替代语言服务器的 .roslynDevKit 组件的文件夹路径", "configuration.dotnet.server.componentPaths.xamlTools": "替代语言服务器的 .xamlTools 组件的文件夹路径", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 9cda6e9072..6890d5296a 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "啟用「檔案型程式」 (dotnet run app.cs) 的預覽體驗。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "顯示符號時顯示備註資訊。", "configuration.dotnet.server.componentPaths": "允許覆寫語言伺服器內建元件的資料夾路徑 (例如,覆寫延伸模組目錄中的 .roslynDevKit 路徑,以使用本機建置的元件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "覆寫語言伺服器 Razor 開發套件元件的資料夾路徑", + "configuration.dotnet.server.componentPaths.razorExtension": "覆寫語言伺服器 Razor 延伸模組元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynCopilot": "覆寫語言伺服器 .roslynCopilot 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynDevKit": "覆寫語言伺服器 .roslynDevKit 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.xamlTools": "覆寫語言伺服器 .xamlTools 元件的資料夾路徑", From 31b4b9fab2c6a347bd9dc8f4e44500095944c23e Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Wed, 8 Oct 2025 18:12:35 +0000 Subject: [PATCH 02/36] Localization result of fd32f01ae7d984a1ba58ecf57a670496754fa685. --- package.nls.es.json | 4 ++-- package.nls.fr.json | 4 ++-- package.nls.ja.json | 4 ++-- package.nls.ko.json | 4 ++-- package.nls.pt-br.json | 4 ++-- package.nls.ru.json | 4 ++-- package.nls.tr.json | 4 ++-- package.nls.zh-cn.json | 4 ++-- package.nls.zh-tw.json | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.nls.es.json b/package.nls.es.json index 6d2c249d7e..4aa159049c 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita la experiencia de vista previa de \"programas basados en archivos\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar información de comentarios cuando se muestra el símbolo.", "configuration.dotnet.server.componentPaths": "Permite invalidar la ruta de acceso de carpeta para los componentes integrados del servidor de lenguaje (por ejemplo, invalidar la ruta de acceso .roslynDevKit en el directorio de extensión para usar componentes compilados localmente).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Invalida la ruta de acceso de la carpeta para el componente Razor Dev Kit del servidor de lenguaje", + "configuration.dotnet.server.componentPaths.razorExtension": "Invalida la ruta de acceso de la carpeta para el componente de extensión Razor del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynCopilot": "Invalida la ruta de acceso de la carpeta para el componente .roslynCopilot del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynDevKit": "Invalida la ruta de acceso de la carpeta para el componente .roslynDevKit del servidor de lenguaje.", "configuration.dotnet.server.componentPaths.xamlTools": "Invalida la ruta de acceso de la carpeta para el componente .xamlTools del servidor de lenguaje.", diff --git a/package.nls.fr.json b/package.nls.fr.json index c23e5ae650..d9f8a18e40 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Active l’expérience de prévisualisation des « programmes basés sur des fichiers » (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Afficher les informations sur les remarques lors de l’affichage du symbole.", "configuration.dotnet.server.componentPaths": "Permet de remplacer le chemin d’accès au dossier des composants intégrés du serveur de langage (par exemple, remplacer le chemin d’accès .roslynDevKit dans le répertoire d’extension pour utiliser les composants générés localement).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Remplace le chemin d’accès du dossier pour le composant du Kit de développement Razor du serveur de langage", + "configuration.dotnet.server.componentPaths.razorExtension": "Remplace le chemin d’accès du dossier pour le composant d’extension Razor du serveur de langage", "configuration.dotnet.server.componentPaths.roslynCopilot": "Remplace le chemin d’accès du dossier pour le composant .roslynCopilot du serveur de langage", "configuration.dotnet.server.componentPaths.roslynDevKit": "Remplace le chemin d’accès au dossier du composant .roslynDevKit du serveur de langage", "configuration.dotnet.server.componentPaths.xamlTools": "Remplace le chemin d’accès du dossier pour le composant .xamlTools du serveur de langage", diff --git a/package.nls.ja.json b/package.nls.ja.json index f54264d384..661b43dd1a 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "プレビューの \"ファイル ベースのプログラム\" (dotnet run app.cs) エクスペリエンスを有効にします。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "シンボルを表示するときに注釈情報を表示します。", "configuration.dotnet.server.componentPaths": "言語サーバーの組み込みコンポーネントのフォルダー パスをオーバーライドできます (たとえば、ローカルにビルドされたコンポーネントを使用するように拡張ディレクトリの .roslynDevKit パスをオーバーライドする)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "言語サーバーの Razor Dev Kit コンポーネントのフォルダー パスを上書きします", + "configuration.dotnet.server.componentPaths.razorExtension": "言語サーバーの Razor 拡張機能コンポーネントのフォルダー パスを上書きします", "configuration.dotnet.server.componentPaths.roslynCopilot": "言語サーバーの .roslynCopilot コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.roslynDevKit": "言語サーバーの .roslynDevKit コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.xamlTools": "言語サーバーの .xamlTools コンポーネントのフォルダー パスをオーバーライドします", diff --git a/package.nls.ko.json b/package.nls.ko.json index ff4fa483c0..fd74ce02cc 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "미리 보기 \"파일 기반 프로그램\"(dotnet run app.cs) 환경을 활성화합니다.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "기호를 표시할 때 설명 정보를 표시합니다.", "configuration.dotnet.server.componentPaths": "언어 서버의 기본 제공 구성 요소에 대한 폴더 경로를 재정의할 수 있습니다(예: 로컬로 빌드된 구성 요소를 사용하도록 확장 디렉터리의 .roslynDevKit 경로 재정의).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "언어 서버의 Razor Dev Kit 구성 요소에 대한 폴더 경로를 재정의합니다.", + "configuration.dotnet.server.componentPaths.razorExtension": "언어 서버의 Razor 확장 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.roslynCopilot": "언어 서버의 .roslynCopilot 구성 요소에 대한 폴더 경로를 덮어씁니다.", "configuration.dotnet.server.componentPaths.roslynDevKit": "언어 서버의 .roslynDevKit 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.xamlTools": "언어 서버의 .xamlTools 구성 요소에 대한 폴더 경로를 재정의합니다.", diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json index 3732b1d020..4eb622bbed 100644 --- a/package.nls.pt-br.json +++ b/package.nls.pt-br.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita a experiência de prévia \"programas baseados em arquivo\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar informações de comentários ao exibir o símbolo.", "configuration.dotnet.server.componentPaths": "Permite substituir o caminho da pasta para componentes internos do servidor de linguagem (por exemplo, substituir o caminho .roslynDevKit no diretório de extensão para usar componentes compilados localmente)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Substitui o caminho da pasta para o componente do Kit de Desenvolvimento do Razor do servidor de linguagem", + "configuration.dotnet.server.componentPaths.razorExtension": "Substitui o caminho da pasta para o componente de extensão Razor do servidor de linguagem", "configuration.dotnet.server.componentPaths.roslynCopilot": "Substitui o caminho da pasta para o componente .roslynCopilot do servidor de idiomas", "configuration.dotnet.server.componentPaths.roslynDevKit": "Substitui o caminho da pasta para o componente .roslynDevKit do servidor de linguagem", "configuration.dotnet.server.componentPaths.xamlTools": "Substitui o caminho da pasta para o componente .xamlTools do servidor de linguagem", diff --git a/package.nls.ru.json b/package.nls.ru.json index f8f6a2f242..1a7018c80a 100644 --- a/package.nls.ru.json +++ b/package.nls.ru.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Включает предварительный просмотр \"программ на основе файлов\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Показывать примечания при отображении символа.", "configuration.dotnet.server.componentPaths": "Позволяет переопределить путь к папке для встроенных компонентов языкового сервера (например, переопределить путь .roslynDevKit в каталоге расширения для использования локально созданных компонентов).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Переопределяет путь к папке для компонента Razor Dev Kit языкового сервера", + "configuration.dotnet.server.componentPaths.razorExtension": "Переопределяет путь к папке для компонента расширения Razor языкового сервера", "configuration.dotnet.server.componentPaths.roslynCopilot": "Переопределяет путь к папке для компонента .roslynCopilot языкового сервера", "configuration.dotnet.server.componentPaths.roslynDevKit": "Переопределяет путь к папке для компонента .roslynDevKit языкового сервера.", "configuration.dotnet.server.componentPaths.xamlTools": "Переопределяет путь к папке для компонента .xamlTools языкового сервера.", diff --git a/package.nls.tr.json b/package.nls.tr.json index a411cd7067..99ac9f5a44 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "\"Dosya tabanlı programlar\" (dotnet run app.cs) önizleme deneyimini etkinleştirir.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Simge görüntülendiğinde açıklama bilgilerini göster.", "configuration.dotnet.server.componentPaths": "Dil sunucusundaki yerleşik bileşenlerin klasör yolunu geçersiz kılmaya olanak tanır (örneğin, yerel olarak oluşturulan bileşenleri kullanmak için uzantı dizinindeki .roslynDevKit yolunu geçersiz kılın)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Dil sunucusundaki Razor Geliştirme Paketi bileşeninin klasör yolunu geçersiz kılar", + "configuration.dotnet.server.componentPaths.razorExtension": "Dil sunucusundaki Razor uzantısı bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynCopilot": "Dil sunucusunun .roslynCopilot bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynDevKit": "Dil sunucusundaki .roslynDevKit bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.xamlTools": "Dil sunucusundaki .xamlTools bileşeninin klasör yolunu geçersiz kılar", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 885fa2f58e..419f5ac4d1 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "启用预览“基于文件的程序”(dotnet run app.cs)体验。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "显示符号时显示备注信息。", "configuration.dotnet.server.componentPaths": "允许替代语言服务器内置组件的文件夹路径(例如,替代扩展目录中的 .roslynDevKit 路径以使用本地生成的组件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "替代语言服务器的 Razor 开发工具包组件的文件夹路径", + "configuration.dotnet.server.componentPaths.razorExtension": "替代语言服务器的 Razor 扩展组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynCopilot": "替代语言服务器的 .roslynCopilot 组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynDevKit": "替代语言服务器的 .roslynDevKit 组件的文件夹路径", "configuration.dotnet.server.componentPaths.xamlTools": "替代语言服务器的 .xamlTools 组件的文件夹路径", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 9cda6e9072..6890d5296a 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "啟用「檔案型程式」 (dotnet run app.cs) 的預覽體驗。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "顯示符號時顯示備註資訊。", "configuration.dotnet.server.componentPaths": "允許覆寫語言伺服器內建元件的資料夾路徑 (例如,覆寫延伸模組目錄中的 .roslynDevKit 路徑,以使用本機建置的元件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "覆寫語言伺服器 Razor 開發套件元件的資料夾路徑", + "configuration.dotnet.server.componentPaths.razorExtension": "覆寫語言伺服器 Razor 延伸模組元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynCopilot": "覆寫語言伺服器 .roslynCopilot 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynDevKit": "覆寫語言伺服器 .roslynDevKit 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.xamlTools": "覆寫語言伺服器 .xamlTools 元件的資料夾路徑", From b152761a736338adb0ada17528c4e053ccb871ed Mon Sep 17 00:00:00 2001 From: siramvikram Date: Wed, 8 Oct 2025 18:14:22 +0000 Subject: [PATCH 03/36] Update main version --- CHANGELOG.md | 2 ++ version.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 539032a3b0..16272ffc35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ - Diagnostics related feature requests and improvements [#5951](https://github.com/dotnet/vscode-csharp/issues/5951) - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) +# 2.95.x + # 2.94.x * Add completion for razor components in settings (PR: [#8680](https://github.com/dotnet/vscode-csharp/pull/8680)) * Add copilot instructions (PR: [#8676](https://github.com/dotnet/vscode-csharp/pull/8676)) diff --git a/version.json b/version.json index 7a429fa0e4..6777f550fc 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "2.94", + "version": "2.95", "publicReleaseRefSpec": [ "^refs/heads/release$", "^refs/heads/prerelease$", From aeaf3286ab1dffc4415ef936674d3092c76ca721 Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Wed, 8 Oct 2025 18:28:33 +0000 Subject: [PATCH 04/36] Localization result of 5d7fb3215f261315d2155610b2433f41332572df. --- package.nls.es.json | 4 ++-- package.nls.fr.json | 4 ++-- package.nls.ja.json | 4 ++-- package.nls.ko.json | 4 ++-- package.nls.pt-br.json | 4 ++-- package.nls.ru.json | 4 ++-- package.nls.tr.json | 4 ++-- package.nls.zh-cn.json | 4 ++-- package.nls.zh-tw.json | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.nls.es.json b/package.nls.es.json index 6d2c249d7e..4aa159049c 100644 --- a/package.nls.es.json +++ b/package.nls.es.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita la experiencia de vista previa de \"programas basados en archivos\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar información de comentarios cuando se muestra el símbolo.", "configuration.dotnet.server.componentPaths": "Permite invalidar la ruta de acceso de carpeta para los componentes integrados del servidor de lenguaje (por ejemplo, invalidar la ruta de acceso .roslynDevKit en el directorio de extensión para usar componentes compilados localmente).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Invalida la ruta de acceso de la carpeta para el componente Razor Dev Kit del servidor de lenguaje", + "configuration.dotnet.server.componentPaths.razorExtension": "Invalida la ruta de acceso de la carpeta para el componente de extensión Razor del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynCopilot": "Invalida la ruta de acceso de la carpeta para el componente .roslynCopilot del servidor de lenguaje", "configuration.dotnet.server.componentPaths.roslynDevKit": "Invalida la ruta de acceso de la carpeta para el componente .roslynDevKit del servidor de lenguaje.", "configuration.dotnet.server.componentPaths.xamlTools": "Invalida la ruta de acceso de la carpeta para el componente .xamlTools del servidor de lenguaje.", diff --git a/package.nls.fr.json b/package.nls.fr.json index c23e5ae650..d9f8a18e40 100644 --- a/package.nls.fr.json +++ b/package.nls.fr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Active l’expérience de prévisualisation des « programmes basés sur des fichiers » (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Afficher les informations sur les remarques lors de l’affichage du symbole.", "configuration.dotnet.server.componentPaths": "Permet de remplacer le chemin d’accès au dossier des composants intégrés du serveur de langage (par exemple, remplacer le chemin d’accès .roslynDevKit dans le répertoire d’extension pour utiliser les composants générés localement).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Remplace le chemin d’accès du dossier pour le composant du Kit de développement Razor du serveur de langage", + "configuration.dotnet.server.componentPaths.razorExtension": "Remplace le chemin d’accès du dossier pour le composant d’extension Razor du serveur de langage", "configuration.dotnet.server.componentPaths.roslynCopilot": "Remplace le chemin d’accès du dossier pour le composant .roslynCopilot du serveur de langage", "configuration.dotnet.server.componentPaths.roslynDevKit": "Remplace le chemin d’accès au dossier du composant .roslynDevKit du serveur de langage", "configuration.dotnet.server.componentPaths.xamlTools": "Remplace le chemin d’accès du dossier pour le composant .xamlTools du serveur de langage", diff --git a/package.nls.ja.json b/package.nls.ja.json index f54264d384..661b43dd1a 100644 --- a/package.nls.ja.json +++ b/package.nls.ja.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "プレビューの \"ファイル ベースのプログラム\" (dotnet run app.cs) エクスペリエンスを有効にします。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "シンボルを表示するときに注釈情報を表示します。", "configuration.dotnet.server.componentPaths": "言語サーバーの組み込みコンポーネントのフォルダー パスをオーバーライドできます (たとえば、ローカルにビルドされたコンポーネントを使用するように拡張ディレクトリの .roslynDevKit パスをオーバーライドする)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "言語サーバーの Razor Dev Kit コンポーネントのフォルダー パスを上書きします", + "configuration.dotnet.server.componentPaths.razorExtension": "言語サーバーの Razor 拡張機能コンポーネントのフォルダー パスを上書きします", "configuration.dotnet.server.componentPaths.roslynCopilot": "言語サーバーの .roslynCopilot コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.roslynDevKit": "言語サーバーの .roslynDevKit コンポーネントのフォルダー パスをオーバーライドします", "configuration.dotnet.server.componentPaths.xamlTools": "言語サーバーの .xamlTools コンポーネントのフォルダー パスをオーバーライドします", diff --git a/package.nls.ko.json b/package.nls.ko.json index ff4fa483c0..fd74ce02cc 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "미리 보기 \"파일 기반 프로그램\"(dotnet run app.cs) 환경을 활성화합니다.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "기호를 표시할 때 설명 정보를 표시합니다.", "configuration.dotnet.server.componentPaths": "언어 서버의 기본 제공 구성 요소에 대한 폴더 경로를 재정의할 수 있습니다(예: 로컬로 빌드된 구성 요소를 사용하도록 확장 디렉터리의 .roslynDevKit 경로 재정의).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "언어 서버의 Razor Dev Kit 구성 요소에 대한 폴더 경로를 재정의합니다.", + "configuration.dotnet.server.componentPaths.razorExtension": "언어 서버의 Razor 확장 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.roslynCopilot": "언어 서버의 .roslynCopilot 구성 요소에 대한 폴더 경로를 덮어씁니다.", "configuration.dotnet.server.componentPaths.roslynDevKit": "언어 서버의 .roslynDevKit 구성 요소에 대한 폴더 경로를 재정의합니다.", "configuration.dotnet.server.componentPaths.xamlTools": "언어 서버의 .xamlTools 구성 요소에 대한 폴더 경로를 재정의합니다.", diff --git a/package.nls.pt-br.json b/package.nls.pt-br.json index 3732b1d020..4eb622bbed 100644 --- a/package.nls.pt-br.json +++ b/package.nls.pt-br.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Habilita a experiência de prévia \"programas baseados em arquivo\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostrar informações de comentários ao exibir o símbolo.", "configuration.dotnet.server.componentPaths": "Permite substituir o caminho da pasta para componentes internos do servidor de linguagem (por exemplo, substituir o caminho .roslynDevKit no diretório de extensão para usar componentes compilados localmente)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Substitui o caminho da pasta para o componente do Kit de Desenvolvimento do Razor do servidor de linguagem", + "configuration.dotnet.server.componentPaths.razorExtension": "Substitui o caminho da pasta para o componente de extensão Razor do servidor de linguagem", "configuration.dotnet.server.componentPaths.roslynCopilot": "Substitui o caminho da pasta para o componente .roslynCopilot do servidor de idiomas", "configuration.dotnet.server.componentPaths.roslynDevKit": "Substitui o caminho da pasta para o componente .roslynDevKit do servidor de linguagem", "configuration.dotnet.server.componentPaths.xamlTools": "Substitui o caminho da pasta para o componente .xamlTools do servidor de linguagem", diff --git a/package.nls.ru.json b/package.nls.ru.json index f8f6a2f242..1a7018c80a 100644 --- a/package.nls.ru.json +++ b/package.nls.ru.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Включает предварительный просмотр \"программ на основе файлов\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Показывать примечания при отображении символа.", "configuration.dotnet.server.componentPaths": "Позволяет переопределить путь к папке для встроенных компонентов языкового сервера (например, переопределить путь .roslynDevKit в каталоге расширения для использования локально созданных компонентов).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Переопределяет путь к папке для компонента Razor Dev Kit языкового сервера", + "configuration.dotnet.server.componentPaths.razorExtension": "Переопределяет путь к папке для компонента расширения Razor языкового сервера", "configuration.dotnet.server.componentPaths.roslynCopilot": "Переопределяет путь к папке для компонента .roslynCopilot языкового сервера", "configuration.dotnet.server.componentPaths.roslynDevKit": "Переопределяет путь к папке для компонента .roslynDevKit языкового сервера.", "configuration.dotnet.server.componentPaths.xamlTools": "Переопределяет путь к папке для компонента .xamlTools языкового сервера.", diff --git a/package.nls.tr.json b/package.nls.tr.json index a411cd7067..99ac9f5a44 100644 --- a/package.nls.tr.json +++ b/package.nls.tr.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "\"Dosya tabanlı programlar\" (dotnet run app.cs) önizleme deneyimini etkinleştirir.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Simge görüntülendiğinde açıklama bilgilerini göster.", "configuration.dotnet.server.componentPaths": "Dil sunucusundaki yerleşik bileşenlerin klasör yolunu geçersiz kılmaya olanak tanır (örneğin, yerel olarak oluşturulan bileşenleri kullanmak için uzantı dizinindeki .roslynDevKit yolunu geçersiz kılın)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Dil sunucusundaki Razor Geliştirme Paketi bileşeninin klasör yolunu geçersiz kılar", + "configuration.dotnet.server.componentPaths.razorExtension": "Dil sunucusundaki Razor uzantısı bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynCopilot": "Dil sunucusunun .roslynCopilot bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.roslynDevKit": "Dil sunucusundaki .roslynDevKit bileşeninin klasör yolunu geçersiz kılar", "configuration.dotnet.server.componentPaths.xamlTools": "Dil sunucusundaki .xamlTools bileşeninin klasör yolunu geçersiz kılar", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 885fa2f58e..419f5ac4d1 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "启用预览“基于文件的程序”(dotnet run app.cs)体验。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "显示符号时显示备注信息。", "configuration.dotnet.server.componentPaths": "允许替代语言服务器内置组件的文件夹路径(例如,替代扩展目录中的 .roslynDevKit 路径以使用本地生成的组件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "替代语言服务器的 Razor 开发工具包组件的文件夹路径", + "configuration.dotnet.server.componentPaths.razorExtension": "替代语言服务器的 Razor 扩展组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynCopilot": "替代语言服务器的 .roslynCopilot 组件的文件夹路径", "configuration.dotnet.server.componentPaths.roslynDevKit": "替代语言服务器的 .roslynDevKit 组件的文件夹路径", "configuration.dotnet.server.componentPaths.xamlTools": "替代语言服务器的 .xamlTools 组件的文件夹路径", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 9cda6e9072..6890d5296a 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "啟用「檔案型程式」 (dotnet run app.cs) 的預覽體驗。", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "顯示符號時顯示備註資訊。", "configuration.dotnet.server.componentPaths": "允許覆寫語言伺服器內建元件的資料夾路徑 (例如,覆寫延伸模組目錄中的 .roslynDevKit 路徑,以使用本機建置的元件)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "覆寫語言伺服器 Razor 開發套件元件的資料夾路徑", + "configuration.dotnet.server.componentPaths.razorExtension": "覆寫語言伺服器 Razor 延伸模組元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynCopilot": "覆寫語言伺服器 .roslynCopilot 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.roslynDevKit": "覆寫語言伺服器 .roslynDevKit 元件的資料夾路徑", "configuration.dotnet.server.componentPaths.xamlTools": "覆寫語言伺服器 .xamlTools 元件的資料夾路徑", From 68860e063e8c01cd139ec97f52e2f983eec6bb8b Mon Sep 17 00:00:00 2001 From: dotnet-bot Date: Sun, 12 Oct 2025 12:14:01 +0000 Subject: [PATCH 05/36] Localization result of 4ada4e385cbbe57dc48513ef2800d0fba4d07a79. --- package.nls.cs.json | 4 ++-- package.nls.de.json | 4 ++-- package.nls.it.json | 4 ++-- package.nls.pl.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.nls.cs.json b/package.nls.cs.json index 5d2093feb8..e72714a742 100644 --- a/package.nls.cs.json +++ b/package.nls.cs.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Umožňuje využívat prostředí „programů založených na souborech“ (dotnet run app.cs) ve verzi Preview.", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Zobrazit informace o poznámkách při zobrazení symbolu.", "configuration.dotnet.server.componentPaths": "Umožňuje přepsat cestu ke složce pro integrované komponenty jazykového serveru (například přepsat cestu .roslynDevKit v adresáři rozšíření tak, aby používala místně sestavené komponenty).", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Přepíše cestu ke složce pro komponentu Razor Dev Kit jazykového serveru", + "configuration.dotnet.server.componentPaths.razorExtension": "Přepíše cestu ke složce pro komponentu rozšíření Razor jazykového serveru", "configuration.dotnet.server.componentPaths.roslynCopilot": "Přepíše cestu ke složce pro komponentu .roslynCopilot jazykového serveru.", "configuration.dotnet.server.componentPaths.roslynDevKit": "Přepíše cestu ke složce pro komponentu .roslynDevKit jazykového serveru.", "configuration.dotnet.server.componentPaths.xamlTools": "Přepíše cestu ke složce pro komponentu .xamlTools jazykového serveru.", diff --git a/package.nls.de.json b/package.nls.de.json index 0f03515996..e50cdc6477 100644 --- a/package.nls.de.json +++ b/package.nls.de.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Aktiviert die Vorschau für die Erfahrung „dateibasierte Programme“ (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Beschreibungsinformationen beim Anzeigen des Symbols anzeigen.", "configuration.dotnet.server.componentPaths": "Ermöglicht das Überschreiben des Ordnerpfads für eingebaute Komponenten des Sprachservers (z. B. Überschreiben des Pfads .roslynDevKit im Erweiterungsverzeichnis, um lokal erstellte Komponenten zu verwenden)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Überschreibt den Ordnerpfad für die Razor-Dev-Kit-Komponente des Sprachservers", + "configuration.dotnet.server.componentPaths.razorExtension": "Überschreibt den Ordnerpfad für die Razor-Erweiterungskomponente des Sprachservers", "configuration.dotnet.server.componentPaths.roslynCopilot": "Überschreibt den Ordnerpfad für die .roslynCopilot-Komponente des Sprachservers", "configuration.dotnet.server.componentPaths.roslynDevKit": "Überschreibt den Ordnerpfad für die Komponente .roslynDevKit des Sprachservers", "configuration.dotnet.server.componentPaths.xamlTools": "Überschreibt den Ordnerpfad für die Komponente .xamlTools des Sprachservers", diff --git a/package.nls.it.json b/package.nls.it.json index c88bd3fff9..328f36d6e6 100644 --- a/package.nls.it.json +++ b/package.nls.it.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Abilita l'esperienza di anteprima di \"programmi basati su file\" (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Mostra le informazioni sulle note quando viene visualizzato il simbolo.", "configuration.dotnet.server.componentPaths": "Consente di eseguire l'override del percorso della cartella per i componenti predefiniti del server di linguaggio (ad esempio, eseguire l'override del percorso .roslynDevKit nella directory delle estensioni per usare componenti compilati in locale)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Esegue l'override del percorso della cartella per il componente Razor Dev Kit del server di linguaggio", + "configuration.dotnet.server.componentPaths.razorExtension": "Esegue l'override del percorso della cartella per il componente di estensione Razor del server di linguaggio", "configuration.dotnet.server.componentPaths.roslynCopilot": "Esegue l'override del percorso della cartella per il componente roslynCopilot del server di linguaggio", "configuration.dotnet.server.componentPaths.roslynDevKit": "Esegue l'override del percorso della cartella per il componente .roslynDevKit del server di linguaggio", "configuration.dotnet.server.componentPaths.xamlTools": "Esegue l'override del percorso della cartella per il componente .xamlTools del server di linguaggio", diff --git a/package.nls.pl.json b/package.nls.pl.json index b78f221e02..bdb6666e81 100644 --- a/package.nls.pl.json +++ b/package.nls.pl.json @@ -65,8 +65,8 @@ "configuration.dotnet.projects.enableFileBasedPrograms": "Włącza podgląd środowiska „programy oparte na plikach” (dotnet run app.cs).", "configuration.dotnet.quickInfo.showRemarksInQuickInfo": "Pokaż informacje o uwagach podczas wyświetlania symbolu.", "configuration.dotnet.server.componentPaths": "Umożliwia zastąpienie ścieżki folderu dla wbudowanych składników serwera języka (na przykład przesłonięcie ścieżki roslynDevKit w katalogu rozszerzenia w celu użycia składników skompilowanych lokalnie)", - "configuration.dotnet.server.componentPaths.razorDevKit": "Overrides the folder path for the Razor Dev Kit component of the language server", - "configuration.dotnet.server.componentPaths.razorExtension": "Overrides the folder path for the Razor extension component of the language server", + "configuration.dotnet.server.componentPaths.razorDevKit": "Zastępuje ścieżkę folderu składnika Razor Dev Kit serwera języka", + "configuration.dotnet.server.componentPaths.razorExtension": "Zastępuje ścieżkę folderu składnika rozszerzenia Razor serwera języka", "configuration.dotnet.server.componentPaths.roslynCopilot": "Przesłania ścieżkę folderu dla składnika .roslynCopilot serwera językowego", "configuration.dotnet.server.componentPaths.roslynDevKit": "Przesłania ścieżkę folderu dla składnika roslynDevKit serwera językowego", "configuration.dotnet.server.componentPaths.xamlTools": "Zastępuje ścieżkę folderu dla składnika xamlTools serwera języka", From 33de9a49ea820804014f97f3387cdef9e7bf5029 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Mon, 13 Oct 2025 13:15:58 +1100 Subject: [PATCH 06/36] Bump Razor to 10.0.0-preview.25512.6 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16272ffc35..620504ecad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) # 2.95.x +* Bump Razor to 10.0.0-preview.25512.6 (PR: [#8694](https://github.com/dotnet/vscode-csharp/pull/8694)) + * Provide a way for users to turn on logging for formatting, to help resolve bugs (PR: [#12304](https://github.com/dotnet/razor/pull/12304)) + * Handle diagnostic spans that cover an entire attribute value (PR: [#12302](https://github.com/dotnet/razor/pull/12302)) + * Map component start tags to C#, for better GTD, FAR, Hover, etc. (PR: [#12287](https://github.com/dotnet/razor/pull/12287)) # 2.94.x * Add completion for razor components in settings (PR: [#8680](https://github.com/dotnet/vscode-csharp/pull/8680)) diff --git a/package.json b/package.json index 5280275c89..1a196353c1 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "defaults": { "roslyn": "5.1.0-1.25506.3", "omniSharp": "1.39.14", - "razor": "10.0.0-preview.25503.1", + "razor": "10.0.0-preview.25512.6", "razorOmnisharp": "7.0.0-preview.23363.1", "xamlTools": "18.0.11023.10" }, From f7a6641bdbf45b251c31e5c14f45cad0f331f0ea Mon Sep 17 00:00:00 2001 From: dotnet-maestro-bot Date: Mon, 13 Oct 2025 18:01:29 +0000 Subject: [PATCH 07/36] Update RoslynCopilot version to 18.0.898-alpha --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5280275c89..73c0fccff3 100644 --- a/package.json +++ b/package.json @@ -405,7 +405,7 @@ { "id": "RoslynCopilot", "description": "Language server for Roslyn Copilot integration", - "url": "https://roslyn.blob.core.windows.net/releases/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer-18.0.797-alpha.zip", + "url": "https://roslyn.blob.core.windows.net/releases/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer-18.0.898-alpha.zip", "installPath": ".roslynCopilot", "platforms": [ "neutral" @@ -414,7 +414,7 @@ "neutral" ], "installTestPath": "./.roslynCopilot/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll", - "integrity": "168DC3B3757B5F58DD35E27820949CA8AF4B890BE92D1A0CA6461A3A62E9D0A4" + "integrity": "44FC523F2B3FA451327147C53E2FA0D7BA2C438B1A901EAEC32E004FBFA731B4" }, { "id": "Debugger", From 35fe1e06cadc4dbd183a48c37cb90776b782301d Mon Sep 17 00:00:00 2001 From: David Barbet Date: Mon, 13 Oct 2025 13:09:46 -0700 Subject: [PATCH 08/36] Update Roslyn to 5.3.0-1.25513.2 --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 620504ecad..5b7fabe77c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) # 2.95.x +* Bump Roslyn to 5.3.0-1.25513.2 (PR: [#8697](https://github.com/dotnet/vscode-csharp/pull/8697)) + * Restore fully qualify for Razor (PR: [#80674](https://github.com/dotnet/roslyn/pull/80674)) + * Improve diagnostic quality for less accessible base type argument (PR: [#80483](https://github.com/dotnet/roslyn/pull/80483)) + * Build BuildHost against net8.0 (PR: [#80641](https://github.com/dotnet/roslyn/pull/80641)) + * Add completion for directives in file based programs (PR: [#80410](https://github.com/dotnet/roslyn/pull/80410)) * Bump Razor to 10.0.0-preview.25512.6 (PR: [#8694](https://github.com/dotnet/vscode-csharp/pull/8694)) * Provide a way for users to turn on logging for formatting, to help resolve bugs (PR: [#12304](https://github.com/dotnet/razor/pull/12304)) * Handle diagnostic spans that cover an entire attribute value (PR: [#12302](https://github.com/dotnet/razor/pull/12302)) diff --git a/package.json b/package.json index fe16562b1e..be9ea81442 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "workspace" ], "defaults": { - "roslyn": "5.1.0-1.25506.3", + "roslyn": "5.3.0-1.25513.2", "omniSharp": "1.39.14", "razor": "10.0.0-preview.25512.6", "razorOmnisharp": "7.0.0-preview.23363.1", From c08e7a2d4bbbff57899a498b2c54d0f2841cc747 Mon Sep 17 00:00:00 2001 From: David Barbet Date: Tue, 14 Oct 2025 16:04:37 -0700 Subject: [PATCH 09/36] Update roslyn --- CHANGELOG.md | 4 +++- package.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b7fabe77c..fde457359d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) # 2.95.x -* Bump Roslyn to 5.3.0-1.25513.2 (PR: [#8697](https://github.com/dotnet/vscode-csharp/pull/8697)) +* Bump Roslyn to 5.3.0-1.25514.3 (PR: [#8700](https://github.com/dotnet/vscode-csharp/pull/8700)) + * Ensure `LspWorkspaceManager` returns solutions without misc document when file moved(PR: [#80535](https://github.com/dotnet/roslyn/pull/80535)) + * Add limited support for binarylogger to MSBuildWorkspace(PR: [#80120](https://github.com/dotnet/roslyn/pull/80120)) * Restore fully qualify for Razor (PR: [#80674](https://github.com/dotnet/roslyn/pull/80674)) * Improve diagnostic quality for less accessible base type argument (PR: [#80483](https://github.com/dotnet/roslyn/pull/80483)) * Build BuildHost against net8.0 (PR: [#80641](https://github.com/dotnet/roslyn/pull/80641)) diff --git a/package.json b/package.json index be9ea81442..73df0012a3 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "workspace" ], "defaults": { - "roslyn": "5.3.0-1.25513.2", + "roslyn": "5.3.0-1.25514.3", "omniSharp": "1.39.14", "razor": "10.0.0-preview.25512.6", "razorOmnisharp": "7.0.0-preview.23363.1", From aae85f8d12bce4f31a036c5ee6f518c3bb2a3284 Mon Sep 17 00:00:00 2001 From: JoeRobich Date: Wed, 15 Oct 2025 05:01:52 +0000 Subject: [PATCH 10/36] Update main CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fde457359d..071b6cdbf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) # 2.95.x +* Update Roslyn to 5.3.0-1.25513.2 (PR: [#8697](https://github.com/dotnet/vscode-csharp/pull/8697)) +* Update RoslynCopilot url to 18.0.898-alpha (PR: [#8696](https://github.com/dotnet/vscode-csharp/pull/8696)) * Bump Roslyn to 5.3.0-1.25514.3 (PR: [#8700](https://github.com/dotnet/vscode-csharp/pull/8700)) * Ensure `LspWorkspaceManager` returns solutions without misc document when file moved(PR: [#80535](https://github.com/dotnet/roslyn/pull/80535)) * Add limited support for binarylogger to MSBuildWorkspace(PR: [#80120](https://github.com/dotnet/roslyn/pull/80120)) From 8848f19fb54bc6989563217715d156e59dd6aaa0 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 06:34:04 -0700 Subject: [PATCH 11/36] Update changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 071b6cdbf7..09a644f053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,6 @@ - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) # 2.95.x -* Update Roslyn to 5.3.0-1.25513.2 (PR: [#8697](https://github.com/dotnet/vscode-csharp/pull/8697)) * Update RoslynCopilot url to 18.0.898-alpha (PR: [#8696](https://github.com/dotnet/vscode-csharp/pull/8696)) * Bump Roslyn to 5.3.0-1.25514.3 (PR: [#8700](https://github.com/dotnet/vscode-csharp/pull/8700)) * Ensure `LspWorkspaceManager` returns solutions without misc document when file moved(PR: [#80535](https://github.com/dotnet/roslyn/pull/80535)) From 95072b1ae5d0f05acf00a8d4e458fec2b859a4f8 Mon Sep 17 00:00:00 2001 From: dotnet-maestro-bot Date: Wed, 15 Oct 2025 17:51:37 +0200 Subject: [PATCH 12/36] Update RoslynCopilot url to 18.0.904-alpha (#8699) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 73df0012a3..a08d4cc233 100644 --- a/package.json +++ b/package.json @@ -405,7 +405,7 @@ { "id": "RoslynCopilot", "description": "Language server for Roslyn Copilot integration", - "url": "https://roslyn.blob.core.windows.net/releases/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer-18.0.898-alpha.zip", + "url": "https://roslyn.blob.core.windows.net/releases/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer-18.0.904-alpha.zip", "installPath": ".roslynCopilot", "platforms": [ "neutral" @@ -414,7 +414,7 @@ "neutral" ], "installTestPath": "./.roslynCopilot/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll", - "integrity": "44FC523F2B3FA451327147C53E2FA0D7BA2C438B1A901EAEC32E004FBFA731B4" + "integrity": "0BD733B23A706226F2B429AB0CE35576FB474493C8E19C7B88311007876DE5CC" }, { "id": "Debugger", From 28b16ed148eed5c90286eeddd747a60300e18127 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:02:06 +0000 Subject: [PATCH 13/36] Initial plan From 1e178d6fe719945896b10d1243703602dd363191 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:11:32 +0000 Subject: [PATCH 14/36] Add isOptional field to packages and handle optional package failures Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- src/packageManager/IPackage.ts | 1 + src/packageManager/absolutePathPackage.ts | 6 +- .../downloadAndInstallPackages.ts | 5 ++ .../downloadAndInstallPackages.test.ts | 73 +++++++++++++++++++ 4 files changed, 83 insertions(+), 2 deletions(-) diff --git a/src/packageManager/IPackage.ts b/src/packageManager/IPackage.ts index 91d0d826dc..2ede628b38 100644 --- a/src/packageManager/IPackage.ts +++ b/src/packageManager/IPackage.ts @@ -13,4 +13,5 @@ export interface IPackage { platformId?: string; integrity?: string; isFramework?: boolean; + isOptional?: boolean; } diff --git a/src/packageManager/absolutePathPackage.ts b/src/packageManager/absolutePathPackage.ts index 5505dc43eb..578ff2d1e3 100644 --- a/src/packageManager/absolutePathPackage.ts +++ b/src/packageManager/absolutePathPackage.ts @@ -20,7 +20,8 @@ export class AbsolutePathPackage implements IPackage { public fallbackUrl?: string, public platformId?: string, public integrity?: string, - public isFramework?: boolean + public isFramework?: boolean, + public isOptional?: boolean ) {} public static getAbsolutePathPackage(pkg: Package, extensionPath: string) { @@ -36,7 +37,8 @@ export class AbsolutePathPackage implements IPackage { pkg.fallbackUrl, pkg.platformId, pkg.integrity, - pkg.isFramework + pkg.isFramework, + pkg.isOptional ); } } diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index a148a666e4..eccfdbf830 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -61,6 +61,11 @@ export async function downloadAndInstallPackages( eventStream.post(new InstallationFailure(installationStage, error)); } + // If the package is optional, log and continue with the next package + if (pkg.isOptional) { + continue; + } + return false; } finally { try { diff --git a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts index 9d8854a2bf..0d8cff9006 100644 --- a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts +++ b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts @@ -218,6 +218,79 @@ describe(`${downloadAndInstallPackages.name}`, () => { }); }); + describe('Optional packages', () => { + test('Returns true and continues when an optional package fails to download', async () => { + const optionalPackage = [ + { + url: `${server.baseUrl}/notDownloadablePackage`, + description: 'Optional Package', + installPath: new AbsolutePath(tmpDirPath), + isOptional: true, + }, + ]; + + const result = await downloadAndInstallPackages( + optionalPackage, + networkSettingsProvider, + eventStream, + downloadValidator + ); + expect(result).toBe(true); + }); + + test('Continues to install remaining packages after optional package fails', async () => { + const tmpInstallDir2 = await CreateTmpDir(true); + const mixedPackages = [ + { + url: `${server.baseUrl}/notDownloadablePackage`, + description: 'Optional Package', + installPath: new AbsolutePath(tmpDirPath), + isOptional: true, + }, + { + url: `${server.baseUrl}/downloadablePackage`, + description: packageDescription, + installPath: new AbsolutePath(tmpInstallDir2.name), + }, + ]; + + const result = await downloadAndInstallPackages( + mixedPackages, + networkSettingsProvider, + eventStream, + downloadValidator + ); + expect(result).toBe(true); + expect(await util.fileExists(path.join(tmpInstallDir2.name, 'install.Lock'))).toBe(true); + tmpInstallDir2.dispose(); + }); + + test('InstallationFailure event is logged for optional package', async () => { + const optionalPackage = [ + { + url: `${server.baseUrl}/notDownloadablePackage`, + description: 'Optional Package', + installPath: new AbsolutePath(tmpDirPath), + isOptional: true, + }, + ]; + + eventBus.getEvents(); // Clear any previous events + await downloadAndInstallPackages( + optionalPackage, + networkSettingsProvider, + eventStream, + downloadValidator + ); + const obtainedEvents = eventBus.getEvents(); + const installationFailureEvent = obtainedEvents.find( + (event) => event instanceof InstallationFailure + ) as InstallationFailure; + expect(installationFailureEvent).toBeDefined(); + expect(installationFailureEvent.stage).toEqual('downloadPackage'); + }); + }); + afterEach(async () => { if (tmpInstallDir) { tmpInstallDir.dispose(); From 1ffa0e09066bde0a58f33c2915e63622e58361e2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:13:52 +0000 Subject: [PATCH 15/36] Fix linting formatting Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- .../packages/downloadAndInstallPackages.test.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts index 0d8cff9006..9be17a0f4b 100644 --- a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts +++ b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts @@ -276,12 +276,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { ]; eventBus.getEvents(); // Clear any previous events - await downloadAndInstallPackages( - optionalPackage, - networkSettingsProvider, - eventStream, - downloadValidator - ); + await downloadAndInstallPackages(optionalPackage, networkSettingsProvider, eventStream, downloadValidator); const obtainedEvents = eventBus.getEvents(); const installationFailureEvent = obtainedEvents.find( (event) => event instanceof InstallationFailure From e0152c9f78342a59c86f73087180d06ea559e6b9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:10:15 +0000 Subject: [PATCH 16/36] Add telemetry reporting for optional package installation failures Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- .gitignore | 1 + src/main.ts | 2 +- src/omnisharp/omnisharpDownloader.ts | 3 +- .../downloadAndInstallPackages.ts | 22 ++++++++++++ src/razor/razorOmnisharpDownloader.ts | 3 +- tasks/offlinePackagingTasks.ts | 4 ++- .../downloadAndInstallPackages.test.ts | 35 +++++++++++++------ 7 files changed, 56 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 291b7b01bb..0dea598e3e 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ coverage/ \.DS_Store vsix/ +*.bak diff --git a/src/main.ts b/src/main.ts index 977e415f5f..b001f2eb35 100644 --- a/src/main.ts +++ b/src/main.ts @@ -86,7 +86,7 @@ export async function activate( const networkSettingsProvider = vscodeNetworkSettingsProvider(vscode); const useFramework = useOmnisharpServer && omnisharpOptions.useModernNet !== true; const installDependencies: IInstallDependencies = async (dependencies: AbsolutePathPackage[]) => - downloadAndInstallPackages(dependencies, networkSettingsProvider, eventStream, isValidDownload); + downloadAndInstallPackages(dependencies, networkSettingsProvider, eventStream, isValidDownload, reporter); const runtimeDependenciesExist = await installRuntimeDependencies( context.extension.packageJSON, diff --git a/src/omnisharp/omnisharpDownloader.ts b/src/omnisharp/omnisharpDownloader.ts index 03be20748f..e90dc61662 100644 --- a/src/omnisharp/omnisharpDownloader.ts +++ b/src/omnisharp/omnisharpDownloader.ts @@ -56,7 +56,8 @@ export class OmnisharpDownloader { packagesToInstall, this.networkSettingsProvider, this.eventStream, - isValidDownload + isValidDownload, + undefined ) ) { this.eventStream.post(new InstallationSuccess()); diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index eccfdbf830..ce1853f205 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -16,12 +16,14 @@ import { mkdirpSync } from 'fs-extra'; import { PackageInstallStart } from '../shared/loggingEvents'; import { DownloadValidator } from './isValidDownload'; import { CancellationToken } from 'vscode'; +import { ITelemetryReporter } from '../shared/telemetryReporter'; export async function downloadAndInstallPackages( packages: AbsolutePathPackage[], provider: NetworkSettingsProvider, eventStream: EventStream, downloadValidator: DownloadValidator, + telemetryReporter?: ITelemetryReporter, token?: CancellationToken ): Promise { eventStream.post(new PackageInstallStart()); @@ -61,6 +63,26 @@ export async function downloadAndInstallPackages( eventStream.post(new InstallationFailure(installationStage, error)); } + // Send telemetry for the failure + if (telemetryReporter) { + const telemetryProperties: { [key: string]: string } = { + installStage: installationStage, + packageId: pkg.id, + isOptional: pkg.isOptional ? 'true' : 'false', + }; + + if (error instanceof NestedError && error.err instanceof PackageError) { + telemetryProperties['error.message'] = error.err.message; + telemetryProperties['error.packageUrl'] = error.err.pkg.url; + } else if (error instanceof PackageError) { + telemetryProperties['error.message'] = error.message; + telemetryProperties['error.packageUrl'] = error.pkg.url; + } + + const eventName = pkg.isOptional ? 'OptionalPackageInstallationFailed' : 'PackageInstallationFailed'; + telemetryReporter.sendTelemetryEvent(eventName, telemetryProperties); + } + // If the package is optional, log and continue with the next package if (pkg.isOptional) { continue; diff --git a/src/razor/razorOmnisharpDownloader.ts b/src/razor/razorOmnisharpDownloader.ts index 965f7cf99a..e87b0e3fcb 100644 --- a/src/razor/razorOmnisharpDownloader.ts +++ b/src/razor/razorOmnisharpDownloader.ts @@ -38,7 +38,8 @@ export class RazorOmnisharpDownloader { packagesToInstall, this.networkSettingsProvider, this.eventStream, - isValidDownload + isValidDownload, + undefined ) ) { this.eventStream.post(new InstallationSuccess()); diff --git a/tasks/offlinePackagingTasks.ts b/tasks/offlinePackagingTasks.ts index 531e0b7adf..fb9714b4c9 100644 --- a/tasks/offlinePackagingTasks.ts +++ b/tasks/offlinePackagingTasks.ts @@ -280,7 +280,9 @@ async function installPackageJsonDependency( codeExtensionPath ); const provider = () => new NetworkSettings('', true); - if (!(await downloadAndInstallPackages(packagesToInstall, provider, eventStream, isValidDownload, token))) { + if ( + !(await downloadAndInstallPackages(packagesToInstall, provider, eventStream, isValidDownload, undefined, token)) + ) { throw Error('Failed to download package.'); } } diff --git a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts index 9be17a0f4b..33647e8f90 100644 --- a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts +++ b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts @@ -87,7 +87,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); for (const elem of testZip.files) { const filePath = path.join(tmpDirPath, elem.path); @@ -100,7 +101,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(await util.fileExists(path.join(tmpDirPath, 'install.Lock'))).toBe(true); }); @@ -119,7 +121,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -153,7 +156,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -180,7 +184,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -196,7 +201,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { notDownloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); const obtainedEvents = eventBus.getEvents(); expect(obtainedEvents[0]).toStrictEqual(eventsSequence[0]); @@ -212,7 +218,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { notDownloadablePackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(await util.fileExists(path.join(tmpDirPath, 'install.Lock'))).toBe(false); }); @@ -233,7 +240,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { optionalPackage, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(result).toBe(true); }); @@ -258,7 +266,8 @@ describe(`${downloadAndInstallPackages.name}`, () => { mixedPackages, networkSettingsProvider, eventStream, - downloadValidator + downloadValidator, + undefined ); expect(result).toBe(true); expect(await util.fileExists(path.join(tmpInstallDir2.name, 'install.Lock'))).toBe(true); @@ -276,7 +285,13 @@ describe(`${downloadAndInstallPackages.name}`, () => { ]; eventBus.getEvents(); // Clear any previous events - await downloadAndInstallPackages(optionalPackage, networkSettingsProvider, eventStream, downloadValidator); + await downloadAndInstallPackages( + optionalPackage, + networkSettingsProvider, + eventStream, + downloadValidator, + undefined + ); const obtainedEvents = eventBus.getEvents(); const installationFailureEvent = obtainedEvents.find( (event) => event instanceof InstallationFailure From 9c0d446966f915bd3c6317b0788b254f7122b38e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 19:20:41 +0000 Subject: [PATCH 17/36] Handle optional components gracefully when files don't exist Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- src/lsptoolshost/extensions/builtInComponents.ts | 10 +++++++++- src/lsptoolshost/server/roslynLanguageServer.ts | 4 ++-- src/razor/src/extension.ts | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lsptoolshost/extensions/builtInComponents.ts b/src/lsptoolshost/extensions/builtInComponents.ts index af657fa165..9e1868c7d8 100644 --- a/src/lsptoolshost/extensions/builtInComponents.ts +++ b/src/lsptoolshost/extensions/builtInComponents.ts @@ -44,12 +44,20 @@ export const componentInfo: { [key: string]: ComponentInfo } = { }, }; -export function getComponentPaths(componentName: string, options: LanguageServerOptions | undefined): string[] { +export function getComponentPaths( + componentName: string, + options: LanguageServerOptions | undefined, + isOptional = false +): string[] { const component = componentInfo[componentName]; const baseFolder = getComponentFolderPath(component, options); const paths = component.componentDllPaths.map((dllPath) => path.join(baseFolder, dllPath)); for (const dllPath of paths) { if (!fs.existsSync(dllPath)) { + if (isOptional) { + // Component is optional and doesn't exist - return empty array + return []; + } throw new Error(`Component DLL not found: ${dllPath}`); } } diff --git a/src/lsptoolshost/server/roslynLanguageServer.ts b/src/lsptoolshost/server/roslynLanguageServer.ts index 8d1951d1f4..57e18ac69b 100644 --- a/src/lsptoolshost/server/roslynLanguageServer.ts +++ b/src/lsptoolshost/server/roslynLanguageServer.ts @@ -1026,7 +1026,7 @@ export class RoslynLanguageServer { // Also include the Xaml Dev Kit extensions, if enabled. if (languageServerOptions.enableXamlTools) { - getComponentPaths('xamlTools', languageServerOptions).forEach((path) => + getComponentPaths('xamlTools', languageServerOptions, true).forEach((path) => additionalExtensionPaths.push(path) ); } @@ -1096,7 +1096,7 @@ export class RoslynLanguageServer { await exports.setupTelemetryEnvironmentAsync(env); } - getComponentPaths('roslynCopilot', languageServerOptions).forEach((extPath) => { + getComponentPaths('roslynCopilot', languageServerOptions, true).forEach((extPath) => { additionalExtensionPaths.push(extPath); }); } diff --git a/src/razor/src/extension.ts b/src/razor/src/extension.ts index 8fdac6c67b..990a8d380c 100644 --- a/src/razor/src/extension.ts +++ b/src/razor/src/extension.ts @@ -104,7 +104,7 @@ export async function activate( await setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, logger); if (vscode.env.isTelemetryEnabled) { - const razorComponentPaths = getComponentPaths('razorDevKit', undefined); + const razorComponentPaths = getComponentPaths('razorDevKit', undefined, true); if (razorComponentPaths.length !== 1) { logger.logError('Failed to find Razor DevKit telemetry extension path.', undefined); } else { From f611c8a4b746e55ffaa75b0b3ea5eded36cbeefd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 20:02:18 +0000 Subject: [PATCH 18/36] Refactor isOptional to be part of ComponentInfo interface Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- src/lsptoolshost/extensions/builtInComponents.ts | 12 ++++++------ src/lsptoolshost/server/roslynLanguageServer.ts | 4 ++-- src/razor/src/extension.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lsptoolshost/extensions/builtInComponents.ts b/src/lsptoolshost/extensions/builtInComponents.ts index 9e1868c7d8..119aca8bd7 100644 --- a/src/lsptoolshost/extensions/builtInComponents.ts +++ b/src/lsptoolshost/extensions/builtInComponents.ts @@ -11,6 +11,7 @@ interface ComponentInfo { defaultFolderName: string; optionName: string; componentDllPaths: string[]; + isOptional?: boolean; } export const componentInfo: { [key: string]: ComponentInfo } = { @@ -26,11 +27,13 @@ export const componentInfo: { [key: string]: ComponentInfo } = { 'Microsoft.VisualStudio.DesignTools.CodeAnalysis.dll', 'Microsoft.VisualStudio.DesignTools.CodeAnalysis.Diagnostics.dll', ], + isOptional: true, }, razorDevKit: { defaultFolderName: '.razorDevKit', optionName: 'razorDevKit', componentDllPaths: ['Microsoft.VisualStudio.DevKit.Razor.dll'], + isOptional: true, }, razorExtension: { defaultFolderName: '.razorExtension', @@ -41,20 +44,17 @@ export const componentInfo: { [key: string]: ComponentInfo } = { defaultFolderName: '.roslynCopilot', optionName: 'roslynCopilot', componentDllPaths: ['Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll'], + isOptional: true, }, }; -export function getComponentPaths( - componentName: string, - options: LanguageServerOptions | undefined, - isOptional = false -): string[] { +export function getComponentPaths(componentName: string, options: LanguageServerOptions | undefined): string[] { const component = componentInfo[componentName]; const baseFolder = getComponentFolderPath(component, options); const paths = component.componentDllPaths.map((dllPath) => path.join(baseFolder, dllPath)); for (const dllPath of paths) { if (!fs.existsSync(dllPath)) { - if (isOptional) { + if (component.isOptional) { // Component is optional and doesn't exist - return empty array return []; } diff --git a/src/lsptoolshost/server/roslynLanguageServer.ts b/src/lsptoolshost/server/roslynLanguageServer.ts index 57e18ac69b..8d1951d1f4 100644 --- a/src/lsptoolshost/server/roslynLanguageServer.ts +++ b/src/lsptoolshost/server/roslynLanguageServer.ts @@ -1026,7 +1026,7 @@ export class RoslynLanguageServer { // Also include the Xaml Dev Kit extensions, if enabled. if (languageServerOptions.enableXamlTools) { - getComponentPaths('xamlTools', languageServerOptions, true).forEach((path) => + getComponentPaths('xamlTools', languageServerOptions).forEach((path) => additionalExtensionPaths.push(path) ); } @@ -1096,7 +1096,7 @@ export class RoslynLanguageServer { await exports.setupTelemetryEnvironmentAsync(env); } - getComponentPaths('roslynCopilot', languageServerOptions, true).forEach((extPath) => { + getComponentPaths('roslynCopilot', languageServerOptions).forEach((extPath) => { additionalExtensionPaths.push(extPath); }); } diff --git a/src/razor/src/extension.ts b/src/razor/src/extension.ts index 990a8d380c..8fdac6c67b 100644 --- a/src/razor/src/extension.ts +++ b/src/razor/src/extension.ts @@ -104,7 +104,7 @@ export async function activate( await setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, logger); if (vscode.env.isTelemetryEnabled) { - const razorComponentPaths = getComponentPaths('razorDevKit', undefined, true); + const razorComponentPaths = getComponentPaths('razorDevKit', undefined); if (razorComponentPaths.length !== 1) { logger.logError('Failed to find Razor DevKit telemetry extension path.', undefined); } else { From bd12e03ef214890f3c40f116bb11cd261434475f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 20:14:25 +0000 Subject: [PATCH 19/36] Revert .gitignore change that added *.bak Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0dea598e3e..291b7b01bb 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,3 @@ coverage/ \.DS_Store vsix/ -*.bak From 60894e9ebddbd35d82ad9972ae9bf5f42e9569bc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 20:45:52 +0000 Subject: [PATCH 20/36] Thread ITelemetryReporter through OmniSharp components Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- src/omnisharp/omnisharpDownloader.ts | 6 ++++-- src/omnisharp/omnisharpLanguageServer.ts | 9 ++++++--- src/omnisharp/server.ts | 7 +++++-- .../omnisharpUnitTests/omnisharpDownloader.test.ts | 3 ++- .../omnisharpUnitTests/omnisharpManager.test.ts | 3 ++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/omnisharp/omnisharpDownloader.ts b/src/omnisharp/omnisharpDownloader.ts index e90dc61662..0924284585 100644 --- a/src/omnisharp/omnisharpDownloader.ts +++ b/src/omnisharp/omnisharpDownloader.ts @@ -19,6 +19,7 @@ import { getRuntimeDependenciesPackages } from '../tools/runtimeDependencyPackag import { getAbsolutePathPackagesToInstall } from '../packageManager/getAbsolutePathPackagesToInstall'; import { isValidDownload } from '../packageManager/isValidDownload'; import { LatestBuildDownloadStart } from './omnisharpLoggingEvents'; +import { ITelemetryReporter } from '../shared/telemetryReporter'; export class OmnisharpDownloader { public constructor( @@ -26,7 +27,8 @@ export class OmnisharpDownloader { private eventStream: EventStream, private packageJSON: any, private platformInfo: PlatformInformation, - private extensionPath: string + private extensionPath: string, + private reporter: ITelemetryReporter ) {} public async DownloadAndInstallOmnisharp( @@ -57,7 +59,7 @@ export class OmnisharpDownloader { this.networkSettingsProvider, this.eventStream, isValidDownload, - undefined + this.reporter ) ) { this.eventStream.post(new InstallationSuccess()); diff --git a/src/omnisharp/omnisharpLanguageServer.ts b/src/omnisharp/omnisharpLanguageServer.ts index 619a10ba1a..2226b49c6c 100644 --- a/src/omnisharp/omnisharpLanguageServer.ts +++ b/src/omnisharp/omnisharpLanguageServer.ts @@ -178,7 +178,8 @@ export async function activateOmniSharpLanguageServer( networkSettingsProvider, eventStream, context.extension.extensionPath, - omnisharpChannel + omnisharpChannel, + reporter ); } @@ -189,7 +190,8 @@ async function activate( provider: NetworkSettingsProvider, eventStream: EventStream, extensionPath: string, - outputChannel: vscode.OutputChannel + outputChannel: vscode.OutputChannel, + reporter: ITelemetryReporter ) { const disposables = new CompositeDisposable(); @@ -211,7 +213,8 @@ async function activate( omnisharpDotnetResolver, context, outputChannel, - languageMiddlewareFeature + languageMiddlewareFeature, + reporter ); const advisor = new Advisor(server); // create before server is started const testManager = new TestManager(server, eventStream, languageMiddlewareFeature); diff --git a/src/omnisharp/server.ts b/src/omnisharp/server.ts index bc60e6f8b8..49a2cc879d 100644 --- a/src/omnisharp/server.ts +++ b/src/omnisharp/server.ts @@ -34,6 +34,7 @@ import TestManager from './features/dotnetTest'; import { findLaunchTargets } from './launcher'; import { ProjectConfigurationMessage } from '../shared/projectConfiguration'; import { commonOptions, omnisharpOptions, razorOptions } from '../shared/options'; +import { ITelemetryReporter } from '../shared/telemetryReporter'; enum ServerState { Starting, @@ -117,14 +118,16 @@ export class OmniSharpServer { private dotnetResolver: IHostExecutableResolver, private context: ExtensionContext, private outputChannel: OutputChannel, - private languageMiddlewareFeature: LanguageMiddlewareFeature + private languageMiddlewareFeature: LanguageMiddlewareFeature, + reporter: ITelemetryReporter ) { const downloader = new OmnisharpDownloader( networkSettingsProvider, this.eventStream, this.packageJSON, platformInfo, - extensionPath + extensionPath, + reporter ); this._omnisharpManager = new OmnisharpManager(downloader, platformInfo); this.updateProjectDebouncer.pipe(debounceTime(1500)).subscribe(async (_) => { diff --git a/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts b/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts index 74d2b999f7..6047bbc87f 100644 --- a/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts +++ b/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts @@ -54,7 +54,8 @@ import { modernNetVersion } from '../../../src/omnisharp/omnisharpPackageCreator eventStream, testPackageJSON, platformInfo, - extensionPath + extensionPath, + undefined as any ); server = await MockHttpsServer.CreateMockHttpsServer(); testZip = await TestZip.createTestZipAsync(createTestFile('Foo', 'foo.txt')); diff --git a/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts b/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts index 78f882771e..586012ca8e 100644 --- a/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts +++ b/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts @@ -245,7 +245,8 @@ function GetTestOmniSharpManager( eventStream, testPackageJSON, platformInfo, - extensionPath + extensionPath, + undefined as any ); return new OmnisharpManager(downloader, platformInfo, serverUrl); } From e13d0b99a2999fa0f956a193a5d7cbd28554d92d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:49:02 +0000 Subject: [PATCH 21/36] Refactor telemetry and make reporter parameters optional Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- src/omnisharp/omnisharpDownloader.ts | 2 +- src/omnisharp/omnisharpLanguageServer.ts | 3 +- .../downloadAndInstallPackages.ts | 42 +++++++++++-------- src/razor/razorOmnisharpDownloader.ts | 6 ++- .../omnisharpDownloader.test.ts | 3 +- .../omnisharpManager.test.ts | 3 +- .../downloadAndInstallPackages.test.ts | 35 +++++----------- 7 files changed, 43 insertions(+), 51 deletions(-) diff --git a/src/omnisharp/omnisharpDownloader.ts b/src/omnisharp/omnisharpDownloader.ts index 0924284585..8b3ad510ea 100644 --- a/src/omnisharp/omnisharpDownloader.ts +++ b/src/omnisharp/omnisharpDownloader.ts @@ -28,7 +28,7 @@ export class OmnisharpDownloader { private packageJSON: any, private platformInfo: PlatformInformation, private extensionPath: string, - private reporter: ITelemetryReporter + private reporter?: ITelemetryReporter ) {} public async DownloadAndInstallOmnisharp( diff --git a/src/omnisharp/omnisharpLanguageServer.ts b/src/omnisharp/omnisharpLanguageServer.ts index 2226b49c6c..1c5325c328 100644 --- a/src/omnisharp/omnisharpLanguageServer.ts +++ b/src/omnisharp/omnisharpLanguageServer.ts @@ -154,7 +154,8 @@ export async function activateOmniSharpLanguageServer( eventStream, context.extension.packageJSON, platformInfo, - context.extension.extensionPath + context.extension.extensionPath, + reporter ); await razorOmnisharpDownloader.DownloadAndInstallRazorOmnisharp( diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index ce1853f205..04aa4811d9 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -26,6 +26,29 @@ export async function downloadAndInstallPackages( telemetryReporter?: ITelemetryReporter, token?: CancellationToken ): Promise { + function sendInstallationFailureTelemetry(pkg: AbsolutePathPackage, installationStage: string, error: any): void { + if (!telemetryReporter) { + return; + } + + const telemetryProperties: { [key: string]: string } = { + installStage: installationStage, + packageId: pkg.id, + isOptional: pkg.isOptional ? 'true' : 'false', + }; + + if (error instanceof NestedError && error.err instanceof PackageError) { + telemetryProperties['error.message'] = error.err.message; + telemetryProperties['error.packageUrl'] = error.err.pkg.url; + } else if (error instanceof PackageError) { + telemetryProperties['error.message'] = error.message; + telemetryProperties['error.packageUrl'] = error.pkg.url; + } + + const eventName = pkg.isOptional ? 'OptionalPackageInstallationFailed' : 'PackageInstallationFailed'; + telemetryReporter.sendTelemetryEvent(eventName, telemetryProperties); + } + eventStream.post(new PackageInstallStart()); for (const pkg of packages) { let installationStage = 'touchBeginFile'; @@ -64,24 +87,7 @@ export async function downloadAndInstallPackages( } // Send telemetry for the failure - if (telemetryReporter) { - const telemetryProperties: { [key: string]: string } = { - installStage: installationStage, - packageId: pkg.id, - isOptional: pkg.isOptional ? 'true' : 'false', - }; - - if (error instanceof NestedError && error.err instanceof PackageError) { - telemetryProperties['error.message'] = error.err.message; - telemetryProperties['error.packageUrl'] = error.err.pkg.url; - } else if (error instanceof PackageError) { - telemetryProperties['error.message'] = error.message; - telemetryProperties['error.packageUrl'] = error.pkg.url; - } - - const eventName = pkg.isOptional ? 'OptionalPackageInstallationFailed' : 'PackageInstallationFailed'; - telemetryReporter.sendTelemetryEvent(eventName, telemetryProperties); - } + sendInstallationFailureTelemetry(pkg, installationStage, error); // If the package is optional, log and continue with the next package if (pkg.isOptional) { diff --git a/src/razor/razorOmnisharpDownloader.ts b/src/razor/razorOmnisharpDownloader.ts index e87b0e3fcb..ffd433ba81 100644 --- a/src/razor/razorOmnisharpDownloader.ts +++ b/src/razor/razorOmnisharpDownloader.ts @@ -11,6 +11,7 @@ import { downloadAndInstallPackages } from '../packageManager/downloadAndInstall import { getRuntimeDependenciesPackages } from '../tools/runtimeDependencyPackageUtils'; import { getAbsolutePathPackagesToInstall } from '../packageManager/getAbsolutePathPackagesToInstall'; import { isValidDownload } from '../packageManager/isValidDownload'; +import { ITelemetryReporter } from '../shared/telemetryReporter'; export class RazorOmnisharpDownloader { public constructor( @@ -18,7 +19,8 @@ export class RazorOmnisharpDownloader { private eventStream: EventStream, private packageJSON: any, private platformInfo: PlatformInformation, - private extensionPath: string + private extensionPath: string, + private reporter?: ITelemetryReporter ) {} public async DownloadAndInstallRazorOmnisharp(version: string): Promise { @@ -39,7 +41,7 @@ export class RazorOmnisharpDownloader { this.networkSettingsProvider, this.eventStream, isValidDownload, - undefined + this.reporter ) ) { this.eventStream.post(new InstallationSuccess()); diff --git a/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts b/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts index 6047bbc87f..74d2b999f7 100644 --- a/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts +++ b/test/omnisharp/omnisharpUnitTests/omnisharpDownloader.test.ts @@ -54,8 +54,7 @@ import { modernNetVersion } from '../../../src/omnisharp/omnisharpPackageCreator eventStream, testPackageJSON, platformInfo, - extensionPath, - undefined as any + extensionPath ); server = await MockHttpsServer.CreateMockHttpsServer(); testZip = await TestZip.createTestZipAsync(createTestFile('Foo', 'foo.txt')); diff --git a/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts b/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts index 586012ca8e..78f882771e 100644 --- a/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts +++ b/test/omnisharp/omnisharpUnitTests/omnisharpManager.test.ts @@ -245,8 +245,7 @@ function GetTestOmniSharpManager( eventStream, testPackageJSON, platformInfo, - extensionPath, - undefined as any + extensionPath ); return new OmnisharpManager(downloader, platformInfo, serverUrl); } diff --git a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts index 33647e8f90..9be17a0f4b 100644 --- a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts +++ b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts @@ -87,8 +87,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); for (const elem of testZip.files) { const filePath = path.join(tmpDirPath, elem.path); @@ -101,8 +100,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(await util.fileExists(path.join(tmpDirPath, 'install.Lock'))).toBe(true); }); @@ -121,8 +119,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -156,8 +153,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -184,8 +180,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { downloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(eventBus.getEvents()).toStrictEqual(eventsSequence); }); @@ -201,8 +196,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { notDownloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); const obtainedEvents = eventBus.getEvents(); expect(obtainedEvents[0]).toStrictEqual(eventsSequence[0]); @@ -218,8 +212,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { notDownloadablePackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(await util.fileExists(path.join(tmpDirPath, 'install.Lock'))).toBe(false); }); @@ -240,8 +233,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { optionalPackage, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(result).toBe(true); }); @@ -266,8 +258,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { mixedPackages, networkSettingsProvider, eventStream, - downloadValidator, - undefined + downloadValidator ); expect(result).toBe(true); expect(await util.fileExists(path.join(tmpInstallDir2.name, 'install.Lock'))).toBe(true); @@ -285,13 +276,7 @@ describe(`${downloadAndInstallPackages.name}`, () => { ]; eventBus.getEvents(); // Clear any previous events - await downloadAndInstallPackages( - optionalPackage, - networkSettingsProvider, - eventStream, - downloadValidator, - undefined - ); + await downloadAndInstallPackages(optionalPackage, networkSettingsProvider, eventStream, downloadValidator); const obtainedEvents = eventBus.getEvents(); const installationFailureEvent = obtainedEvents.find( (event) => event instanceof InstallationFailure From bf75f6efb50fef296f72ad44738958c3caabb62d Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 15:03:02 -0700 Subject: [PATCH 22/36] Mark the roslynCopilot dependency as optional --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a08d4cc233..a2d842f480 100644 --- a/package.json +++ b/package.json @@ -414,7 +414,8 @@ "neutral" ], "installTestPath": "./.roslynCopilot/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll", - "integrity": "0BD733B23A706226F2B429AB0CE35576FB474493C8E19C7B88311007876DE5CC" + "integrity": "0BD733B23A706226F2B429AB0CE35576FB474493C8E19C7B88311007876DE5CC", + "isOptional": true }, { "id": "Debugger", From bd3a4985de4b3f7fdc7d2ade8053bdfbe487f84c Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 15:20:18 -0700 Subject: [PATCH 23/36] PR feedback --- package.json | 3 +- .../extensions/builtInComponents.ts | 2 - src/packageManager/IPackage.ts | 1 - src/packageManager/absolutePathPackage.ts | 6 +- .../downloadAndInstallPackages.ts | 55 +++++++-------- .../downloadAndInstallPackages.test.ts | 68 ------------------- 6 files changed, 28 insertions(+), 107 deletions(-) diff --git a/package.json b/package.json index a2d842f480..a08d4cc233 100644 --- a/package.json +++ b/package.json @@ -414,8 +414,7 @@ "neutral" ], "installTestPath": "./.roslynCopilot/Microsoft.VisualStudio.Copilot.Roslyn.LanguageServer.dll", - "integrity": "0BD733B23A706226F2B429AB0CE35576FB474493C8E19C7B88311007876DE5CC", - "isOptional": true + "integrity": "0BD733B23A706226F2B429AB0CE35576FB474493C8E19C7B88311007876DE5CC" }, { "id": "Debugger", diff --git a/src/lsptoolshost/extensions/builtInComponents.ts b/src/lsptoolshost/extensions/builtInComponents.ts index 119aca8bd7..9574df5556 100644 --- a/src/lsptoolshost/extensions/builtInComponents.ts +++ b/src/lsptoolshost/extensions/builtInComponents.ts @@ -27,13 +27,11 @@ export const componentInfo: { [key: string]: ComponentInfo } = { 'Microsoft.VisualStudio.DesignTools.CodeAnalysis.dll', 'Microsoft.VisualStudio.DesignTools.CodeAnalysis.Diagnostics.dll', ], - isOptional: true, }, razorDevKit: { defaultFolderName: '.razorDevKit', optionName: 'razorDevKit', componentDllPaths: ['Microsoft.VisualStudio.DevKit.Razor.dll'], - isOptional: true, }, razorExtension: { defaultFolderName: '.razorExtension', diff --git a/src/packageManager/IPackage.ts b/src/packageManager/IPackage.ts index 2ede628b38..91d0d826dc 100644 --- a/src/packageManager/IPackage.ts +++ b/src/packageManager/IPackage.ts @@ -13,5 +13,4 @@ export interface IPackage { platformId?: string; integrity?: string; isFramework?: boolean; - isOptional?: boolean; } diff --git a/src/packageManager/absolutePathPackage.ts b/src/packageManager/absolutePathPackage.ts index 578ff2d1e3..5505dc43eb 100644 --- a/src/packageManager/absolutePathPackage.ts +++ b/src/packageManager/absolutePathPackage.ts @@ -20,8 +20,7 @@ export class AbsolutePathPackage implements IPackage { public fallbackUrl?: string, public platformId?: string, public integrity?: string, - public isFramework?: boolean, - public isOptional?: boolean + public isFramework?: boolean ) {} public static getAbsolutePathPackage(pkg: Package, extensionPath: string) { @@ -37,8 +36,7 @@ export class AbsolutePathPackage implements IPackage { pkg.fallbackUrl, pkg.platformId, pkg.integrity, - pkg.isFramework, - pkg.isOptional + pkg.isFramework ); } } diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index 04aa4811d9..f213d961cb 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -26,29 +26,7 @@ export async function downloadAndInstallPackages( telemetryReporter?: ITelemetryReporter, token?: CancellationToken ): Promise { - function sendInstallationFailureTelemetry(pkg: AbsolutePathPackage, installationStage: string, error: any): void { - if (!telemetryReporter) { - return; - } - - const telemetryProperties: { [key: string]: string } = { - installStage: installationStage, - packageId: pkg.id, - isOptional: pkg.isOptional ? 'true' : 'false', - }; - - if (error instanceof NestedError && error.err instanceof PackageError) { - telemetryProperties['error.message'] = error.err.message; - telemetryProperties['error.packageUrl'] = error.err.pkg.url; - } else if (error instanceof PackageError) { - telemetryProperties['error.message'] = error.message; - telemetryProperties['error.packageUrl'] = error.pkg.url; - } - - const eventName = pkg.isOptional ? 'OptionalPackageInstallationFailed' : 'PackageInstallationFailed'; - telemetryReporter.sendTelemetryEvent(eventName, telemetryProperties); - } - + let downloadFailed = false; eventStream.post(new PackageInstallStart()); for (const pkg of packages) { let installationStage = 'touchBeginFile'; @@ -89,12 +67,7 @@ export async function downloadAndInstallPackages( // Send telemetry for the failure sendInstallationFailureTelemetry(pkg, installationStage, error); - // If the package is optional, log and continue with the next package - if (pkg.isOptional) { - continue; - } - - return false; + downloadFailed = true; } finally { try { if (await installFileExists(pkg.installPath, InstallFileType.Begin)) { @@ -106,5 +79,27 @@ export async function downloadAndInstallPackages( } } - return true; + return !downloadFailed; + + function sendInstallationFailureTelemetry(pkg: AbsolutePathPackage, installationStage: string, error: any): void { + if (!telemetryReporter) { + return; + } + + const telemetryProperties: { [key: string]: string } = { + installStage: installationStage, + packageId: pkg.id, + isOptional: pkg.isOptional ? 'true' : 'false', + }; + + if (error instanceof NestedError && error.err instanceof PackageError) { + telemetryProperties['error.message'] = error.err.message; + telemetryProperties['error.packageUrl'] = error.err.pkg.url; + } else if (error instanceof PackageError) { + telemetryProperties['error.message'] = error.message; + telemetryProperties['error.packageUrl'] = error.pkg.url; + } + + telemetryReporter.sendTelemetryEvent('PackageInstallationFailed', telemetryProperties); + } } diff --git a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts index 9be17a0f4b..9d8854a2bf 100644 --- a/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts +++ b/test/omnisharp/omnisharpUnitTests/packages/downloadAndInstallPackages.test.ts @@ -218,74 +218,6 @@ describe(`${downloadAndInstallPackages.name}`, () => { }); }); - describe('Optional packages', () => { - test('Returns true and continues when an optional package fails to download', async () => { - const optionalPackage = [ - { - url: `${server.baseUrl}/notDownloadablePackage`, - description: 'Optional Package', - installPath: new AbsolutePath(tmpDirPath), - isOptional: true, - }, - ]; - - const result = await downloadAndInstallPackages( - optionalPackage, - networkSettingsProvider, - eventStream, - downloadValidator - ); - expect(result).toBe(true); - }); - - test('Continues to install remaining packages after optional package fails', async () => { - const tmpInstallDir2 = await CreateTmpDir(true); - const mixedPackages = [ - { - url: `${server.baseUrl}/notDownloadablePackage`, - description: 'Optional Package', - installPath: new AbsolutePath(tmpDirPath), - isOptional: true, - }, - { - url: `${server.baseUrl}/downloadablePackage`, - description: packageDescription, - installPath: new AbsolutePath(tmpInstallDir2.name), - }, - ]; - - const result = await downloadAndInstallPackages( - mixedPackages, - networkSettingsProvider, - eventStream, - downloadValidator - ); - expect(result).toBe(true); - expect(await util.fileExists(path.join(tmpInstallDir2.name, 'install.Lock'))).toBe(true); - tmpInstallDir2.dispose(); - }); - - test('InstallationFailure event is logged for optional package', async () => { - const optionalPackage = [ - { - url: `${server.baseUrl}/notDownloadablePackage`, - description: 'Optional Package', - installPath: new AbsolutePath(tmpDirPath), - isOptional: true, - }, - ]; - - eventBus.getEvents(); // Clear any previous events - await downloadAndInstallPackages(optionalPackage, networkSettingsProvider, eventStream, downloadValidator); - const obtainedEvents = eventBus.getEvents(); - const installationFailureEvent = obtainedEvents.find( - (event) => event instanceof InstallationFailure - ) as InstallationFailure; - expect(installationFailureEvent).toBeDefined(); - expect(installationFailureEvent.stage).toEqual('downloadPackage'); - }); - }); - afterEach(async () => { if (tmpInstallDir) { tmpInstallDir.dispose(); From b4b22c11fc806610ceb2921c5effbfa145ee1b53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 22:40:07 +0000 Subject: [PATCH 24/36] Add logging for missing optional components and restore isOptional property Co-authored-by: JoeRobich <611219+JoeRobich@users.noreply.github.com> --- .../extensions/builtInComponents.ts | 11 ++++++++-- .../server/roslynLanguageServer.ts | 20 +++++++++++-------- src/packageManager/IPackage.ts | 1 + src/packageManager/absolutePathPackage.ts | 6 ++++-- src/razor/src/extension.ts | 2 +- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/lsptoolshost/extensions/builtInComponents.ts b/src/lsptoolshost/extensions/builtInComponents.ts index 9574df5556..d4120c1c80 100644 --- a/src/lsptoolshost/extensions/builtInComponents.ts +++ b/src/lsptoolshost/extensions/builtInComponents.ts @@ -46,14 +46,21 @@ export const componentInfo: { [key: string]: ComponentInfo } = { }, }; -export function getComponentPaths(componentName: string, options: LanguageServerOptions | undefined): string[] { +export function getComponentPaths( + componentName: string, + options: LanguageServerOptions | undefined, + channel?: { warn: (message: string) => void } +): string[] { const component = componentInfo[componentName]; const baseFolder = getComponentFolderPath(component, options); const paths = component.componentDllPaths.map((dllPath) => path.join(baseFolder, dllPath)); for (const dllPath of paths) { if (!fs.existsSync(dllPath)) { if (component.isOptional) { - // Component is optional and doesn't exist - return empty array + // Component is optional and doesn't exist - log warning and return empty array + if (channel) { + channel.warn(`Optional component '${componentName}' could not be found at '${dllPath}'.`); + } return []; } throw new Error(`Component DLL not found: ${dllPath}`); diff --git a/src/lsptoolshost/server/roslynLanguageServer.ts b/src/lsptoolshost/server/roslynLanguageServer.ts index 8d1951d1f4..6ddc1ccadc 100644 --- a/src/lsptoolshost/server/roslynLanguageServer.ts +++ b/src/lsptoolshost/server/roslynLanguageServer.ts @@ -651,7 +651,7 @@ export class RoslynLanguageServer { : razorOptions.razorServerPath; let razorComponentPath = ''; - getComponentPaths('razorExtension', languageServerOptions).forEach((extPath) => { + getComponentPaths('razorExtension', languageServerOptions, channel).forEach((extPath) => { additionalExtensionPaths.push(extPath); razorComponentPath = path.dirname(extPath); }); @@ -695,10 +695,10 @@ export class RoslynLanguageServer { // Set command enablement as soon as we know devkit is available. await vscode.commands.executeCommand('setContext', 'dotnet.server.activationContext', 'RoslynDevKit'); - const csharpDevKitArgs = this.getCSharpDevKitExportArgs(additionalExtensionPaths); + const csharpDevKitArgs = this.getCSharpDevKitExportArgs(additionalExtensionPaths, channel); args = args.concat(csharpDevKitArgs); - await this.setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, additionalExtensionPaths); + await this.setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, additionalExtensionPaths, channel); } else { // C# Dev Kit is not installed - continue C#-only activation. channel.info('Activating C# standalone...'); @@ -1012,10 +1012,13 @@ export class RoslynLanguageServer { ); } - private static getCSharpDevKitExportArgs(additionalExtensionPaths: string[]): string[] { + private static getCSharpDevKitExportArgs( + additionalExtensionPaths: string[], + channel: vscode.LogOutputChannel + ): string[] { const args: string[] = []; - const devKitDepsPath = getComponentPaths('roslynDevKit', languageServerOptions); + const devKitDepsPath = getComponentPaths('roslynDevKit', languageServerOptions, channel); if (devKitDepsPath.length > 1) { throw new Error('Expected only one devkit deps path'); } @@ -1026,7 +1029,7 @@ export class RoslynLanguageServer { // Also include the Xaml Dev Kit extensions, if enabled. if (languageServerOptions.enableXamlTools) { - getComponentPaths('xamlTools', languageServerOptions).forEach((path) => + getComponentPaths('xamlTools', languageServerOptions, channel).forEach((path) => additionalExtensionPaths.push(path) ); } @@ -1086,7 +1089,8 @@ export class RoslynLanguageServer { private static async setupDevKitEnvironment( env: NodeJS.ProcessEnv, csharpDevkitExtension: vscode.Extension, - additionalExtensionPaths: string[] + additionalExtensionPaths: string[], + channel: vscode.LogOutputChannel ): Promise { const exports: CSharpDevKitExports = await csharpDevkitExtension.activate(); @@ -1096,7 +1100,7 @@ export class RoslynLanguageServer { await exports.setupTelemetryEnvironmentAsync(env); } - getComponentPaths('roslynCopilot', languageServerOptions).forEach((extPath) => { + getComponentPaths('roslynCopilot', languageServerOptions, channel).forEach((extPath) => { additionalExtensionPaths.push(extPath); }); } diff --git a/src/packageManager/IPackage.ts b/src/packageManager/IPackage.ts index 91d0d826dc..2ede628b38 100644 --- a/src/packageManager/IPackage.ts +++ b/src/packageManager/IPackage.ts @@ -13,4 +13,5 @@ export interface IPackage { platformId?: string; integrity?: string; isFramework?: boolean; + isOptional?: boolean; } diff --git a/src/packageManager/absolutePathPackage.ts b/src/packageManager/absolutePathPackage.ts index 5505dc43eb..578ff2d1e3 100644 --- a/src/packageManager/absolutePathPackage.ts +++ b/src/packageManager/absolutePathPackage.ts @@ -20,7 +20,8 @@ export class AbsolutePathPackage implements IPackage { public fallbackUrl?: string, public platformId?: string, public integrity?: string, - public isFramework?: boolean + public isFramework?: boolean, + public isOptional?: boolean ) {} public static getAbsolutePathPackage(pkg: Package, extensionPath: string) { @@ -36,7 +37,8 @@ export class AbsolutePathPackage implements IPackage { pkg.fallbackUrl, pkg.platformId, pkg.integrity, - pkg.isFramework + pkg.isFramework, + pkg.isOptional ); } } diff --git a/src/razor/src/extension.ts b/src/razor/src/extension.ts index 8fdac6c67b..a2555ac0b7 100644 --- a/src/razor/src/extension.ts +++ b/src/razor/src/extension.ts @@ -104,7 +104,7 @@ export async function activate( await setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, logger); if (vscode.env.isTelemetryEnabled) { - const razorComponentPaths = getComponentPaths('razorDevKit', undefined); + const razorComponentPaths = getComponentPaths('razorDevKit', undefined, logger.outputChannel); if (razorComponentPaths.length !== 1) { logger.logError('Failed to find Razor DevKit telemetry extension path.', undefined); } else { From 5f0208d57dadcc6a8efafff57945cf036d4f3425 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 15:45:28 -0700 Subject: [PATCH 25/36] Remove isOptional from IPackage --- src/lsptoolshost/extensions/builtInComponents.ts | 3 ++- src/packageManager/IPackage.ts | 1 - src/packageManager/absolutePathPackage.ts | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/lsptoolshost/extensions/builtInComponents.ts b/src/lsptoolshost/extensions/builtInComponents.ts index d4120c1c80..4f67c80e28 100644 --- a/src/lsptoolshost/extensions/builtInComponents.ts +++ b/src/lsptoolshost/extensions/builtInComponents.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as vscode from 'vscode'; import * as fs from 'fs'; import * as path from 'path'; import { LanguageServerOptions } from '../../shared/options'; @@ -49,7 +50,7 @@ export const componentInfo: { [key: string]: ComponentInfo } = { export function getComponentPaths( componentName: string, options: LanguageServerOptions | undefined, - channel?: { warn: (message: string) => void } + channel?: vscode.LogOutputChannel ): string[] { const component = componentInfo[componentName]; const baseFolder = getComponentFolderPath(component, options); diff --git a/src/packageManager/IPackage.ts b/src/packageManager/IPackage.ts index 2ede628b38..91d0d826dc 100644 --- a/src/packageManager/IPackage.ts +++ b/src/packageManager/IPackage.ts @@ -13,5 +13,4 @@ export interface IPackage { platformId?: string; integrity?: string; isFramework?: boolean; - isOptional?: boolean; } diff --git a/src/packageManager/absolutePathPackage.ts b/src/packageManager/absolutePathPackage.ts index 578ff2d1e3..5505dc43eb 100644 --- a/src/packageManager/absolutePathPackage.ts +++ b/src/packageManager/absolutePathPackage.ts @@ -20,8 +20,7 @@ export class AbsolutePathPackage implements IPackage { public fallbackUrl?: string, public platformId?: string, public integrity?: string, - public isFramework?: boolean, - public isOptional?: boolean + public isFramework?: boolean ) {} public static getAbsolutePathPackage(pkg: Package, extensionPath: string) { @@ -37,8 +36,7 @@ export class AbsolutePathPackage implements IPackage { pkg.fallbackUrl, pkg.platformId, pkg.integrity, - pkg.isFramework, - pkg.isOptional + pkg.isFramework ); } } From 74c80730aa1b2f3c48bb11e436d70679cd171b66 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 15:51:05 -0700 Subject: [PATCH 26/36] Remove isOptional from IPackage --- src/packageManager/downloadAndInstallPackages.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index f213d961cb..327ae91359 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -89,7 +89,6 @@ export async function downloadAndInstallPackages( const telemetryProperties: { [key: string]: string } = { installStage: installationStage, packageId: pkg.id, - isOptional: pkg.isOptional ? 'true' : 'false', }; if (error instanceof NestedError && error.err instanceof PackageError) { From 504f41284e9a51afcd3236e180b193608f413200 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 23:48:23 +0000 Subject: [PATCH 27/36] Report more granular dependency installation results --- src/installRuntimeDependencies.ts | 19 ++++++++++++------- src/main.ts | 2 +- src/packageManager/IInstallDependencies.ts | 6 ++++-- .../downloadAndInstallPackages.ts | 13 ++++++++----- .../installRuntimeDependencies.test.ts | 12 +++++++----- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/installRuntimeDependencies.ts b/src/installRuntimeDependencies.ts index 7218d6c931..771cf8dff2 100644 --- a/src/installRuntimeDependencies.ts +++ b/src/installRuntimeDependencies.ts @@ -8,7 +8,7 @@ import { PackageInstallation, LogPlatformInfo, InstallationSuccess } from './sha import { EventStream } from './eventStream'; import { getRuntimeDependenciesPackages } from './tools/runtimeDependencyPackageUtils'; import { getAbsolutePathPackagesToInstall } from './packageManager/getAbsolutePathPackagesToInstall'; -import IInstallDependencies from './packageManager/IInstallDependencies'; +import { DependencyInstallationResults, IInstallDependencies } from './packageManager/IInstallDependencies'; import { AbsolutePathPackage } from './packageManager/absolutePathPackage'; export async function installRuntimeDependencies( @@ -19,7 +19,7 @@ export async function installRuntimeDependencies( platformInfo: PlatformInformation, useFramework: boolean, requiredPackageIds: string[] -): Promise { +): Promise { const runTimeDependencies = getRuntimeDependenciesPackages(packageJSON); const packagesToInstall = await getAbsolutePathPackagesToInstall(runTimeDependencies, platformInfo, extensionPath); const filteredPackages = filterOmniSharpPackage(packagesToInstall, useFramework); @@ -30,15 +30,20 @@ export async function installRuntimeDependencies( // Display platform information and RID eventStream.post(new LogPlatformInfo(platformInfo)); - if (await installDependencies(filteredRequiredPackages)) { + const installationResults = await installDependencies(filteredRequiredPackages); + + const failedPackages = Object.entries(installationResults) + .filter(([, installed]) => !installed) + .map(([name]) => name); + if (failedPackages.length === 0) { eventStream.post(new InstallationSuccess()); - } else { - return false; } + + return installationResults; } - //All the required packages are already downloaded and installed - return true; + // There was nothing to install + return {}; } function filterOmniSharpPackage(packages: AbsolutePathPackage[], useFramework: boolean) { diff --git a/src/main.ts b/src/main.ts index b001f2eb35..6c1a80cdda 100644 --- a/src/main.ts +++ b/src/main.ts @@ -119,7 +119,7 @@ export async function activate( } else { const getCoreClrDebugPromise = async (languageServerStartedPromise: Promise) => { let coreClrDebugPromise = Promise.resolve(); - if (runtimeDependenciesExist) { + if (runtimeDependenciesExist['Debugger']) { // activate coreclr-debug coreClrDebugPromise = coreclrdebug.activate( context.extension, diff --git a/src/packageManager/IInstallDependencies.ts b/src/packageManager/IInstallDependencies.ts index 6ca5a476f1..cfaf2191a7 100644 --- a/src/packageManager/IInstallDependencies.ts +++ b/src/packageManager/IInstallDependencies.ts @@ -5,6 +5,8 @@ import { AbsolutePathPackage } from './absolutePathPackage'; -export default interface IInstallDependencies { - (packages: AbsolutePathPackage[]): Promise; +export type DependencyInstallationResults = { [name: string]: boolean }; + +export interface IInstallDependencies { + (packages: AbsolutePathPackage[]): Promise; } diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index 327ae91359..b0e747a6b8 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -17,6 +17,7 @@ import { PackageInstallStart } from '../shared/loggingEvents'; import { DownloadValidator } from './isValidDownload'; import { CancellationToken } from 'vscode'; import { ITelemetryReporter } from '../shared/telemetryReporter'; +import { DependencyInstallationResults } from './IInstallDependencies'; export async function downloadAndInstallPackages( packages: AbsolutePathPackage[], @@ -25,9 +26,9 @@ export async function downloadAndInstallPackages( downloadValidator: DownloadValidator, telemetryReporter?: ITelemetryReporter, token?: CancellationToken -): Promise { - let downloadFailed = false; +): Promise { eventStream.post(new PackageInstallStart()); + const results: DependencyInstallationResults = {}; for (const pkg of packages) { let installationStage = 'touchBeginFile'; try { @@ -51,12 +52,16 @@ export async function downloadAndInstallPackages( await InstallZip(buffer, pkg.description, pkg.installPath, pkg.binaries, eventStream); installationStage = 'touchLockFile'; await touchInstallFile(pkg.installPath, InstallFileType.Lock); + results[pkg.id] = true; break; } else { eventStream.post(new IntegrityCheckFailure(pkg.description, pkg.url, willTryInstallingPackage())); + results[pkg.id] = false; } } } catch (error) { + results[pkg.id] = false; + if (error instanceof NestedError) { const packageError = new PackageError(error.message, pkg, error.err); eventStream.post(new InstallationFailure(installationStage, packageError)); @@ -66,8 +71,6 @@ export async function downloadAndInstallPackages( // Send telemetry for the failure sendInstallationFailureTelemetry(pkg, installationStage, error); - - downloadFailed = true; } finally { try { if (await installFileExists(pkg.installPath, InstallFileType.Begin)) { @@ -79,7 +82,7 @@ export async function downloadAndInstallPackages( } } - return !downloadFailed; + return results; function sendInstallationFailureTelemetry(pkg: AbsolutePathPackage, installationStage: string, error: any): void { if (!telemetryReporter) { diff --git a/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts b/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts index e1a3b89f70..08eaf30900 100644 --- a/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts +++ b/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts @@ -5,7 +5,7 @@ import { describe, test, expect, beforeEach } from '@jest/globals'; import { installRuntimeDependencies } from '../../../src/installRuntimeDependencies'; -import IInstallDependencies from '../../../src/packageManager/IInstallDependencies'; +import { IInstallDependencies } from '../../../src/packageManager/IInstallDependencies'; import { EventStream } from '../../../src/eventStream'; import { PlatformInformation } from '../../../src/shared/platform'; import TestEventBus from './testAssets/testEventBus'; @@ -28,7 +28,8 @@ describe(`${installRuntimeDependencies.name}`, () => { beforeEach(() => { eventStream = new EventStream(); eventBus = new TestEventBus(eventStream); - installDependencies = async () => Promise.resolve(true); + installDependencies = async (packages) => + Promise.resolve(packages.reduce((acc, pkg) => ({ ...acc, [pkg.id]: true }), {})); }); describe('When all the dependencies already exist', () => { @@ -90,7 +91,7 @@ describe(`${installRuntimeDependencies.name}`, () => { let inputPackage: AbsolutePathPackage[]; installDependencies = async (packages) => { inputPackage = packages; - return Promise.resolve(true); + return Promise.resolve(packages.reduce((acc, pkg) => ({ ...acc, [pkg.id]: true }), {})); }; const installed = await installRuntimeDependencies( @@ -111,7 +112,8 @@ describe(`${installRuntimeDependencies.name}`, () => { }); test('Returns false when installDependencies returns false', async () => { - installDependencies = async () => Promise.resolve(false); + installDependencies = async (packages) => + Promise.resolve(packages.reduce((acc, pkg) => ({ ...acc, [pkg.id]: false }), {})); const installed = await installRuntimeDependencies( packageJSON, extensionPath, @@ -121,7 +123,7 @@ describe(`${installRuntimeDependencies.name}`, () => { useFramework, ['myPackage'] ); - expect(installed).toBe(false); + expect(installed['myPackage']).toBe(false); }); }); }); From 2f7cebe53634fa94345af21eb9dc6dac6d95b8c0 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Wed, 15 Oct 2025 23:52:28 +0000 Subject: [PATCH 28/36] Fix up tests --- .../omnisharpUnitTests/installRuntimeDependencies.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts b/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts index 08eaf30900..0ce27b8f82 100644 --- a/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts +++ b/test/omnisharp/omnisharpUnitTests/installRuntimeDependencies.test.ts @@ -49,7 +49,9 @@ describe(`${installRuntimeDependencies.name}`, () => { useFramework, ['Debugger', 'Omnisharp', 'Razor'] ); - expect(installed).toBe(true); + expect(installed['Debugger']).toBe(true); + expect(installed['Omnisharp']).toBe(true); + expect(installed['Razor']).toBe(true); }); test("Doesn't log anything to the eventStream", async () => { @@ -103,7 +105,7 @@ describe(`${installRuntimeDependencies.name}`, () => { useFramework, ['myPackage'] ); - expect(installed).toBe(true); + expect(installed['myPackage']).toBe(true); isNotNull(inputPackage!); expect(inputPackage).toHaveLength(1); expect(inputPackage[0]).toStrictEqual( From 6f63cf6e8c84bc8fba8a35b870032bf2c3fa8a50 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Thu, 16 Oct 2025 00:01:20 +0000 Subject: [PATCH 29/36] Fixup remaining usage of downloadAndInstallPackages --- src/main.ts | 2 +- src/omnisharp/omnisharpDownloader.ts | 20 +++++++++++--------- src/razor/razorOmnisharpDownloader.ts | 20 +++++++++++--------- tasks/offlinePackagingTasks.ts | 17 +++++++++++++---- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/main.ts b/src/main.ts index 6c1a80cdda..434e2e9c52 100644 --- a/src/main.ts +++ b/src/main.ts @@ -17,7 +17,7 @@ import { vscodeNetworkSettingsProvider } from './networkSettings'; import createOptionStream from './shared/observables/createOptionStream'; import { AbsolutePathPackage } from './packageManager/absolutePathPackage'; import { downloadAndInstallPackages } from './packageManager/downloadAndInstallPackages'; -import IInstallDependencies from './packageManager/IInstallDependencies'; +import { IInstallDependencies } from './packageManager/IInstallDependencies'; import { installRuntimeDependencies } from './installRuntimeDependencies'; import { isValidDownload } from './packageManager/isValidDownload'; import { MigrateOptions } from './shared/migrateOptions'; diff --git a/src/omnisharp/omnisharpDownloader.ts b/src/omnisharp/omnisharpDownloader.ts index 8b3ad510ea..dd0ea5bab0 100644 --- a/src/omnisharp/omnisharpDownloader.ts +++ b/src/omnisharp/omnisharpDownloader.ts @@ -53,15 +53,17 @@ export class OmnisharpDownloader { if (packagesToInstall.length > 0) { this.eventStream.post(new PackageInstallation(`OmniSharp Version = ${version}`)); this.eventStream.post(new LogPlatformInfo(this.platformInfo)); - if ( - await downloadAndInstallPackages( - packagesToInstall, - this.networkSettingsProvider, - this.eventStream, - isValidDownload, - this.reporter - ) - ) { + const installationResults = await downloadAndInstallPackages( + packagesToInstall, + this.networkSettingsProvider, + this.eventStream, + isValidDownload, + this.reporter + ); + const failedPackages = Object.entries(installationResults) + .filter(([, installed]) => !installed) + .map(([name]) => name); + if (failedPackages.length === 0) { this.eventStream.post(new InstallationSuccess()); return true; } diff --git a/src/razor/razorOmnisharpDownloader.ts b/src/razor/razorOmnisharpDownloader.ts index ffd433ba81..83ffd4edc5 100644 --- a/src/razor/razorOmnisharpDownloader.ts +++ b/src/razor/razorOmnisharpDownloader.ts @@ -35,15 +35,17 @@ export class RazorOmnisharpDownloader { if (packagesToInstall.length > 0) { this.eventStream.post(new PackageInstallation(`Razor OmniSharp Version = ${version}`)); this.eventStream.post(new LogPlatformInfo(this.platformInfo)); - if ( - await downloadAndInstallPackages( - packagesToInstall, - this.networkSettingsProvider, - this.eventStream, - isValidDownload, - this.reporter - ) - ) { + const installationResults = await downloadAndInstallPackages( + packagesToInstall, + this.networkSettingsProvider, + this.eventStream, + isValidDownload, + this.reporter + ); + const failedPackages = Object.entries(installationResults) + .filter(([, installed]) => !installed) + .map(([name]) => name); + if (failedPackages.length === 0) { this.eventStream.post(new InstallationSuccess()); return true; } diff --git a/tasks/offlinePackagingTasks.ts b/tasks/offlinePackagingTasks.ts index fb9714b4c9..af16c0e1a0 100644 --- a/tasks/offlinePackagingTasks.ts +++ b/tasks/offlinePackagingTasks.ts @@ -280,10 +280,19 @@ async function installPackageJsonDependency( codeExtensionPath ); const provider = () => new NetworkSettings('', true); - if ( - !(await downloadAndInstallPackages(packagesToInstall, provider, eventStream, isValidDownload, undefined, token)) - ) { - throw Error('Failed to download package.'); + const installationResults = await downloadAndInstallPackages( + packagesToInstall, + provider, + eventStream, + isValidDownload, + undefined, + token + ); + const failedPackages = Object.entries(installationResults) + .filter(([, installed]) => !installed) + .map(([name]) => name); + if (failedPackages.length > 0) { + throw Error('The following packages failed to install: ' + failedPackages.join(', ')); } } From ef03174d81e5a34b67a6fb84165df4db0d84cb10 Mon Sep 17 00:00:00 2001 From: Joey Robichaud Date: Thu, 16 Oct 2025 13:26:00 +0000 Subject: [PATCH 30/36] Return installation status for already installed dependencies --- src/installRuntimeDependencies.ts | 40 +++++++++++-------- src/packageManager/IInstallDependencies.ts | 4 +- .../downloadAndInstallPackages.ts | 6 +-- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/installRuntimeDependencies.ts b/src/installRuntimeDependencies.ts index 771cf8dff2..3cdab86cd2 100644 --- a/src/installRuntimeDependencies.ts +++ b/src/installRuntimeDependencies.ts @@ -8,7 +8,7 @@ import { PackageInstallation, LogPlatformInfo, InstallationSuccess } from './sha import { EventStream } from './eventStream'; import { getRuntimeDependenciesPackages } from './tools/runtimeDependencyPackageUtils'; import { getAbsolutePathPackagesToInstall } from './packageManager/getAbsolutePathPackagesToInstall'; -import { DependencyInstallationResults, IInstallDependencies } from './packageManager/IInstallDependencies'; +import { DependencyInstallationStatus, IInstallDependencies } from './packageManager/IInstallDependencies'; import { AbsolutePathPackage } from './packageManager/absolutePathPackage'; export async function installRuntimeDependencies( @@ -19,31 +19,39 @@ export async function installRuntimeDependencies( platformInfo: PlatformInformation, useFramework: boolean, requiredPackageIds: string[] -): Promise { +): Promise { const runTimeDependencies = getRuntimeDependenciesPackages(packageJSON); const packagesToInstall = await getAbsolutePathPackagesToInstall(runTimeDependencies, platformInfo, extensionPath); + + // PackagesToInstall will only return packages that are not already installed. However, + // we need to return the installation status of all required packages, so we need to + // track which required packages are already installed, so that we can return true for them. + const installedPackages = requiredPackageIds.filter( + (id) => packagesToInstall.find((pkg) => pkg.id === id) === undefined + ); + const installedPackagesResults = installedPackages.reduce((acc, id) => ({ ...acc, [id]: true }), {}); + const filteredPackages = filterOmniSharpPackage(packagesToInstall, useFramework); const filteredRequiredPackages = filteredRequiredPackage(requiredPackageIds, filteredPackages); - if (filteredRequiredPackages.length > 0) { - eventStream.post(new PackageInstallation('C# dependencies')); - // Display platform information and RID - eventStream.post(new LogPlatformInfo(platformInfo)); + if (filteredRequiredPackages.length === 0) { + return installedPackagesResults; + } - const installationResults = await installDependencies(filteredRequiredPackages); + eventStream.post(new PackageInstallation('C# dependencies')); + // Display platform information and RID + eventStream.post(new LogPlatformInfo(platformInfo)); - const failedPackages = Object.entries(installationResults) - .filter(([, installed]) => !installed) - .map(([name]) => name); - if (failedPackages.length === 0) { - eventStream.post(new InstallationSuccess()); - } + const installationResults = await installDependencies(filteredRequiredPackages); - return installationResults; + const failedPackages = Object.entries(installationResults) + .filter(([, installed]) => !installed) + .map(([name]) => name); + if (failedPackages.length === 0) { + eventStream.post(new InstallationSuccess()); } - // There was nothing to install - return {}; + return { ...installedPackagesResults, ...installationResults }; } function filterOmniSharpPackage(packages: AbsolutePathPackage[], useFramework: boolean) { diff --git a/src/packageManager/IInstallDependencies.ts b/src/packageManager/IInstallDependencies.ts index cfaf2191a7..d4c12b3cfc 100644 --- a/src/packageManager/IInstallDependencies.ts +++ b/src/packageManager/IInstallDependencies.ts @@ -5,8 +5,8 @@ import { AbsolutePathPackage } from './absolutePathPackage'; -export type DependencyInstallationResults = { [name: string]: boolean }; +export type DependencyInstallationStatus = { [name: string]: boolean }; export interface IInstallDependencies { - (packages: AbsolutePathPackage[]): Promise; + (packages: AbsolutePathPackage[]): Promise; } diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index b0e747a6b8..da39e0e352 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -17,7 +17,7 @@ import { PackageInstallStart } from '../shared/loggingEvents'; import { DownloadValidator } from './isValidDownload'; import { CancellationToken } from 'vscode'; import { ITelemetryReporter } from '../shared/telemetryReporter'; -import { DependencyInstallationResults } from './IInstallDependencies'; +import { DependencyInstallationStatus } from './IInstallDependencies'; export async function downloadAndInstallPackages( packages: AbsolutePathPackage[], @@ -26,9 +26,9 @@ export async function downloadAndInstallPackages( downloadValidator: DownloadValidator, telemetryReporter?: ITelemetryReporter, token?: CancellationToken -): Promise { +): Promise { eventStream.post(new PackageInstallStart()); - const results: DependencyInstallationResults = {}; + const results: DependencyInstallationStatus = {}; for (const pkg of packages) { let installationStage = 'touchBeginFile'; try { From 97a37df414622e7514e8bfce2c75096cdf0ce66f Mon Sep 17 00:00:00 2001 From: David Wengier Date: Mon, 20 Oct 2025 11:01:15 +1100 Subject: [PATCH 31/36] Bump Razor to 10.0.0-preview.25517.9 --- CHANGELOG.md | 8 +++++++- package.json | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09a644f053..45a6cc6053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,10 +12,16 @@ * Improve diagnostic quality for less accessible base type argument (PR: [#80483](https://github.com/dotnet/roslyn/pull/80483)) * Build BuildHost against net8.0 (PR: [#80641](https://github.com/dotnet/roslyn/pull/80641)) * Add completion for directives in file based programs (PR: [#80410](https://github.com/dotnet/roslyn/pull/80410)) -* Bump Razor to 10.0.0-preview.25512.6 (PR: [#8694](https://github.com/dotnet/vscode-csharp/pull/8694)) +* Bump Razor to 10.0.0-preview.25517.9 (PR: [#8704](https://github.com/dotnet/vscode-csharp/pull/8704)) * Provide a way for users to turn on logging for formatting, to help resolve bugs (PR: [#12304](https://github.com/dotnet/razor/pull/12304)) * Handle diagnostic spans that cover an entire attribute value (PR: [#12302](https://github.com/dotnet/razor/pull/12302)) * Map component start tags to C#, for better GTD, FAR, Hover, etc. (PR: [#12287](https://github.com/dotnet/razor/pull/12287)) + * Add snippet support for component completion with EditorRequired attributes (PR: [#12325](https://github.com/dotnet/razor/pull/12325)) + * Add Go To Definition support for file paths in string literals (PR: [#12323](https://github.com/dotnet/razor/pull/12323)) + * Add IntelliSense support for Blazor enhanced navigation and form handling data attributes (PR: [#12324](https://github.com/dotnet/razor/pull/12324)) + * Fix component end tags to behave consistently with start tags for Hover, Go To Definition, and Find All References (PR: [#12327](https://github.com/dotnet/razor/pull/12327)) + * Add out-of-scope Blazor Component completions with auto-insert @using statements (PR: [#12336](https://github.com/dotnet/razor/pull/12336)) + * Fix classification for fully qualified components (PR: [#12335](https://github.com/dotnet/razor/pull/12335)) # 2.94.x * Add completion for razor components in settings (PR: [#8680](https://github.com/dotnet/vscode-csharp/pull/8680)) diff --git a/package.json b/package.json index a08d4cc233..fe7b64889a 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "defaults": { "roslyn": "5.3.0-1.25514.3", "omniSharp": "1.39.14", - "razor": "10.0.0-preview.25512.6", + "razor": "10.0.0-preview.25517.9", "razorOmnisharp": "7.0.0-preview.23363.1", "xamlTools": "18.0.11023.10" }, From 2567c3ab493e041e5c59f89d181e5f081c4739d7 Mon Sep 17 00:00:00 2001 From: David Wengier Date: Mon, 20 Oct 2025 11:02:07 +1100 Subject: [PATCH 32/36] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45a6cc6053..5ec0f49cff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ * Improve diagnostic quality for less accessible base type argument (PR: [#80483](https://github.com/dotnet/roslyn/pull/80483)) * Build BuildHost against net8.0 (PR: [#80641](https://github.com/dotnet/roslyn/pull/80641)) * Add completion for directives in file based programs (PR: [#80410](https://github.com/dotnet/roslyn/pull/80410)) -* Bump Razor to 10.0.0-preview.25517.9 (PR: [#8704](https://github.com/dotnet/vscode-csharp/pull/8704)) +* Bump Razor to 10.0.0-preview.25517.9 (PR: [#8706](https://github.com/dotnet/vscode-csharp/pull/8706)) * Provide a way for users to turn on logging for formatting, to help resolve bugs (PR: [#12304](https://github.com/dotnet/razor/pull/12304)) * Handle diagnostic spans that cover an entire attribute value (PR: [#12302](https://github.com/dotnet/razor/pull/12302)) * Map component start tags to C#, for better GTD, FAR, Hover, etc. (PR: [#12287](https://github.com/dotnet/razor/pull/12287)) From 04319cdef8efcf58a99c5f2d3abd87607f2ba12a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Oct 2025 18:08:30 +0000 Subject: [PATCH 33/36] Initial plan From b7f42e23d5df24fb849495aae243c67970bb8f8f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Oct 2025 18:16:16 +0000 Subject: [PATCH 34/36] Remove editor.formatOnType default configuration for C# Co-authored-by: dibarbet <5749229+dibarbet@users.noreply.github.com> --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index fe7b64889a..f2f2784bfb 100644 --- a/package.json +++ b/package.json @@ -5626,9 +5626,6 @@ "[xaml]": { "editor.wordBasedSuggestions": "off" }, - "[csharp]": { - "editor.formatOnType": true - }, "explorer.fileNesting.patterns": { "*.cs": "${capture}.designer.cs,${capture}.g.cs,${capture}.generated.cs,${capture}.run.json,${capture}.settings.json,${capture}.settings.*.json", "*.csproj": "${capture}.csproj.user", From bf6cba38357a415859b4a39091942b566bd37024 Mon Sep 17 00:00:00 2001 From: Andrew Wang Date: Tue, 21 Oct 2025 16:28:11 -0700 Subject: [PATCH 35/36] Update Debugger to v2.95.0 (#8710) This updates to a new version of the debugger with the following changes: - Updates the underlying managed<->native marshalling technology that the debugger is implemented with to use COM Wrapper, which includes this potential breaking change to Concord extensions: https://github.com/microsoft/ConcordExtensibilitySamples/issues/124 - Numerous bug fixes to match what is shipping with Visual Studio 18.0 --- package.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index f2f2784bfb..26aa8e4180 100644 --- a/package.json +++ b/package.json @@ -419,7 +419,7 @@ { "id": "Debugger", "description": ".NET Core Debugger (Windows / x64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-win7-x64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-win7-x64.zip", "installPath": ".debugger/x86_64", "platforms": [ "win32" @@ -429,12 +429,12 @@ "arm64" ], "installTestPath": "./.debugger/x86_64/vsdbg-ui.exe", - "integrity": "C25E19B3DBAE55DBBBD7384561E34064CDB92633A816FFB862E68635221A63EC" + "integrity": "9A8766F5B62BC2D7AE80016323B093AD75E822399329DEA32C282187005EBE38" }, { "id": "Debugger", "description": ".NET Core Debugger (Windows / ARM64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-win10-arm64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-win10-arm64.zip", "installPath": ".debugger/arm64", "platforms": [ "win32" @@ -443,12 +443,12 @@ "arm64" ], "installTestPath": "./.debugger/arm64/vsdbg-ui.exe", - "integrity": "F8F9DE062D0678CFF808B8BC9AADC59C7C39253B1249DE2F9CF3037163D8049F" + "integrity": "6D495C5DA79179ED78DE03C6C623A4BC022919A58FAC486506DC5917EC68F426" }, { "id": "Debugger", "description": ".NET Core Debugger (macOS / x64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-osx-x64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-osx-x64.zip", "installPath": ".debugger/x86_64", "platforms": [ "darwin" @@ -462,12 +462,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/x86_64/vsdbg-ui", - "integrity": "D1817389B6A1254BDDD8798AD866D6E1AC47740D05E138C060C387C0A53A7925" + "integrity": "72A0BFD3F43D7B3C5CC2091BFB5385BF767370AC59FE88548E28912714FEB4D7" }, { "id": "Debugger", "description": ".NET Core Debugger (macOS / arm64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-osx-arm64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-osx-arm64.zip", "installPath": ".debugger/arm64", "platforms": [ "darwin" @@ -480,12 +480,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/arm64/vsdbg-ui", - "integrity": "089C742676FD1627ECCF3AAF1643ECCFC654FCED9C0D1E803780CB9C2E1FE355" + "integrity": "08DFFB990A9CBD1A74405C0FB601C3136021E4CBB7ADB2ACEA9A36EBFEB651FE" }, { "id": "Debugger", "description": ".NET Core Debugger (linux / ARM)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-linux-arm.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-linux-arm.zip", "installPath": ".debugger", "platforms": [ "linux" @@ -498,12 +498,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "64DF1D83556A3E33664122B10D94787AF10E54129362D6E8A63F8AA3B47035D3" + "integrity": "1D7E7A1B260347C5D6BFF4BC63FF23A01315B3E180356B3F6E3A974677A3D9C4" }, { "id": "Debugger", "description": ".NET Core Debugger (linux / ARM64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-linux-arm64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-linux-arm64.zip", "installPath": ".debugger", "platforms": [ "linux" @@ -516,12 +516,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "578A61AE844470B7D1814AA8A0A49E21069F68CA16F661648AF85F68DC08BC9D" + "integrity": "27C2301B9DB13FBF26579788084981ED4C516646D296ECD8CAE40E0FDDE5C042" }, { "id": "Debugger", "description": ".NET Core Debugger (linux musl / x64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-linux-musl-x64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-linux-musl-x64.zip", "installPath": ".debugger", "platforms": [ "linux-musl" @@ -534,12 +534,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "5636C90B08D2849C13E198036B467F73080694CC9D5BF7422B04EA25B27633F9" + "integrity": "DD8BC256154E2BD13974D0ACDA2B2EA58593ABB7A553270487A74E0CDDA83249" }, { "id": "Debugger", "description": ".NET Core Debugger (linux musl / ARM64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-linux-musl-arm64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-linux-musl-arm64.zip", "installPath": ".debugger", "platforms": [ "linux-musl" @@ -552,12 +552,12 @@ "./vsdbg" ], "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "BF668378285B814949F39718D559D976C7ED0C1575A248370F282210AF513B2E" + "integrity": "1EC09737FA083099F2A03B9B7DF70E813B602A4FCAB50B3FD0CB6F2C46D127F1" }, { "id": "Debugger", "description": ".NET Core Debugger (linux / x64)", - "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-90-0/coreclr-debug-linux-x64.zip", + "url": "https://vsdebugger-cyg0dxb6czfafzaz.b01.azurefd.net/coreclr-debug-2-95-0/coreclr-debug-linux-x64.zip", "installPath": ".debugger", "platforms": [ "linux" @@ -570,7 +570,7 @@ "./vsdbg" ], "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "085CDC403578B24F8335BAFA1B7D62E48FFFEE80419DFA41C6D48D8DBADF95D7" + "integrity": "2B0920ADEC91DA9CE18026CD020488A603C904B4DBE80B30B61337F38B6533F9" }, { "id": "RazorOmnisharp", From 9b40017fa7a6a97f7d717f7d49a18c7708f0bd61 Mon Sep 17 00:00:00 2001 From: siramvikram Date: Wed, 22 Oct 2025 18:39:12 +0000 Subject: [PATCH 36/36] Update main version --- CHANGELOG.md | 2 ++ version.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ec0f49cff..4068b4b6a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ - Diagnostics related feature requests and improvements [#5951](https://github.com/dotnet/vscode-csharp/issues/5951) - Debug from .csproj and .sln [#5876](https://github.com/dotnet/vscode-csharp/issues/5876) +# 2.96.x + # 2.95.x * Update RoslynCopilot url to 18.0.898-alpha (PR: [#8696](https://github.com/dotnet/vscode-csharp/pull/8696)) * Bump Roslyn to 5.3.0-1.25514.3 (PR: [#8700](https://github.com/dotnet/vscode-csharp/pull/8700)) diff --git a/version.json b/version.json index 6777f550fc..61ed86f69a 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "2.95", + "version": "2.96", "publicReleaseRefSpec": [ "^refs/heads/release$", "^refs/heads/prerelease$",