From cc121288b20f05289d133d4c97810b571d25d594 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 1 Sep 2024 06:33:54 +0000 Subject: [PATCH] [post-patch] patching at 2024-09-01 06:33 --- .eslintrc.js | 6 - .npmrc | 2 - LICENSE.txt | 4 +- README.md | 112 +++-- .../dependencies/OpenDebugAD7-License.txt | 120 ----- RuntimeLicenses/license.txt | 426 ++++++++++++------ images/csharpIcon.png | Bin 41371 -> 49396 bytes .../integrationHelpers.ts | 10 +- package.json | 169 ++----- src/constants/csharpExtensionId.ts | 2 +- src/coreclrDebug/activate.ts | 58 ++- src/features/dotnetTest.ts | 2 +- src/lsptoolshost/roslynLanguageServer.ts | 28 +- src/main.ts | 15 - src/observers/telemetryObserver.ts | 1 - .../downloadAndInstallPackages.ts | 7 +- src/razor/razor.ts | 3 - src/razor/src/extension.ts | 30 +- src/razor/src/razorExtensionId.ts | 2 +- src/razor/src/razorLanguageServerClient.ts | 14 +- src/shared/projectConfiguration.ts | 4 +- src/tools/OptionsSchema.json | 10 +- test/integrationTests/integrationHelpers.ts | 8 +- 23 files changed, 465 insertions(+), 568 deletions(-) delete mode 100644 .npmrc delete mode 100644 RuntimeLicenses/dependencies/OpenDebugAD7-License.txt diff --git a/.eslintrc.js b/.eslintrc.js index 5a1fd3933..5eda97904 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,12 +46,6 @@ module.exports = { ] } ], - "header/header": [ 2, "block", [ - "---------------------------------------------------------------------------------------------", - " * Copyright (c) Microsoft Corporation. All rights reserved.", - " * Licensed under the MIT License. See License.txt in the project root for license information.", - " *--------------------------------------------------------------------------------------------" - ]] }, ignorePatterns: [ "out/", diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 8c8d2b239..000000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ -always-auth=true \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 389b65e78..24feaaeb7 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,8 @@ MIT License -Copyright (c) .NET Foundation and Contributors +Copyright (c) Blipk A.D. and Contributors for Current Work and Modifications in This Fork, +Copyright (c) Muhammad Sammy and Contributors for Current Work and Modifications in Their Fork. +Original Work Copyright (c) .NET Foundation and Contributors All Rights Reserved Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/README.md b/README.md index 2e4587b3c..ccb0fb06c 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,79 @@ -## C# for Visual Studio Code -A [Visual Studio Code](https://code.visualstudio.com/) [extension](https://marketplace.visualstudio.com/VSCode) that provides rich language support for C# and is shipped along with [C# Dev Kit][csdevkitextension]. Powered by a Language Server Protocol (LSP) server, this extension integrates with open source components like [Roslyn](https://github.com/dotnet/roslyn) and [Razor](https://github.com/dotnet/razor) to provide rich type information and a faster, more reliable C# experience. +# C# with NetCoreDbg -## Recommended Install -While it is possible to use the C# extension as a standalone extension, we highly recommend using [C# Dev Kit][csdevkitextension]. +The debugger included in the official C# extension is [proprietary](https://aka.ms/VSCode-DotNet-DbgLicense) and is licensed to only work with Microsoft versions of vscode. -1. Installing [C# Dev Kit][csdevkitextension] will automatically install this extension as a required dependency. -2. Open a folder/workspace that contains a C# project (.csproj) and a C# solution (.sln) and the extension will activate. -3. Whether you install C# Dev Kit or just the C# extension, the [.NET Install Tool](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.vscode-dotnet-runtime) will be installed as a dependency. +This extension replaces it with Samsung's [MIT-licensed](https://github.com/Samsung/netcoredbg/blob/master/LICENSE) alternative, [NetCoreDbg](https://github.com/Samsung/netcoredbg). -Note: If working on a solution that requires versions prior to .NET 6 or non-solution based projects, install a .NET Framework runtime and [MSBuild tooling](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022). - * Set omnisharp.useModernNet to false and set dotnet.server.useOmnisharp to true - * Uninstall or disable C# Dev Kit - * Windows: .NET Framework along with [MSBuild Tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) - * MacOS/Linux: [Mono with MSBuild](https://www.mono-project.com/download/preview/) +This extension is always kept up to date by applying a series of patches to the [official C# extension](https://github.com/dotnet/vscode-csharp) when changes are detected in their repository. -## Features -Learn more about the rich features of the C# extension: - * [Refactoring](https://code.visualstudio.com/docs/csharp/refactoring): Edit your code with code fixes and refactorings - * [Navigation](https://code.visualstudio.com/docs/csharp/navigate-edit): Explore and navigate your code with features like Go To Definition and Find All References - * [IntelliSense](https://code.visualstudio.com/docs/csharp/navigate-edit): Write code with auto-completion - * [Formatting and Linting](https://code.visualstudio.com/docs/csharp/formatting-linting): Format and lint your code +Patches originally based on changes made in [free-vscode-csharp](https://github.com/muhammadsammy/free-vscode-csharp). -For more information you can: -- [Follow our C# tutorial](https://code.visualstudio.com/docs/csharp/get-started) with step-by-step instructions for building a simple app. -- Check out the [C# documentation](https://code.visualstudio.com/docs/languages/csharp) on the VS Code site for general information about using the extension. +#### Download this extension -## How to use OmniSharp? -If you don’t want to take advantage of the great Language Server features, you can revert back to using OmniSharp by going to the Extension settings and setting `dotnet.server.useOmnisharp` to true. Next, uninstall or disable C# Dev Kit. Finally, restart VS Code for this to take effect. +- Download the vsix file from the [latest release assets](https://github.com/blipk/vscodium-csharp/releases/latest). -## Found a Bug? -To file a new issue: +- Download the extension vsix from [latest CI run artifacts](https://github.com/blipk/vscodium-csharp/actions/workflows/ci-build.yml). -1. Open the Command Palette with Ctrl+Shift+P (Cmd+Shift+P on macOS), type "Open Settings (UI)", and press Enter. -2. Search for "trace" in the search bar. Under "Dotnet > Server: Trace" select "Trace" from the drop down. This will provide more output information. -3. Reload the window by opening the Command Palette with Ctrl+Shift+P (Cmd+Shift+P on macOS), type "Reload Window", and press Enter. -4. Next, check the C# logs in the Output Window by opening it with Ctrl+Shift+U (Cmd+Shift+U on macOS), and select C# from the dropdown. -5. Select and copy all the text in the log, and then report the issue through VS Code. -6. Open the Command Palette with Ctrl+Shift+P (Cmd+Shift+P on macOS), type “CSharp: Report an issue”, and press Enter. -7. This will open a window with all the necessary information related to the C# extension, dotnet version, mono version, etc. -8. Paste the previously copied C# log into the “Steps to Reproduce” field. Please also include a description of what you were doing/attempting to do at the time the problem occurred. -9. Click the “Preview on GitHub” button, and then file the issue. +- This extension is published at [Open VSX](https://open-vsx.org/extension/blipk/csharp). -Alternatively, you could visit https://github.com/dotnet/vscode-csharp/issues and file a new issue there. +#### Install this extension -## Contributing +Open the command pallete (`Ctrl+Shift+P`) then run `Extensions: Install from VSIX` -### License +Alternatively go to the extensions tab and click the `...` and select `Install from VSIX` -Copyright © .NET Foundation, and contributors. +Either option will prompt you to choose the vsix file you downloaded for your platform -The Microsoft C# extension is subject to [these license terms](RuntimeLicenses/license.txt). -The source code to this extension is available on [https://github.com/dotnet/vscode-csharp](https://github.com/dotnet/vscode-csharp) and licensed under the [MIT license](LICENSE.txt). +#### Post-Installation -### Code of Conduct +1. You must disable the official C# extension for this to work +2. You may be prompted to download/install extension assets, this is to download NetCoreDbg +3. If you don't have a launch.json set up: from the debugging tab click `create a launch.json file` then click the suggested .NET debugger, then select your .csproj file +4. You can now debug C# from the debugging tab, which will use NetCoreDbg -This project has adopted the code of conduct defined by the [Contributor Covenant](http://contributor-covenant.org/) -to clarify expected behavior in our community. -For more information see the [.NET Foundation Code of Conduct](http://www.dotnetfoundation.org/code-of-conduct). +Some other extensions (C# Dev Kit) depend on the official C# extension and will have to be disabled with it. -### Contribution License Agreement +To avoid this limitation you can use the python script in [`___patching/_scripts/disable_official.py`](https://github.com/blipk/vscodium-csharp/blob/main/___patching/_scripts/disable_official.py) which changes extension dependencies from the official extension to this one. -By signing the [CLA](https://cla.dotnetfoundation.org/), the community is free to use your contribution to [.NET Foundation](http://www.dotnetfoundation.org) projects. -### .NET Foundation -This project is supported by the [.NET Foundation](http://www.dotnetfoundation.org). -## Feedback +
+Development notes - +##### Build from source locally -[Provide feedback](https://github.com/dotnet/vscode-csharp/issues) -File questions, issues, or feature requests for the extension. +```bash +git clone https://github.com/blipk/vscodium-csharp.git +cd vscodium-csharp +npm install +npm run vscode:prepublish +npx gulp 'vsix:release:package:neutral' +``` -[Known issues](https://github.com/dotnet/vscode-csharp/issues) -If someone has already filed an issue that encompasses your feedback, please leave a 👍 or 👎 reaction on the issue to upvote or downvote it to help us prioritize the issue. +##### CI Notes (GitHub Actions) -[Quick survey](https://www.research.net/r/8KGJ9V8?o=[o_value]&v=[v_value]&m=[m_value]) -Let us know what you think of the extension by taking the quick survey. +A series of GitHub Action workflows are run to apply the patches and build the release. +1. apply-patches.yml: + - first it fetches and then checkouts the current state of the main branch from the official C# extension upstream + - then it runs `___patching/_patcher.sh` which runs any `.sh` files in the `___patching/_patches` directory - these are how patches are applied + - it then merges the patched upstream and commits it to this repository -[csdevkitextension]: https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit + Notes: + - The `.github` and `.vscode` directories are excluded from any git actions, this is to avoid merge conflicts as these are not necessary for the extension + - The commits made before and after the patch have messsages with `[pre-patch]` and `[post-patch]` respectively + + Run conditions: + - it is run whenever pushing to main, or at midnight every night + - it won't run if it doesnt detect any changes upstream AND if the last `ci-build.yml` succeeded + - to force it to run push a commit with `[force-ci]` in its message +2. ci-build.yml: this installs all dependencies and builds the `.vsix` files for each platform +3. ci-release.yml: this creates a github release and uploads the `.vsix` files from the previous workflow to it, then it publishes it to Open VSX + +###### Other notes + +- The github releases packages are versioned by the date and time they were created at, Open VSX package has the version from `version.json` + +
\ No newline at end of file diff --git a/RuntimeLicenses/dependencies/OpenDebugAD7-License.txt b/RuntimeLicenses/dependencies/OpenDebugAD7-License.txt deleted file mode 100644 index 66566ac15..000000000 --- a/RuntimeLicenses/dependencies/OpenDebugAD7-License.txt +++ /dev/null @@ -1,120 +0,0 @@ -MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS - -MICROSOFT OPENDEBUGAD7 EXTENSION FOR VISUAL STUDIO CODE - -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. -They apply to the pre-release software named above. The terms also apply to any Microsoft services or updates for the software, -except to the extent those have additional terms. - -IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. - -1. INSTALLATION AND USE RIGHTS. -You may install and use any number of copies of the software to develop and test your applications. - -2. TERMS FOR SPECIFIC COMPONENTS. -a. Third Party components. The software may include third party components with separate legal notices or governed by other -agreements, as described in the ThirdPartyNotices file accompanying the software. Even if such components are governed by other -agreements, the disclaimers and the limitations on and exclusions of damages below also apply. - -3. DATA. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may -use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but -not all, as described in the product documentation. There are also some features in the software that may enable you to collect -data from users of your applications. If you use these features to enable data collection in your applications, you must comply -with applicable law, including providing appropriate notices to users of your applications. You can learn more about data -collection and use in the help documentation and the privacy statement at http://go.microsoft.com/fwlink/?LinkID=528096. Your -use of the software operates as your consent to these practices. - -4. PRE-RELEASE SOFTWARE. This software is a pre-release version. It may not work the way a final version of the software will. -We may change it for the final, commercial version. We also may not release a commercial version. - -5. FEEDBACK. If you give feedback about the software to Microsoft, you give to Microsoft, without charge, the right to use, -share and commercialize your feedback in any way and for any purpose. You will not give feedback that is subject to a license -that requires Microsoft to license its software or documentation to third parties because we include your feedback in them. -These rights survive this agreement. - -6. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. -Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the -software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the -software that only allow you to use it in certain ways. For more information, see www.microsoft.com/licensing/userights. You -may not -* work around any technical limitations in the software; -* reverse engineer, decompile or disassemble the software, or attempt to do so, except and only to the extent required by third -party licensing terms governing use of certain open-source components that may be included with the software; -* remove, minimize, block or modify any notices of Microsoft or its suppliers in the software; -* use the software in any way that is against the law; or -* share, publish, rent, or lease the software, or provide the software as a stand-alone hosted as solution for others to use. - -7. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the -software, which include restrictions on destinations, end users and end use. For further information on export restrictions, -visit (aka.ms/exporting). - -8. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. - -9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that -you use, are the entire agreement for the software and support services. - -10. APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to interpretation of and claims -for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software -in any other country, its laws apply. - -11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including -consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may -also have rights with respect to the party from which you acquired the software. This agreement does not change those other -rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the -below regions, or mandatory country law applies, then the following provisions apply to you: -a. Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to -affect those rights. -b. Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, -disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume -checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to -turn off updates for your specific device or software. -c. Germany and Austria. -(i) Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany -the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. -(ii) Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as -well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is in breach of such -material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of -which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called -"cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. - -12. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You -may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights -under the laws of your country if the laws of your country do not permit it to do so. - -13. DISCLAIMER OF WARRANTY. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT -GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -14. LIMITATION ON AND EXCLUSION OF DAMAGES. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS -SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, -SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. -This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet -sites, or third party applications; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict -liability, negligence, or other tort to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or -exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or -other damages. -Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in -French. -Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en -français. -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre -seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en -vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le -droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon -sont exclues. -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses -fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune -indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. -Cette limitation concerne: -·     tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou -dans des programmes tiers ; et -·     les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou -d’une autre faute dans la limite autorisée par la loi en vigueur. -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays -n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que -ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois -de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le -permettent pas. diff --git a/RuntimeLicenses/license.txt b/RuntimeLicenses/license.txt index 042c4c4ea..04c0c4729 100644 --- a/RuntimeLicenses/license.txt +++ b/RuntimeLicenses/license.txt @@ -1,141 +1,285 @@ -MICROSOFT SOFTWARE LICENSE TERMS - -MICROSOFT C# EXTENSION FOR VISUAL STUDIO CODE - -These license terms are an agreement between Microsoft Corporation (or based on where you live, one -of its affiliates) and you. They apply to the software named above. The terms also apply to any Microsoft -services or updates for the software, except to the extent those have additional terms. - -IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. - -1. INSTALLATION AND USE RIGHTS. You may only use the C# Extension for Visual Studio Code -with Visual Studio Code, Visual Studio or Xamarin Studio software to help you develop and test your -applications. - -2. TERMS FOR SPECIFIC COMPONENTS. -a. Third Party Components. The software may include third party components with separate -legal notices or governed by other agreements, as may be described in the ThirdPartyNotices -file(s) accompanying the software. - -3. DATA. -a. Data Collection. The software may collect information about you and your use of the software, -and send that to Microsoft. Microsoft may use this information to provide services and improve -our products and services. You may opt-out of many of these scenarios, but not all, as described -in the product documentation. There are also some features in the software that may enable -you and Microsoft to collect data from users of your applications. If you use these features, you -must comply with applicable law, including providing appropriate notices to users of your -applications together with a copy of Microsoft’s privacy statement. Our privacy statement is -located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data -collection and use in the help documentation and our privacy statement. Your use of the software -operates as your consent to these practices. -b. Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of -personal data in connection with the software, Microsoft makes the commitments in the -European Union General Data Protection Regulation Terms of the Online Services Terms to all -customers effective May 25, 2018, at http://go.microsoft.com/?linkid=9840733. - -4. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights -to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights -despite this limitation, you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that only allow you to use it -in certain ways. For more information, see www.microsoft.com/licensing/userights. You may not -* work around any technical limitations in the software; -* reverse engineer, decompile or disassemble the software, or attempt to do so, except and only to -the extent required by third party licensing terms governing use of certain open-source -components that may be included with the software; -* remove, minimize, block or modify any notices of Microsoft or its suppliers in the software; -* use the software in any way that is against the law; or -* share, publish, rent, or lease the software, or provide the software as a stand-alone offering for -others to use. - -5. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and -regulations that apply to the software, which include restrictions on destinations, end users and end -use. For further information on export restrictions, visit (aka.ms/exporting). - -6. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. - -7. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based -services and support services that you use, are the entire agreement for the software and support -services. - -8. APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to -interpretation of and claims for breach of this agreement, and the laws of the state where you live -apply to all other claims. If you acquired the software in any other country, its laws apply. - -9. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. -You may have other rights, including consumer rights, under the laws of your state or country. -Separate and apart from your relationship with Microsoft, you may also have rights with respect to -the party from which you acquired the software. This agreement does not change those other rights -if the laws of your state or country do not permit it to do so. For example, if you acquired the -software in one of the below regions, or mandatory country law applies, then the following provisions -apply to you: -a. Australia. You have statutory guarantees under the Australian Consumer Law and nothing in -this agreement is intended to affect those rights. -b. Canada. If you acquired this software in Canada, you may stop receiving updates by turning off -the automatic update feature, disconnecting your device from the Internet (if and when you re- -connect to the Internet, however, the software will resume checking for and installing updates), -or uninstalling the software. The product documentation, if any, may also specify how to turn off -updates for your specific device or software. -c. Germany and Austria. -(i) Warranty. The properly licensed software will perform substantially as described in any -Microsoft materials that accompany the software. However, Microsoft gives no contractual -guarantee in relation to the licensed software. -(ii) Limitation of Liability. In case of intentional conduct, gross negligence, claims based -on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is -liable according to the statutory law. -Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is -in breach of such material contractual obligations, the fulfillment of which facilitate the due -performance of this agreement, the breach of which would endanger the purpose of this -agreement and the compliance with which a party may constantly trust in (so-called "cardinal -obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. - -10. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK -OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR -CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT -EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -11. LIMITATION ON AND EXCLUSION OF DAMAGES. YOU CAN RECOVER FROM MICROSOFT -AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER -ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, -INDIRECT OR INCIDENTAL DAMAGES. - -This limitation applies to (a) anything related to the software, services, content (including code) on -third party Internet sites, or third party applications; and (b) claims for breach of contract, breach of -warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by -applicable law. - -It also applies even if Microsoft knew or should have known about the possibility of the damages. -The above limitation or exclusion may not apply to you because your country may not allow the -exclusion or limitation of incidental, consequential or other damages. - -Please note: As this software is distributed in Quebec, Canada, some of the clauses in this -agreement are provided below in French. - -Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce -contrat sont fournies ci-dessous en français. - -EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation -de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous -pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que -ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de -qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. - -LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES -DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de -dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune -indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et -pertes de bénéfices. -Cette limitation concerne: -* tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites -Internet tiers ou dans des programmes tiers ; et -* les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, -de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. - -Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel -dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages -indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus -ne s’appliquera pas à votre égard. - -EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres -droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent -les lois de votre pays si celles-ci ne le permettent pas. +Omnisharp +https://github.com/OmniSharp/omnisharp-vscode/blob/master/LICENSE.txt + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------------------------------------------------------------------- + +netcoredbg +https://github.com/Samsung/netcoredbg/blob/master/LICENSE + +MIT License + +Copyright (c) 2017 Samsung Electronics Co., LTD + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------------------------------------------------------------------- +Omnisharp Server +https://github.com/OmniSharp/omnisharp-server/blob/master/LICENSE.md + +The MIT License (MIT) + +Copyright (c) 2014 Jason Imison + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +------------------------------------------------------------------------------- + +Razor Language Server +https://github.com/dotnet/aspnetcore-tooling/blob/master/LICENSE.txt + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/images/csharpIcon.png b/images/csharpIcon.png index 3605d76703840a153de219ae7ede813dd2676068..048a2664cf561ae9d0e15668692e4d9bd5f4347b 100644 GIT binary patch literal 49396 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%0ApSX5CIIrSpFzWky2JAm&aH4_k0(P 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 diff --git a/omnisharptest/omnisharpIntegrationTests/integrationHelpers.ts b/omnisharptest/omnisharpIntegrationTests/integrationHelpers.ts index e5da6162b..b58daf586 100644 --- a/omnisharptest/omnisharpIntegrationTests/integrationHelpers.ts +++ b/omnisharptest/omnisharpIntegrationTests/integrationHelpers.ts @@ -36,16 +36,16 @@ export async function activateCSharpExtension(): Promise { configuration.update('path', process.env.OMNISHARP_LOCATION, vscode.ConfigurationTarget.WorkspaceFolder); } - const csharpExtension = vscode.extensions.getExtension('ms-dotnettools.csharp'); + const csharpExtension = vscode.extensions.getExtension('blipk.csharp'); if (!csharpExtension) { - throw new Error('Failed to find installation of ms-dotnettools.csharp'); + throw new Error('Failed to find installation of blipk.csharp'); } // Explicitly await the extension activation even if completed so that we capture any errors it threw during activation. await csharpExtension.activate(); await csharpExtension.exports.initializationFinished(); - console.log('ms-dotnettools.csharp activated'); + console.log('blipk.csharp activated'); // Output the directory where logs are being written so if a test fails we can match it to the right logs. console.log(`Extension log directory: ${csharpExtension.exports.logDirectory}`); @@ -59,9 +59,9 @@ export async function activateCSharpExtension(): Promise { } export async function restartOmniSharpServer(): Promise { - const csharpExtension = vscode.extensions.getExtension('ms-dotnettools.csharp'); + const csharpExtension = vscode.extensions.getExtension('blipk.csharp'); if (!csharpExtension) { - throw new Error('Failed to find installation of ms-dotnettools.csharp'); + throw new Error('Failed to find installation of blipk.csharp'); } if (!csharpExtension.isActive) { diff --git a/package.json b/package.json index d35aeff96..0cde7d97d 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,20 @@ { "name": "csharp", - "publisher": "ms-dotnettools", - "version": "42.42.42-placeholder", - "description": "Base language support for C#", - "displayName": "C#", - "author": "Microsoft Corporation", - "license": "SEE LICENSE IN RuntimeLicenses/license.txt", - "qna": "https://github.com/dotnet/vscode-csharp/issues", + "publisher": "blipk", + "version": "2024-09-01_06-33", + "description": "Base language support for C# with libre NetCoreDbg debugger", + "displayName": "C# with NetCoreDbg", + "author": "blipk", + "license": "SEE LICENSE.txt AND RuntimeLicenses/license.txt", + "qna": "https://github.com/blipk/vscodium-csharp/issues", "icon": "images/csharpIcon.png", "preview": false, "bugs": { - "url": "https://github.com/dotnet/vscode-csharp" + "url": "https://github.com/blipk/vscodium-csharp" }, "repository": { "type": "git", - "url": "https://github.com/dotnet/vscode-csharp" + "url": "https://github.com/blipk/vscodium-csharp" }, "categories": [ "Debuggers", @@ -49,13 +49,13 @@ { "moniker": { "name": "Microsoft.CodeAnalysis.LanguageClient.SolutionSnapshotProvider", - "version": "0.1" + "version": "2024-09-01_06-33" } }, { "moniker": { "name": "Microsoft.VisualStudio.CSharpExtension.BuildResultService", - "version": "0.1" + "version": "2024-09-01_06-33" } } ], @@ -420,37 +420,21 @@ { "id": "Debugger", "description": ".NET Core Debugger (Windows / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-win7-x64.zip", - "installPath": ".debugger/x86_64", - "platforms": [ - "win32" - ], - "architectures": [ - "x86_64", - "arm64" - ], - "installTestPath": "./.debugger/x86_64/vsdbg-ui.exe", - "integrity": "09B636A0CDDE06B822EE767A2A0637845F313427029E860D25C1271E738E4C9D" - }, - { - "id": "Debugger", - "description": ".NET Core Debugger (Windows / ARM64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-win10-arm64.zip", - "installPath": ".debugger/arm64", + "url": "https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-win64.zip", + "installPath": ".debugger", "platforms": [ "win32" ], "architectures": [ - "arm64" + "x86_64" ], - "installTestPath": "./.debugger/arm64/vsdbg-ui.exe", - "integrity": "68AB910A1204FC164A211BF80F55C07227B1D557A4F8A0D0290B598F19B2388C" + "installTestPath": ".debugger/netcoredbg/netcoredbg.exe" }, { "id": "Debugger", "description": ".NET Core Debugger (macOS / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-osx-x64.zip", - "installPath": ".debugger/x86_64", + "url": "https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-osx-amd64.tar.gz", + "installPath": ".debugger", "platforms": [ "darwin" ], @@ -459,52 +443,14 @@ "arm64" ], "binaries": [ - "./vsdbg-ui", - "./vsdbg" - ], - "installTestPath": "./.debugger/x86_64/vsdbg-ui", - "integrity": "D65C1C28F8EAB504B67C6B05AF86990135E0B2E43041CDB398F849D1F30488A0" - }, - { - "id": "Debugger", - "description": ".NET Core Debugger (macOS / arm64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-osx-arm64.zip", - "installPath": ".debugger/arm64", - "platforms": [ - "darwin" - ], - "architectures": [ - "arm64" - ], - "binaries": [ - "./vsdbg-ui", - "./vsdbg" - ], - "installTestPath": "./.debugger/arm64/vsdbg-ui", - "integrity": "127FBE4D4B5CD361B4FFCA3971565F87807510CAC599424F886A74CF6FBDB7E3" - }, - { - "id": "Debugger", - "description": ".NET Core Debugger (linux / ARM)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-linux-arm.zip", - "installPath": ".debugger", - "platforms": [ - "linux" - ], - "architectures": [ - "arm" - ], - "binaries": [ - "./vsdbg-ui", - "./vsdbg" + "./netcoredbg" ], - "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "FBED7C822402B978B5F6102C1526CD6294842C5ACE014AFF2C510ED980BC8FE7" + "installTestPath": ".debugger/netcoredbg/netcoredbg" }, { "id": "Debugger", "description": ".NET Core Debugger (linux / ARM64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-linux-arm64.zip", + "url": "https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-linux-arm64.tar.gz", "installPath": ".debugger", "platforms": [ "linux" @@ -513,65 +459,26 @@ "arm64" ], "binaries": [ - "./vsdbg-ui", - "./vsdbg" + "./netcoredbg" ], - "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "E5FB62E79BC08C67890933913CBAD1D25FB875DD73C553F73F00ECFC22CDE28B" - }, - { - "id": "Debugger", - "description": ".NET Core Debugger (linux musl / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-linux-musl-x64.zip", - "installPath": ".debugger", - "platforms": [ - "linux-musl" - ], - "architectures": [ - "x86_64" - ], - "binaries": [ - "./vsdbg-ui", - "./vsdbg" - ], - "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "B4BAF73895504D04584BF7E03BBCED840B2405B6F8F432C2E6E8E2C8CB8F952E" - }, - { - "id": "Debugger", - "description": ".NET Core Debugger (linux musl / ARM64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-linux-musl-arm64.zip", - "installPath": ".debugger", - "platforms": [ - "linux-musl" - ], - "architectures": [ - "arm64" - ], - "binaries": [ - "./vsdbg-ui", - "./vsdbg" - ], - "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "1F56B47005E7F29C653F351D2A53038AF7E9E4B27969B30DC6C030B2DB0CF6CB" + "installTestPath": ".debugger/netcoredbg/netcoredbg" }, { "id": "Debugger", "description": ".NET Core Debugger (linux / x64)", - "url": "https://vsdebugger.azureedge.net/coreclr-debug-2-43-0/coreclr-debug-linux-x64.zip", + "url": "https://github.com/Samsung/netcoredbg/releases/download/3.1.0-1031/netcoredbg-linux-amd64.tar.gz", "installPath": ".debugger", "platforms": [ - "linux" + "linux", + "linux-musl" ], "architectures": [ "x86_64" ], "binaries": [ - "./vsdbg-ui", - "./vsdbg" + "./netcoredbg" ], - "installTestPath": "./.debugger/vsdbg-ui", - "integrity": "D26DDB552DCED21D979174FB4783560AA4F8EE3AFC195EA93B0D1A7EBCFCBA79" + "installTestPath": ".debugger/netcoredbg/netcoredbg" }, { "id": "RazorOmnisharp", @@ -2271,7 +2178,7 @@ "pipeCwd": "${workspaceFolder}", "pipeProgram": "enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'", "pipeArgs": [], - "debuggerPath": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "debuggerPath": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "properties": { "pipeCwd": { @@ -2305,7 +2212,7 @@ "debuggerPath": { "type": "string", "description": "%generateOptionsSchema.pipeTransport.debuggerPath.description%", - "default": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "default": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "pipeEnv": { "type": "object", @@ -2803,7 +2710,7 @@ "pipeCwd": "${workspaceFolder}", "pipeProgram": "enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'", "pipeArgs": [], - "debuggerPath": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "debuggerPath": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "properties": { "pipeCwd": { @@ -2837,7 +2744,7 @@ "debuggerPath": { "type": "string", "description": "%generateOptionsSchema.pipeTransport.debuggerPath.description%", - "default": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "default": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "pipeEnv": { "type": "object", @@ -3224,7 +3131,7 @@ "pipeCwd": "^\"\\${workspaceFolder}\"", "pipeProgram": "^\"${3:enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'}\"", "pipeArgs": [], - "debuggerPath": "^\"${4:enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg}\"" + "debuggerPath": "^\"${4:enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg}\"" } } }, @@ -3239,7 +3146,7 @@ "pipeCwd": "^\"\\${workspaceFolder}\"", "pipeProgram": "^\"${1:enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'}\"", "pipeArgs": [], - "debuggerPath": "^\"${2:enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg}\"" + "debuggerPath": "^\"${2:enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg}\"" } } }, @@ -3611,7 +3518,7 @@ "pipeCwd": "${workspaceFolder}", "pipeProgram": "enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'", "pipeArgs": [], - "debuggerPath": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "debuggerPath": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "properties": { "pipeCwd": { @@ -3645,7 +3552,7 @@ "debuggerPath": { "type": "string", "description": "%generateOptionsSchema.pipeTransport.debuggerPath.description%", - "default": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "default": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "pipeEnv": { "type": "object", @@ -4143,7 +4050,7 @@ "pipeCwd": "${workspaceFolder}", "pipeProgram": "enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'", "pipeArgs": [], - "debuggerPath": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "debuggerPath": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "properties": { "pipeCwd": { @@ -4177,7 +4084,7 @@ "debuggerPath": { "type": "string", "description": "%generateOptionsSchema.pipeTransport.debuggerPath.description%", - "default": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "default": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "pipeEnv": { "type": "object", @@ -4569,7 +4476,7 @@ "description": "Environment variables passed to dotnet. Only valid for hosted apps." }, "dotNetConfig": { - "description": "Options passed to the underlying .NET debugger. For more info, see https://github.com/dotnet/vscode-csharp/blob/main/debugger.md.", + "description": "Options passed to the underlying .NET debugger. For more info, see https://github.com/blipk/vscodium-csharp/blob/main/debugger.md.", "type": "object", "required": [], "default": {}, diff --git a/src/constants/csharpExtensionId.ts b/src/constants/csharpExtensionId.ts index 1f3fe6f57..a6bc91e31 100644 --- a/src/constants/csharpExtensionId.ts +++ b/src/constants/csharpExtensionId.ts @@ -3,4 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export const CSharpExtensionId = 'ms-dotnettools.csharp'; +export const CSharpExtensionId = 'blipk.csharp'; diff --git a/src/coreclrDebug/activate.ts b/src/coreclrDebug/activate.ts index 3cb7fa5e2..ba76f7781 100644 --- a/src/coreclrDebug/activate.ts +++ b/src/coreclrDebug/activate.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import * as vscode from 'vscode'; import * as common from '../common'; -import { CoreClrDebugUtil, getTargetArchitecture } from './util'; +import { CoreClrDebugUtil } from './util'; import { PlatformInformation } from '../shared/platform'; import { DebuggerPrerequisiteWarning, @@ -301,25 +301,17 @@ export class DebugAdapterExecutableFactory implements vscode.DebugAdapterDescrip // debugger has finished installation, kick off our debugger process // use the executable specified in the package.json if it exists or determine it based on some other information (e.g. the session) - if (!executable) { + const pipeTransport = _session.configuration.pipeTransport; + if (!executable || typeof pipeTransport === 'object') { const dotNetInfo = await getDotnetInfo(omnisharpOptions.dotNetCliPaths); - const targetArchitecture = getTargetArchitecture( - this.platformInfo, - _session.configuration.targetArchitecture, - dotNetInfo - ); - const command = path.join( - common.getExtensionPath(), - '.debugger', - targetArchitecture, - 'vsdbg-ui' + CoreClrDebugUtil.getPlatformExeExtension() - ); + + // Look to see if DOTNET_ROOT is set, then use dotnet cli path const dotnetRoot: string = process.env.DOTNET_ROOT ?? (dotNetInfo.CliPath ? path.dirname(dotNetInfo.CliPath) : ''); - let options: vscode.DebugAdapterExecutableOptions | undefined = undefined; + let options: vscode.DebugAdapterExecutableOptions = {}; if (dotnetRoot) { options = { env: { @@ -328,7 +320,43 @@ export class DebugAdapterExecutableFactory implements vscode.DebugAdapterDescrip }; } - executable = new vscode.DebugAdapterExecutable(command, [], options); + let command = ''; + let args = []; + if (typeof pipeTransport === 'object') { + if (pipeTransport.debuggerPath) { + command = pipeTransport.debuggerPath; + } else { + command = path.join( + common.getExtensionPath(), + '.debugger', + 'netcoredbg', + 'netcoredbg' + CoreClrDebugUtil.getPlatformExeExtension() + ); + } + if (pipeTransport.debuggerArgs) { + args = pipeTransport.debuggerArgs; + } else { + args.push('--interpreter=vscode', '--'); + } + if (pipeTransport.pipeProgram) { + args.push(pipeTransport.pipeProgram); + } + if (pipeTransport.pipeArgs) { + args.push(pipeTransport.pipeArgs); + } + if (pipeTransport.pipeCwd) { + options.cwd = pipeTransport.pipeCwd; + } + } else { + command = path.join( + common.getExtensionPath(), + '.debugger', + 'netcoredbg', + 'netcoredbg' + CoreClrDebugUtil.getPlatformExeExtension() + ); + args = ['--interpreter=vscode']; + } + executable = new vscode.DebugAdapterExecutable(command, args, options); } // make VS Code launch the DA executable diff --git a/src/features/dotnetTest.ts b/src/features/dotnetTest.ts index dfb61591f..7b2db6513 100644 --- a/src/features/dotnetTest.ts +++ b/src/features/dotnetTest.ts @@ -691,7 +691,7 @@ class DebugEventListener { this._pipePath = '\\\\.\\pipe\\Microsoft.VSCode.CSharpExt.TestDebugEvents' + process.pid; } else { const tmpdir = utils.getUnixTempDirectory(); - this._pipePath = path.join(tmpdir, 'ms-dotnettools.csharp-tde-' + process.pid); + this._pipePath = path.join(tmpdir, 'blipk.csharp-tde-' + process.pid); } } diff --git a/src/lsptoolshost/roslynLanguageServer.ts b/src/lsptoolshost/roslynLanguageServer.ts index b46507392..4d4c74812 100644 --- a/src/lsptoolshost/roslynLanguageServer.ts +++ b/src/lsptoolshost/roslynLanguageServer.ts @@ -38,7 +38,6 @@ import * as RoslynProtocol from './roslynProtocol'; import { CSharpDevKitExports } from '../csharpDevKitExports'; import { SolutionSnapshotId } from './services/ISolutionSnapshotProvider'; import { ServerState } from './serverStateChange'; -import TelemetryReporter from '@vscode/extension-telemetry'; import CSharpIntelliCodeExports from '../csharpIntelliCodeExports'; import { csharpDevkitExtensionId, csharpDevkitIntelliCodeExtensionId, getCSharpDevKit } from '../utils/getCSharpDevKit'; import { randomUUID } from 'crypto'; @@ -115,7 +114,6 @@ export class RoslynLanguageServer { private _languageClient: RoslynLanguageClient, private _platformInfo: PlatformInformation, private _context: vscode.ExtensionContext, - private _telemetryReporter: TelemetryReporter, private _languageServerEvents: RoslynLanguageServerEvents ) { this.registerSetTrace(); @@ -201,14 +199,7 @@ export class RoslynLanguageServer { if (!dotnetInfo) { dotnetInfo = await getDotnetInfo([]); } - reportProjectConfigurationEvent( - this._telemetryReporter, - params, - this._platformInfo, - dotnetInfo, - this._solutionFile?.fsPath, - true - ); + reportProjectConfigurationEvent(params, this._platformInfo, dotnetInfo, this._solutionFile?.fsPath, true); }); } @@ -220,18 +211,11 @@ export class RoslynLanguageServer { platformInfo: PlatformInformation, hostExecutableResolver: IHostExecutableResolver, context: vscode.ExtensionContext, - telemetryReporter: TelemetryReporter, additionalExtensionPaths: string[], languageServerEvents: RoslynLanguageServerEvents ): Promise { const serverOptions: ServerOptions = async () => { - return await this.startServer( - platformInfo, - hostExecutableResolver, - context, - telemetryReporter, - additionalExtensionPaths - ); + return await this.startServer(platformInfo, hostExecutableResolver, context, additionalExtensionPaths); }; const documentSelector = languageServerOptions.documentSelector; @@ -271,7 +255,7 @@ export class RoslynLanguageServer { client.registerProposedFeatures(); - const server = new RoslynLanguageServer(client, platformInfo, context, telemetryReporter, languageServerEvents); + const server = new RoslynLanguageServer(client, platformInfo, context, languageServerEvents); client.registerFeature(server._onAutoInsertFeature); @@ -534,7 +518,6 @@ export class RoslynLanguageServer { platformInfo: PlatformInformation, hostExecutableResolver: IHostExecutableResolver, context: vscode.ExtensionContext, - telemetryReporter: TelemetryReporter, additionalExtensionPaths: string[] ): Promise { const serverPath = getServerPath(platformInfo); @@ -615,8 +598,7 @@ export class RoslynLanguageServer { _channel.appendLine(`Starting server at ${serverPath}`); } - // shouldn't this arg only be set if it's running with CSDevKit? - args.push('--telemetryLevel', telemetryReporter.telemetryLevel); + args.push('--extensionLogDirectory', context.logUri.fsPath); @@ -1010,7 +992,6 @@ export async function activateRoslynLanguageServer( outputChannel: vscode.OutputChannel, dotnetTestChannel: vscode.OutputChannel, dotnetChannel: vscode.OutputChannel, - reporter: TelemetryReporter, languageServerEvents: RoslynLanguageServerEvents ): Promise { // Create a channel for outputting general logs from the language server. @@ -1030,7 +1011,6 @@ export async function activateRoslynLanguageServer( platformInfo, hostExecutableResolver, context, - reporter, additionalExtensionPaths, languageServerEvents ); diff --git a/src/main.ts b/src/main.ts index 0fa150161..7c22997c8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -22,8 +22,6 @@ import { OmnisharpLoggerObserver } from './observers/omnisharpLoggerObserver'; import { OmnisharpStatusBarObserver } from './observers/omnisharpStatusBarObserver'; import { PlatformInformation } from './shared/platform'; import { StatusBarItemAdapter } from './statusBarItemAdapter'; -import { TelemetryObserver } from './observers/telemetryObserver'; -import TelemetryReporter from '@vscode/extension-telemetry'; import { ProjectStatusBarObserver } from './observers/projectStatusBarObserver'; import { vscodeNetworkSettingsProvider } from './networkSettings'; import { ErrorMessageObserver } from './observers/errorMessageObserver'; @@ -77,10 +75,6 @@ export async function activate( throw error; } - const aiKey = context.extension.packageJSON.contributes.debuggers[0].aiKey; - const reporter = new TelemetryReporter(aiKey); - // ensure it gets properly disposed. Upon disposal the events will be flushed. - context.subscriptions.push(reporter); const dotnetTestChannel = vscode.window.createOutputChannel('.NET Test Log'); const dotnetChannel = vscode.window.createOutputChannel('.NET NuGet Restore'); @@ -104,8 +98,6 @@ export async function activate( await initializeDotnetPath(); const useModernNetOption = omnisharpOptions.useModernNet; - const telemetryObserver = new TelemetryObserver(platformInfo, () => reporter, useModernNetOption); - eventStream.subscribe(telemetryObserver.post); const networkSettingsProvider = vscodeNetworkSettingsProvider(vscode); const useFramework = useOmnisharpServer && useModernNetOption !== true; @@ -141,7 +133,6 @@ export async function activate( context, context.extension.extensionPath, eventStream, - reporter, csharpDevkitExtension, platformInfo, /* useOmnisharpServer */ false @@ -164,7 +155,6 @@ export async function activate( csharpChannel, dotnetTestChannel, dotnetChannel, - reporter, roslynLanguageServerEvents ); } else { @@ -276,7 +266,6 @@ export async function activate( context, context.extension.extensionPath, eventStream, - reporter, undefined, platformInfo, /* useOmnisharpServer */ true @@ -328,10 +317,6 @@ export async function activate( ); } - const activationProperties: { [key: string]: string } = { - serverKind: useOmnisharpServer ? 'OmniSharp' : 'Roslyn', - }; - reporter.sendTelemetryEvent('CSharpActivated', activationProperties); if (!useOmnisharpServer) { debugSessionTracker.initializeDebugSessionHandlers(context); diff --git a/src/observers/telemetryObserver.ts b/src/observers/telemetryObserver.ts index 93df8aa0e..9d5d83070 100644 --- a/src/observers/telemetryObserver.ts +++ b/src/observers/telemetryObserver.ts @@ -118,7 +118,6 @@ export class TelemetryObserver { private handleProjectConfigurationReceived(event: ProjectConfiguration) { const projectConfig = event.projectConfiguration; reportProjectConfigurationEvent( - this.reporter, projectConfig, this.platformInfo, this.dotnetInfo, diff --git a/src/packageManager/downloadAndInstallPackages.ts b/src/packageManager/downloadAndInstallPackages.ts index 817bd73d7..cf90a8fea 100644 --- a/src/packageManager/downloadAndInstallPackages.ts +++ b/src/packageManager/downloadAndInstallPackages.ts @@ -6,6 +6,7 @@ import { PackageError } from './packageError'; import { NestedError } from '../nestedError'; import { DownloadFile } from './fileDownloader'; +import { InstallTarGz } from './tarGzInstaller'; import { InstallZip } from './zipInstaller'; import { EventStream } from '../eventStream'; import { NetworkSettingsProvider } from '../networkSettings'; @@ -45,7 +46,11 @@ export async function downloadAndInstallPackages( ); if (downloadValidator(buffer, pkg.integrity, eventStream)) { installationStage = 'installPackage'; - await InstallZip(buffer, pkg.description, pkg.installPath, pkg.binaries, eventStream); + if (pkg.url.includes('.tar.gz')) { + await InstallTarGz(buffer, pkg.description, pkg.installPath, eventStream); + } else { + await InstallZip(buffer, pkg.description, pkg.installPath, pkg.binaries, eventStream); + } installationStage = 'touchLockFile'; await touchInstallFile(pkg.installPath, InstallFileType.Lock); break; diff --git a/src/razor/razor.ts b/src/razor/razor.ts index 9aedc03f2..43df5df31 100644 --- a/src/razor/razor.ts +++ b/src/razor/razor.ts @@ -9,14 +9,12 @@ import * as path from 'path'; import * as vscode from 'vscode'; import * as Razor from '../../src/razor/src/extension'; import { EventStream } from '../eventStream'; -import TelemetryReporter from '@vscode/extension-telemetry'; import { PlatformInformation } from '../shared/platform'; export async function activateRazorExtension( context: vscode.ExtensionContext, extensionPath: string, eventStream: EventStream, - vscodeTelemetryReporter: TelemetryReporter, csharpDevkitExtension: vscode.Extension | undefined, platformInfo: PlatformInformation, useOmnisharpServer: boolean @@ -45,7 +43,6 @@ export async function activateRazorExtension( context, languageServerDir, eventStream, - vscodeTelemetryReporter, csharpDevkitExtension, platformInfo, /* enableProposedApis: */ false diff --git a/src/razor/src/extension.ts b/src/razor/src/extension.ts index 5346f4cc0..da6718b05 100644 --- a/src/razor/src/extension.ts +++ b/src/razor/src/extension.ts @@ -1,3 +1,4 @@ +import * as path from 'path'; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. @@ -43,7 +44,6 @@ import { RazorSignatureHelpProvider } from './signatureHelp/razorSignatureHelpPr import { TelemetryReporter as RazorTelemetryReporter } from './telemetryReporter'; import { RazorDiagnosticHandler } from './diagnostics/razorDiagnosticHandler'; import { RazorSimplifyMethodHandler } from './simplify/razorSimplifyMethodHandler'; -import TelemetryReporter from '@vscode/extension-telemetry'; import { CSharpDevKitExports } from '../../csharpDevKitExports'; import { DotnetRuntimeExtensionResolver } from '../../lsptoolshost/dotnetRuntimeExtensionResolver'; import { PlatformInformation } from '../../shared/platform'; @@ -52,7 +52,6 @@ import { resolveRazorLanguageServerOptions } from './razorLanguageServerOptionsR import { RazorFormatNewFileHandler } from './formatNewFile/razorFormatNewFileHandler'; import { InlayHintHandler } from './inlayHint/inlayHintHandler'; import { InlayHintResolveHandler } from './inlayHint/inlayHintResolveHandler'; -import { getComponentPaths } from '../../lsptoolshost/builtInComponents'; // We specifically need to take a reference to a particular instance of the vscode namespace, // otherwise providers attempt to operate on the null extension. @@ -61,7 +60,6 @@ export async function activate( context: ExtensionContext, languageServerDir: string, eventStream: HostEventStream, - vscodeTelemetryReporter: TelemetryReporter, csharpDevkitExtension: vscode.Extension | undefined, platformInfo: PlatformInformation, enableProposedApis = false @@ -90,29 +88,27 @@ export async function activate( ); const dotnetInfo = await hostExecutableResolver.getHostExecutableInfo(); + const dotnetRuntimePath = path.dirname(dotnetInfo.path); + + // Take care to always run .NET processes on the runtime that we intend. + // The dotnet.exe we point to should not go looking for other runtimes. + const env: NodeJS.ProcessEnv = { ...process.env }; + env.DOTNET_ROOT = dotnetRuntimePath; + env.DOTNET_MULTILEVEL_LOOKUP = '0'; + // Save user's DOTNET_ROOT env-var value so server can recover the user setting when needed + env.DOTNET_ROOT_USER = process.env.DOTNET_ROOT ?? 'EMPTY'; - let telemetryExtensionDllPath = ''; // Set up DevKit environment for telemetry if (csharpDevkitExtension) { - await setupDevKitEnvironment(dotnetInfo.env, csharpDevkitExtension, logger); - - if (vscode.env.isTelemetryEnabled) { - const razorComponentPaths = getComponentPaths('razorDevKit', undefined); - if (razorComponentPaths.length !== 1) { - logger.logError('Failed to find Razor DevKit telemetry extension path.', undefined); - } else { - telemetryExtensionDllPath = razorComponentPaths[0]; - } - } + await setupDevKitEnvironment(env, csharpDevkitExtension, logger); } const languageServerClient = new RazorLanguageServerClient( vscodeType, languageServerDir, razorTelemetryReporter, - vscodeTelemetryReporter, - telemetryExtensionDllPath, - dotnetInfo.env, + csharpDevkitExtension !== undefined, + env, dotnetInfo.path, logger ); diff --git a/src/razor/src/razorExtensionId.ts b/src/razor/src/razorExtensionId.ts index 690ca0241..be7f20cdb 100644 --- a/src/razor/src/razorExtensionId.ts +++ b/src/razor/src/razorExtensionId.ts @@ -4,4 +4,4 @@ *--------------------------------------------------------------------------------------------*/ // The Razor experience is shipped as part of OmniSharp, this is their extension ID. -export const razorExtensionId = 'ms-dotnettools.csharp'; +export const razorExtensionId = 'blipk.csharp'; diff --git a/src/razor/src/razorLanguageServerClient.ts b/src/razor/src/razorLanguageServerClient.ts index 64ecbeb55..22c32ecfa 100644 --- a/src/razor/src/razorLanguageServerClient.ts +++ b/src/razor/src/razorLanguageServerClient.ts @@ -15,7 +15,6 @@ import { resolveRazorLanguageServerOptions } from './razorLanguageServerOptionsR import { resolveRazorLanguageServerLogLevel } from './razorLanguageServerTraceResolver'; import { RazorLogger } from './razorLogger'; import { TelemetryReporter as RazorTelemetryReporter } from './telemetryReporter'; -import TelemetryReporter from '@vscode/extension-telemetry'; import { randomUUID } from 'crypto'; const events = { @@ -37,8 +36,8 @@ export class RazorLanguageServerClient implements vscode.Disposable { private readonly vscodeType: typeof vscode, private readonly languageServerDir: string, private readonly razorTelemetryReporter: RazorTelemetryReporter, - private readonly vscodeTelemetryReporter: TelemetryReporter, - private readonly telemetryExtensionDllPath: string, + private readonly isCSharpDevKitActivated: boolean, + private readonly env: NodeJS.ProcessEnv, private readonly dotnetExecutablePath: string, private readonly logger: RazorLogger @@ -262,15 +261,8 @@ export class RazorLanguageServerClient implements vscode.Disposable { args.push('--SingleServerCompletionSupport'); args.push('true'); - if (options.forceRuntimeCodeGeneration) { - args.push('--ForceRuntimeCodeGeneration'); - args.push('true'); - } - - if (this.telemetryExtensionDllPath.length > 0) { - args.push('--telemetryLevel', this.vscodeTelemetryReporter.telemetryLevel); + if (this.isCSharpDevKitActivated) { args.push('--sessionId', getSessionId()); - args.push('--telemetryExtensionPath', this.telemetryExtensionDllPath); } } diff --git a/src/shared/projectConfiguration.ts b/src/shared/projectConfiguration.ts index 8e5bb0133..20d09d56a 100644 --- a/src/shared/projectConfiguration.ts +++ b/src/shared/projectConfiguration.ts @@ -6,7 +6,7 @@ import * as crypto from 'crypto'; import { machineIdSync } from 'node-machine-id'; import { PlatformInformation } from './platform'; -import { ITelemetryReporter, getTelemetryProps } from './telemetryReporter'; +import { getTelemetryProps } from './telemetryReporter'; import { DotnetInfo } from './utils/dotnetInfo'; export interface ProjectConfigurationMessage { @@ -22,7 +22,6 @@ export interface ProjectConfigurationMessage { } export function reportProjectConfigurationEvent( - reporter: ITelemetryReporter, projectConfig: ProjectConfigurationMessage, platformInfo: PlatformInformation, dotnetInfo: DotnetInfo | undefined, @@ -51,7 +50,6 @@ export function reportProjectConfigurationEvent( telemetryProps['useModernNet'] = useModernNet.toString(); } - reporter.sendTelemetryEvent('ProjectConfiguration', telemetryProps); } function createSolutionId(solutionPath: string) { diff --git a/src/tools/OptionsSchema.json b/src/tools/OptionsSchema.json index ab1c53bf8..f659ef62d 100644 --- a/src/tools/OptionsSchema.json +++ b/src/tools/OptionsSchema.json @@ -59,12 +59,12 @@ "PipeTransport": { "type": "object", "required": [ "debuggerPath" ], - "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (vsdbg).", + "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (netcoredbg).", "default": { "pipeCwd": "${workspaceFolder}", "pipeProgram": "enter the fully qualified path for the pipe program name, for example '/usr/bin/ssh'", "pipeArgs": [], - "debuggerPath": "enter the path for the debugger on the target machine, for example ~/vsdbg/vsdbg" + "debuggerPath": "enter the path for the debugger on the target machine, for example /usr/bin/netcoredbg" }, "properties": { "pipeCwd": { @@ -97,7 +97,7 @@ "debuggerPath": { "type": "string", "description": "The full path to the debugger on the target machine.", - "default": "~/vsdbg/vsdbg" + "default": "/usr/bin/netcoredbg" }, "pipeEnv": { "type": "object", @@ -430,7 +430,7 @@ }, "pipeTransport": { "$ref": "#/definitions/PipeTransport", - "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (vsdbg)." + "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (netcoredbg)." }, "suppressJITOptimizations": { "type": "boolean", @@ -526,7 +526,7 @@ }, "pipeTransport": { "$ref": "#/definitions/PipeTransport", - "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (vsdbg)." + "description": "When present, this tells the debugger to connect to a remote computer using another executable as a pipe that will relay standard input/output between VS Code and the .NET Core debugger backend executable (netcoredbg)." }, "suppressJITOptimizations": { "type": "boolean", diff --git a/test/integrationTests/integrationHelpers.ts b/test/integrationTests/integrationHelpers.ts index 5f3405e82..0fe530002 100644 --- a/test/integrationTests/integrationHelpers.ts +++ b/test/integrationTests/integrationHelpers.ts @@ -22,9 +22,9 @@ export async function activateCSharpExtension(): Promise { await vscode.commands.executeCommand('workbench.action.reloadWindow'); } - const csharpExtension = vscode.extensions.getExtension('ms-dotnettools.csharp'); + const csharpExtension = vscode.extensions.getExtension('blipk.csharp'); if (!csharpExtension) { - throw new Error('Failed to find installation of ms-dotnettools.csharp'); + throw new Error('Failed to find installation of blipk.csharp'); } // Run a restore manually to make sure the project is up to date since we don't have automatic restore. @@ -40,7 +40,7 @@ export async function activateCSharpExtension(): Promise { // Explicitly await the extension activation even if completed so that we capture any errors it threw during activation. await csharpExtension.activate(); await csharpExtension.exports.initializationFinished(); - console.log('ms-dotnettools.csharp activated'); + console.log('blipk.csharp activated'); console.log(`Extension Log Directory: ${csharpExtension.exports.logDirectory}`); if (shouldRestart) { @@ -73,7 +73,7 @@ export async function revertActiveFile(): Promise { } export async function restartLanguageServer(): Promise { - const csharpExtension = vscode.extensions.getExtension('ms-dotnettools.csharp'); + const csharpExtension = vscode.extensions.getExtension('blipk.csharp'); // Register to wait for initialization events and restart the server. const waitForInitialProjectLoad = new Promise((resolve, _) => { csharpExtension!.exports.experimental.languageServerEvents.onServerStateChange(async (e) => {