Compare commits

...
532 Commits
Author SHA1 Message Date
Sean McManus 4e20f27127 Seanmcm/0 23 0 changelog (#3593)
* 0.23.0 changelog.
2019-05-06 18:31:48 -07:00
Michelle Matias 4e2f1b8ba5 update release notes for 5-2019 (#3592)
* update release notes for 5-2019
2019-05-06 18:21:54 -07:00
Sean McManus 0cffa4e27a Dev/waan/fix test run (#3581)
* Fix integration tests and fail if tests fail
2019-05-06 16:51:51 -07:00
Colen Garoutte-Carson b67e701fc9 Address issue with trailing backslashes in config path not squiggled (#3573) 2019-05-01 15:58:19 -07:00
Sean McManus 77f3747630 Fix includePath code actions and configuration actions. (#3576)
* Fix `includePath` code actions amd configuration actions.
2019-05-01 14:26:55 -07:00
Sean McManus dc8813f449 Fix undefined access if there's no includePath. (#3572)
* Fix undefined access if there's no includePath.
2019-05-01 11:38:57 -07:00
Sean McManus e0543a64c1 Seanmcm/0 23 0 insiders2 changelog2 (#3571)
* Update changelog for crash fixes.
2019-04-30 16:12:52 -07:00
Sean McManus e5b118c707 Update changelog for 0.23.0-insiders2. (#3570)
* Update changelog for 0.23.0-insiders2.
2019-04-30 14:23:34 -07:00
Colen Garoutte-Carson f465766d1e Undo tab size change (#3568) 2019-04-30 12:29:15 -07:00
Michelle Matias 7f4fc339c7 Add input validation on configuration UI (#3563)
* show errors on config UI
2019-04-29 19:10:15 -07:00
Sean McManus 788cee3ecf Fix out dir not getting created. (#3562) 2019-04-29 16:42:43 -07:00
Michelle Matias 05939c19a9 add depends on (#3561) 2019-04-29 16:14:24 -07:00
Colen Garoutte-Carson 110e683790 Work around issue with getting stale contents from openTextDocument (#3545)
* Work around issue with getting stale contents from openTextDocument

* Avoid calling openTextDocument when creating a new file, and use only writeFile.  Unsubscribe from window activation when settings UI is not visible.

* Switch to using editorTabSize for settings file
2019-04-29 15:17:01 -07:00
Andrew Wang 6a88c9917b Adding support for .env files for cppvsdbg (#3500)
* Adding support for .env files for cppvsdbg

This PR allows users to have a .env file that listed as
KEY=VALUE or KEY="VALUE WITH SPACE" to be used as environment variables
when launching a process. Anything that begins with '#' is treated as a
comment. Blank lines are ignored.

This .env file will be used if envFile passed in with the launch.json.
It will also work with the existing environment variable, however
anything listed in the .env file will overwrite anything from the
environment field in the launch.json.

* Update 'envFile' description and add documentation
2019-04-26 14:59:43 -07:00
Sean McManus 2ac33971ed Update webpack dependency, fix linter errors (#3544)
* Update webpack dependency.
* Fix lint errors.
2019-04-26 14:43:29 -07:00
Sean McManus a5905276ce Bobbrow/webpack (#3411)
* Use webpack to consolidate JavaScript files
2019-04-25 18:34:15 -07:00
Colen Garoutte-Carson d6726e5d42 Switch to using the installExtension command for offline/insider vsix installing (#3521) 2019-04-25 18:02:23 -07:00
Colen Garoutte-Carson aa6873b84e Work around vscode not treating .C files as C++ (#3536) 2019-04-25 17:53:07 -07:00
Colen Garoutte-Carson e3ddec66ee Update config squiggle parsing to squiggle bad paths delimited by semicolons (#3517) 2019-04-25 17:45:42 -07:00
Sean McManus 26d83d136e Skip first install release notes (#3534)
* Don't show release notes if the extension has never been installed before
2019-04-25 17:13:08 -07:00
Colen Garoutte-Carson 6f4439ca88 Various settings UI load/save related changes (#3529) 2019-04-25 10:09:10 -07:00
Colen Garoutte-Carson 3fbeba779c Unescape backslashes in settings for UI (#3527) 2019-04-24 13:49:43 -07:00
Colen Garoutte-Carson cfc908a1ac Update Select Configurations command to offer Edit Configs JSON option (#3519)
* Update Select Configurations command to offer Edit Configs JSON option

* Add 'Edit Configurations (UI)' option to Select Configuration menu
2019-04-24 11:19:53 -07:00
Sean McManus f3a02fde4e Change version. (#3520) 2019-04-23 18:10:57 -07:00
Sean McManus e863e88e95 Merge pull request #3516 from Microsoft/seanmcm/0_23_0_changelog2
Seanmcm/0 23 0 changelog2
2019-04-23 17:11:53 -07:00
Sean McManus bc70ea8c79 Merge branch 'master' into seanmcm/0_23_0_changelog2 2019-04-23 16:58:14 -07:00
Michelle Matias bbfea25a1d Config UI data sync fix (#3515)
* fix data sync, rewording

* add default to intellisense mode. rewording.

* fix lint

* update description

* remove extra padding
2019-04-23 16:57:50 -07:00
Sean McManus 968d6c5919 Add a reported by. 2019-04-23 14:46:32 -07:00
Sean McManus 33d23b3a5e Revert line endings. 2019-04-23 14:27:09 -07:00
Sean McManus 4bf3691f7f Move issue. 2019-04-23 14:26:27 -07:00
Sean McManus bf9d69a8ad Update changelog. 2019-04-23 14:22:35 -07:00
Bob Brown 9a78289fec encode the installation type in install telemetry (#3513) 2019-04-23 10:28:23 -07:00
Michelle Matias 7960904575 changelog for 0.23.0 insiders (#3499)
* Log new features and minor changes

* fix quotes

* Update changelog.

* Separate sections.

* Fix.

* Minor change.

* More changes.
2019-04-19 18:19:50 -07:00
Michelle Matias dd590ea1f5 Config UI - fix colors on some html elements. Change some wording. (#3498)
* fix empty compilerPath. Clarify some descriptions

* fix colors

* removed unused code
2019-04-19 18:08:55 -07:00
Sean McManus 5d1e503480 Merge pull request #3497 from Microsoft/seanmcm/showLogDiagnostics
Seanmcm/show log diagnostics
2019-04-19 15:50:49 -07:00
Sean McManus 3b15f515d1 Merge branch 'master' into seanmcm/showLogDiagnostics 2019-04-19 15:44:50 -07:00
Sean McManus d7a3384a07 Merge pull request #3495 from Microsoft/seanmcm/updateThirdPartyNotices
Update ThirdPartyNotices.txt
2019-04-19 15:44:30 -07:00
Sean McManus 4cdcd72990 Merge branch 'master' into seanmcm/showLogDiagnostics 2019-04-19 15:40:52 -07:00
Sean McManus 740705973e Merge branch 'master' into seanmcm/updateThirdPartyNotices 2019-04-19 15:34:26 -07:00
Colen Garoutte-Carson 3a78e96785 Add check for undefined compilerPath in isCompilerIntelliSenseModeCompatible (#3496) 2019-04-19 15:15:15 -07:00
Sean McManus 39b89bdb5b Undo newline change. 2019-04-19 14:33:37 -07:00
Sean McManus d4d68cb808 Show the log diagnostics. 2019-04-19 14:32:34 -07:00
Sean McManus d3e8958b29 Update ThirdPartyNotices.txt 2019-04-19 13:11:18 -07:00
Colen Garoutte-Carson 0e3fea978a Add command to log language service diagnostics (#3489)
* Add support for showing diagnostics
2019-04-18 18:12:08 -07:00
Sean McManus a39b1a5d6c Merge pull request #3486 from Microsoft/bobbrow/tasksIndentation
When generating tasks.json, use the editor's tab setting
2019-04-18 17:45:11 -07:00
Sean McManus f15994a58c Merge branch 'master' into bobbrow/tasksIndentation 2019-04-18 17:35:01 -07:00
Sean McManus 009c77d45f Merge pull request #3453 from Microsoft/seanmcm/fixJsonParse
Fix for 0.22.0 regression caused by squiggle work: https://github.com/Microsoft/vscode-cpptools/issues/3449 .
2019-04-18 17:34:41 -07:00
Sean McManus 94e213449f Merge branch 'master' into seanmcm/fixJsonParse 2019-04-18 17:14:14 -07:00
Michelle Matias 7ae6818bfb Add styling to configuration UI (#3487)
* add styling to configuration UI

* fix casing on command text. style cleanup

* edit wording for command palette tip

* change wording. Disable editing of config name

* update webview on config selection changed
2019-04-18 17:03:48 -07:00
Sean McManus 03a6c04629 Merge branch 'master' into seanmcm/fixJsonParse 2019-04-18 16:07:44 -07:00
Andrew Wang 8526bc90cb Add debugHeap toggle and turn off by default (#3488)
* Add debugHeap toggle and turn off by default

This PR adds a launch.json setting to enable debugHeap if users are
intersted in using it. By default, debug heap will be disabled.
2019-04-18 15:52:37 -07:00
Bob Brown 105760833d Merge branch 'master' into bobbrow/tasksIndentation 2019-04-18 15:04:33 -07:00
Colen Garoutte-Carson 239e4015d6 Add config squiggle for intelliSenseMode/compilerPath mismatch (#3483)
* Add squiggle for intelliSenseMode/compilerPath mismatch

* Break out function for isCompilerIntelliSenseModeCompatible.
2019-04-18 14:02:29 -07:00
Bob Brown (DEVDIV) 7e7b38acd7 When generating tasks.json, use the editor's tab setting 2019-04-18 11:22:04 -07:00
Sean McManus 260dc5d840 Merge branch 'master' into seanmcm/fixJsonParse 2019-04-17 18:01:34 -07:00
Michelle Matias 99b290513b Configuration UI (#3479)
* Add settings webview

* Add setting: useSettingsUI

* Use existing global setting (workbench.settings.editor == ui | json)

* handle changes from webview

* Add content security policy to html

* Move use of workbench settings into OtherSettings class

* sync ui and json file

* Add functions for each way to open settings (UI, JSON, based on config)

* Remove unnecesary command

* add telemetry. handle failed parse. Add UI command to toast notification.

* add newline

* fix value properties of HTML element

* fix another html value

* fix formatting

* add typedef

* fix more formatting and ===

* fix code styling. fixed some bugs.

* move configDirty flag reset

* add typedef to onWindowStateChanged

* small clean up
2019-04-17 16:31:46 -07:00
Sean McManus 76b3d9ca28 Merge pull request #3455 from Microsoft/seanmcm/fixMultiRootHover
Fix hover using the active client instead of the owning client.
2019-04-17 16:11:19 -07:00
Sean McManus 806dc8ac43 Merge branch 'master' into seanmcm/fixMultiRootHover 2019-04-17 16:04:30 -07:00
Colen Garoutte-Carson 03cf4d7aaf Default intelliSenseEngineFallback to Disabled. Add additional settings value to errorSquiggles (#3421)
* Update package.json to reflect new values

* Break ToggleErrorSquiggles out into Enable/Disable

* Update localization files
2019-04-17 16:00:28 -07:00
Sean McManus 569a7cb53d Merge pull request #3478 from Microsoft/seanmcm/fixRegExpInConfigName
Seanmcm/fix reg exp in config name
2019-04-17 14:17:03 -07:00
Sean McManus 6de2250fef Merge branch 'master' into seanmcm/fixRegExpInConfigName 2019-04-17 14:08:29 -07:00
Sean McManus ae861b3605 Change sorting. 2019-04-17 14:07:19 -07:00
Bob Brown 2aeadbd395 Update FAQs.md for ipch folder (#3424) 2019-04-16 22:03:38 -07:00
Sean McManus 0b500cefb7 Fix line endings. 2019-04-16 14:57:28 -07:00
Sean McManus 2e8cd7f406 Fix bug with special chars in config name. 2019-04-16 14:56:23 -07:00
Sean McManus 8c8c2c22e3 Undo line changes. 2019-04-16 14:35:34 -07:00
Sean McManus bdc8322da3 Go back to my original fix. 2019-04-16 14:34:39 -07:00
Sean McManus eeb2ba207c Work in progress. 2019-04-16 14:11:34 -07:00
Sean McManus f848bf392a Fix hover using the active client instead of the owning client. 2019-04-11 18:18:29 -07:00
Sean McManus f72a3ded96 Undo activation events change. 2019-04-11 16:00:05 -07:00
Sean McManus 31b993941b Another attempt to undo changes. 2019-04-11 15:59:07 -07:00
Sean McManus 59b0b3f924 Merge branch 'seanmcm/fixJsonParse' of https://github.com/Microsoft/vscode-cpptools into seanmcm/fixJsonParse 2019-04-11 15:57:57 -07:00
Sean McManus 5b90fc6bd3 Attempt to undo commits. 2019-04-11 15:57:06 -07:00
Sean McManus a4e9df0e6e Merge branch 'seanmcm/fixJsonParse' of https://github.com/Microsoft/vscode-cpptools into seanmcm/fixJsonParse 2019-04-11 15:55:17 -07:00
Sean McManus 3ef0b7597f Undo checked in files. 2019-04-11 15:54:47 -07:00
Sean McManus 74c9b0b967 Replace 3 replace with 1.
Signed-off-by: Sean McManus <[email protected]>
2019-04-11 15:52:29 -07:00
Sean McManus 3b5a8466d7 Update line endings. 2019-04-11 15:27:22 -07:00
Sean McManus fbf8ed4e35 Fix bug with json parsing. 2019-04-11 15:26:07 -07:00
Colen Garoutte-Carson c978eb0755 Reorder contents of provideCustomConfiguration, as an optimization (#3437) 2019-04-11 10:06:24 -07:00
Sean McManus 0f67f54b42 Seanmcm/small changes for insiders (#3435)
* Update changelog.
* Remove confusing quotes from clang_format_style descriptions, and use the Visual Studio style as the clang_format_style examples.
2019-04-08 21:50:46 -07:00
Sean McManus b770030ec2 Update changelog for 0.22.2-insiders. (#3409)
* Update changelog for 0.22.2-insiders.
2019-04-04 14:11:08 -07:00
Colen Garoutte-Carson 8129ce337e Add call to notifyWhenReady, to prevent crash (#3406)
Addresses an issue with a prior change, which added use of languageClient when it may not yet be available.

Use requestWhenReady(), to prevent crash.
2019-04-04 13:00:34 -07:00
Colen Garoutte-Carson 93a88c948a Ensure clearCustomConfigurations() is called when changing the configurationProvider (#3404)
* Ensure clearCustomConfigurations() is called when changing the configurationProvider
2019-04-03 17:00:14 -07:00
Sean McManus 34d8874754 Seanmcm/disable cpp squiggles (#3405)
* Add enableConfigurationSquiggles.
2019-04-03 16:42:44 -07:00
Sean McManus 0773ec8c41 Fix compile_commands prompt not being per-folder. (#3399) 2019-04-03 13:07:19 -07:00
Colen Garoutte-Carson 9f842ac0d9 Add use of queryTranslationUnitSource to determine if custom configuration can be skipped (#3393)
Add call in provideCustomConfiguration to new QueryTranslationUnitSourceRequest. Use result to decide whether it's necessary to request a custom configuration.

* Add queryTranslationUnitSource

* Update "Building the Extension.md"
2019-04-03 12:39:17 -07:00
Sean McManus e8d0ded816 Fix for null ref race condition when using custom config providers. (#3377)
* Fix for null ref race condition when using custom config providers.
2019-04-02 15:22:25 -07:00
Tara Raj f5bdac9889 Merge pull request #3314 from Microsoft/taraj/box-sample
Taraj/box sample
2019-04-02 14:36:59 -07:00
Sean McManus eb976d5ca5 Merge branch 'master' into taraj/box-sample 2019-03-28 19:11:35 -07:00
Sean McManus d5a902e144 Enable environment variables with intelliSenseCachePath. (#3368)
* Enable environment variables with intelliSenseCachePath.
2019-03-27 18:28:07 -07:00
Sean McManus b0c2d54144 Merge branch 'master' into taraj/box-sample 2019-03-27 18:02:57 -07:00
Sean McManus bcdabc9c36 Attempt to fix Azure Pipelines Cl. (#3371) 2019-03-27 17:02:53 -07:00
Sean McManus e054287c48 Update for 0.22.2. (#3359) 2019-03-27 12:40:57 -07:00
Sean McManus dcf480990b Merge branch 'master' into taraj/box-sample 2019-03-26 12:52:53 -07:00
Sean McManus 02a3152f0f Fix duplicate build task when compilerPath has args. (#3360) 2019-03-26 12:52:27 -07:00
Sean McManus 77806f657f Add squiggle for compilerPath with args and spaces missing quotes. (#3358) 2019-03-26 12:41:59 -07:00
Bob Brown 7e5f22f862 updates 2019-03-25 21:10:52 -07:00
Sean McManus 0f8e7b2d7b Merge branch 'master' into taraj/box-sample 2019-03-25 15:34:43 -07:00
Sean McManus 088276b4af Seanmcm/component governance (#3346)
* Add Component Governance.
2019-03-25 11:44:55 -07:00
Tara Raj a7cefc9d4d Merge branch 'master' into taraj/box-sample 2019-03-22 09:53:05 -07:00
Bob Brown 30d8a1daa4 Update FAQ.md 2019-03-22 09:08:58 -07:00
Bob Brown (DEVDIV) 148ae1d325 ignore cache files 2019-03-22 08:52:21 -07:00
Tara Raj 968ce8acba Adding gitignore file 2019-03-21 12:56:54 -07:00
Tara Raj ff6e13e829 Add Box Sample and Remove Stale Clang Sample 2019-03-21 11:45:05 -07:00
Sean McManus 798e90574c Update for 0.22.1. (#3331) 2019-03-20 18:24:13 -07:00
Sean McManus 1eb064e020 Build tasks.json deletion. Configure Task. (#3328)
* Build tasks.json deletion. Configure Task.
2019-03-20 15:39:06 -07:00
Sean McManus 4ca9ad8b3a Update changelog. (#3312)
* Update changelog.
2019-03-19 14:01:54 -07:00
Sean McManus 8aadd40a58 Fix squiggles with WSL compilerPath with args. (#3313)
* Fix squiggles with WSL compilerPath with args.
* Normalize path separators.
2019-03-19 13:44:58 -07:00
Tara Raj 7088f546aa Additional box sample files 2019-03-18 19:53:33 -07:00
Tara Raj 64ca48b50e BoxConsoleSample for build and debug demo 2019-03-18 19:52:49 -07:00
Sean McManus 0c61ee96b7 Fix variable resolving not working with ${default}. (#3310) 2019-03-18 15:47:57 -07:00
Bob Brown e020801dac readme feedback #3300 (#3307) 2019-03-18 13:12:18 -07:00
Sean McManus 270a4f7d38 Update changelog for 0.22.0-insiders3. (#3294)
* Update changelog for 0.22.0-insiders3.
2019-03-14 17:27:22 -07:00
Sean McManus 342de46452 Disable the IntelliSense cache on Mac. (#3293)
* Disable the IntelliSense cache on Mac.
2019-03-14 14:22:32 -07:00
Bob Brown cd0dde9e27 Update release notes (#3291) 2019-03-14 13:14:40 -07:00
Bob Brown 79f8262d26 show squiggles when invalid properties are added to the c_cpp_properties.json file (#3283) 2019-03-12 16:58:30 -07:00
Sean McManus 24b69c7873 Seanmcm/add cl debug support (#3264)
* Add cl.exe support.
* Fix Build and Debug too early.
* Make menus better.
2019-03-12 16:55:15 -07:00
Andrew Wang 260124b39b Updating vsdbg (#3267) 2019-03-11 13:02:44 -07:00
Sean McManus 2426a66be4 Seanmcm/change mac mi debugger path default (#3262)
* Change default miDebuggerPath on Mac.
2019-03-07 11:27:30 -08:00
Sean McManus 6f5c9e362b Fix unwanted compilerPath squiggle with cl.exe. (#3263) 2019-03-07 11:22:21 -08:00
Sean McManus 868799af10 Disable AutoPCH for older Macs. (#3261)
* Disable AutoPCH for older Macs.
2019-03-07 11:10:32 -08:00
Sean McManus 01d013723f Fix install vsix. (#3251)
* Fix install vsix.
2019-03-05 16:42:09 -08:00
Sean McManus 1a8e84bca3 Seanmcm/debug fixes (#3244)
* Fix debug launch bugs.
2019-03-05 16:29:43 -08:00
lh123 3db3c8da9a Suggest user switching to insiders channel (#3221)
* suggested user switch to insiders
2019-03-04 17:26:12 -08:00
Sean McManus 670a105c1f Update changelog. (#3243) 2019-03-01 17:26:25 -08:00
Andrew Wang 5445eff250 Update vsdbg for 0.23.0 (#3242) 2019-03-01 17:23:33 -08:00
Sean McManus 95dd5386ed Reduce VS Code requirement. (#3241)
* Reduce VS Code requirement.
* Remove more addresses in crash telemetry.
2019-03-01 16:02:41 -08:00
Sean McManus 55120359a4 Remove trailing "/" from intelliSenseCachePath setting. (#3240) 2019-03-01 14:44:11 -08:00
Sean McManus bb2d23c694 Change AutoPch to AutoPCH. (#3239) 2019-03-01 13:59:19 -08:00
Sean McManus 15ac01d70c Update date. (#3238) 2019-03-01 13:56:03 -08:00
Sean McManus 0c77b9e6cf Fix "cl.exe" in the compilerPath squiggle. (#3237)
* Fix "cl.exe" and missing ".exe" in the compilerPath squiggle.
2019-03-01 13:53:19 -08:00
Sean McManus c39579010b Fix bugs with compilerPath squiggles and build tasks. (#3228) 2019-03-01 11:10:16 -08:00
Bob Brown e928bfb0a9 Fix tslint issues (#3234) 2019-03-01 10:51:11 -08:00
Sean McManus 1d47bc4160 Seanmcm/0 22 0 insiders2 changelog (#3226)
* Update changelog for 0.22.0-insiders.
2019-02-28 17:56:27 -08:00
Griffin Downs 3d7937feeb Grdowns/launch configs (#3215)
* Implement debug configurations that will build the active C/C++ file and launch a debugger (disabled)
* Handle compilerPath in build and squiggles.
2019-02-28 16:46:26 -08:00
Andrew Wang 98260f96ea Remove Travis-CI (#3205)
Removing .travis.yml and will be removing webhooks/app integration of
Travis-CI from vscode-cpptools.

Minor fixes and add debug integration tests back.
2019-02-28 14:55:14 -08:00
Bob Brown 8d96465cb6 Enable ${command:cpptools.activeConfigName} in tasks #1524 (#3219)
* Enable ${command:cpptools.activeConfigName} in tasks #1524

* PR feedback
2019-02-26 20:09:20 -08:00
Bob Brown ece90711fb fix typos (#3218) 2019-02-26 14:54:22 -08:00
Bob Brown 361ca45b50 Merge pull request #3184 from Microsoft/mimatias/add_pch_settings
Add settings for auto pch
2019-02-25 14:51:34 -08:00
Sean McManus 28e8f1f2ed Seanmcm/cpp properties squiggles (#3196)
* Add c_cpp_properties.json warning squiggles for invalid paths.
2019-02-25 14:46:05 -08:00
Michelle Matias d27e609d92 Merge branch 'mimatias/add_pch_settings' of https://github.com/Microsoft/vscode-cpptools into mimatias/add_pch_settings 2019-02-22 13:59:41 -08:00
Michelle Matias fdcbfee87c update cache path 2019-02-22 13:59:26 -08:00
Sean McManus bda5bbf89c Merge branch 'master' into mimatias/add_pch_settings 2019-02-22 13:50:29 -08:00
Sean McManus 50ddd670c7 Fix command not found and empty c_cpp_properties.json if activation is too slow. (#3178)
* Fix command not found if activation is too slow.
* Fix empty c_cpp_properties.json.
2019-02-22 13:50:11 -08:00
Andrew Wang cc81b4bb8f Set up CI with Azure Pipelines (#3191)
Set up CI with Azure Pipelines
2019-02-22 11:51:01 -08:00
Michelle Matias a0f6eb61ad Update cachePath description 2019-02-22 11:05:09 -08:00
Michelle Matias 10a06af93d rename cachePath and cacheSize 2019-02-22 10:39:07 -08:00
Michelle Matias b28ab0a874 add slash at end of default path 2019-02-15 16:20:56 -08:00
Michelle Matias f1ca548849 filter autoPCH cache for telemetry 2019-02-15 16:16:40 -08:00
Michelle Matias f860223723 fix auto pch settings 2019-02-15 16:16:40 -08:00
Michelle Matias e2aaababc4 Add settings for cached pre-compiled headers 2019-02-15 16:16:40 -08:00
Andrew Wang 49aa55261f Fix quoting for process picker (#3181) 2019-02-15 12:58:11 -08:00
Griffin Downs 035d0284d9 Grdowns/build tasks (#3118)
* Generate a C/C++ build task

* Cleaning

* Move args into definition

* Add args to shellexecution to allow calling the task without first configuring; Add TODO's

* Read compiler paths sent in defaults to generate task list

* Rename compilerPaths to compilerInfo; Filter tasks based on file extension

* Use our own file extension filters to decide whether tasks are presented

* Show dialog when no compilers are found

* Display a message if no compilers are found

* Add compilerPath getter to config; Use it to offer another task

* Refactoring; Commenting

* Remove CompilerInfo namespace; Formatting; Change return vals

* Commenting; Add telemetry; Inverse condition

* Change output program based on OS; Remove message and collect telemetry instead

* Filter out redundant compiler entries

* Remove TODO; Get proper exe name; Properly reassign compilerPaths after filtering

* Commenting; Fix cwd mingw bug

* Commenting; Refactor

* Mark compilerInfo const

* Remove whitespace; Remove bad comment

* Remove whitespace

* Replace unique algorithm with a map

* pre-compute basename

* Move comment

* Commenting; Ensure user's compilerPath setting is used

* Use indexOf instead of find

* Simplify isHeader calculation by using some instead of every

* Don't redundantly check extensions; Use some instead of indexOf

* Add comment punctuation

Use file macro instead of fileDirName and fileBaseName

Change path provider name; expose cwd in definition

Add shell task definition (it's not built into vs code apparently)

* Lowercase file extension to match; Count extensionless files as headers

* Add newline

* Change CompilerInfo to KnownCompiler

* Support ambiguous file extension

* Early out for extensionless files

* Commenting

* Commenting; Rename telemetry event

* Change languageAssociation to isC

* Fix bug where cwd was not used; Add comment
2019-02-13 16:00:31 -08:00
Sean McManus f216e0262a Update extend version. (#3146) 2019-02-08 18:47:52 -08:00
Sean McManus 373e9be4cb Update changelog for 0.22.0-insiders. (#3137)
* Update changelog for 0.22.0-insiders.
2019-02-06 14:44:40 -08:00
Sean McManus 7a20270b10 Seanmcm/suggest snippets setting (#3135)
* Add suggestSnippets setting.
2019-02-05 15:46:49 -08:00
Bob Brown 41a4e14e4c Merge pull request #3128 from xisui-MSFT/xisui/chinese_command_support
Add Chinese support for commands
2019-02-04 09:38:58 -08:00
xisui-MSFT 13b78f2129 Add Chinese support for commands 2019-02-02 18:24:42 -08:00
Tucker Kern bf6b4aa54e Fix regex to allow non-recursive includePath (#3122)
* Fix regex to allow non-recursive includePath when constructing browse.path from includePath
2019-01-31 18:20:23 -08:00
Bob Brown f978719dea Merge pull request #3113 from Microsoft/bobbrow/cc
#3102 - fix compilerPath/compileCommands policy
2019-01-29 14:07:32 -08:00
Bob Brown (DEVDIV) 2713e70563 #3102 - fix compilerPath/compileCommands policy 2019-01-29 10:39:37 -08:00
Sean McManus af516b9515 Seanmcm/0 22 0 changelog1 (#3101)
* Update changelog, version, and fwlinks.
* Add telemetry for C/C++ Clang Command Adapter usage.
* Update language-service.md.
2019-01-28 17:44:04 -08:00
Andrew Wang 243f21380d Updating debugAdapterExecutable to new API (#2921)
https://code.visualstudio.com/updates/v1_30#_debugging-api has
depricated adapterExecutableCommand. This PR updates the extension to
use DebugAdapterDescriptorFactory.
2019-01-23 15:05:37 -08:00
Sean McManus 6fc9f7b682 Update yauzl version and changelog date. (#3069) 2019-01-22 19:05:23 -08:00
Sean McManus ec9270f5a9 Update ReleaseNotes. (#3067) 2019-01-22 14:25:09 -08:00
Griffin Downs 75f35a1fd7 Fix CLI mismatch for downgrading (#3065) 2019-01-22 13:24:00 -08:00
Sean McManus dcc0174133 Update changelog. (#3050) 2019-01-18 11:23:33 -08:00
jogo- 3b8c3143e4 Fix typos in launch.md (#3027)
* Fix typos in launch.md
2019-01-16 16:24:56 -08:00
jogo- 33e7d70324 Fix typo in How To Debug MIEngine.md (#3028) 2019-01-14 16:47:54 -08:00
jogo- 703e23a62b Update FAQs.md (#3029)
Missing whitespace
2019-01-14 13:15:28 -08:00
Jmnote 39ba7fc6ba extenion → extension (#3002)
extenion → extension
2019-01-08 16:00:02 -08:00
Sean McManus 6488a11dc3 Update changelog (#2997) 2019-01-03 14:31:12 -08:00
Sean McManus 5ca48e24cf Update changelog for 0.21.0-insiders3. (#2958)
* Update changelog for 0.21.0-insiders3.
2019-01-03 13:20:33 -08:00
Sean McManus de9cc715fc Give a better message if the binary is missing. (#2975)
* Give a better message if the binary is missing.
2019-01-02 18:15:05 -08:00
Sean McManus c727ceca1b Remove json-based snippets, handled by the server now. (#2945)
* Remove json-based snippets, handled by the server now.
2018-12-27 18:36:27 -08:00
Sean McManus f58af4fb2e Disable wordBasedSuggestions by default. (#2944) 2018-12-20 14:39:41 -08:00
Andrew Wang 7935b97329 Update How To Debug MIEngine.md (#2935)
* Update How To Debug MIEngine.md

Added information on how to debug with VS Code

* Update How To Debug MIEngine.md

* .dll -> .pdb

Mistake on symbol list
2018-12-17 14:33:09 -08:00
Sean McManus bd6f8f0df3 Update date in changelog. (#2926)
* Update changelog.
2018-12-17 14:11:40 -08:00
Sean McManus 4b22333f5c Attempt to fix download failure. (#2931)
* Retry vsix download with http.proxySupport "off".
2018-12-17 13:58:43 -08:00
Sean McManus 968e0d2aae Fix bug with Insiders updating. 2018-12-14 18:39:36 -08:00
Sean McManus 8dc8b3bc37 Update changelog for 0.21.0-insiders2. (#2911)
* Update changelog for 0.21.0-insiders2.
* Update README.md.
* Update to 5.1.1 of the vscode-languageclient.
2018-12-13 18:02:35 -08:00
Matt Bise bb962b91e8 Add refresh button to process picker (#2895)
* Add attach QuickView with refresh

* vscode engine 1.23 -> 1.26

* Clean up disposables

* Add entry to CHANGELOG

* Provide refresh image for dark and light themes

* Add title to QuickPick
2018-12-10 15:50:53 -08:00
Sean McManus 8c53c027ca Protect against no activeDocument. (#2875) 2018-11-28 16:05:27 -08:00
Sean McManus b864126494 Fix missed package.json issue from my last checkin. (#2873) 2018-11-28 11:33:16 -08:00
Bob Brown b78e85619a bump up the timeout (#2872) 2018-11-28 09:17:16 -08:00
Sean McManus f474ba8539 Seanmcm/fix insiders debugging (#2871)
* Fix debugging with VS Code Insiders and other Linter fixes.
2018-11-27 16:34:31 -08:00
Sean McManus 0f1071a5c9 Seanmcm/exploration build (#2829)
* Treat the Exploration build like Insiders.
* Update changelog.
2018-11-16 15:11:05 -08:00
Sean McManus f69e6e191b Update telemetry API. (#2828) 2018-11-14 19:38:49 -08:00
Sean McManus 230895d6ba Remove <numbers><spaces> from the start of call stack lines. (#2827)
* Remove <numbers><spaces> from the start of call stack lines.
* Remove __1::.
2018-11-14 19:06:08 -08:00
Sean McManus fa8173076d Update MinGW.md (#2813)
* Update MinGW.md
2018-11-14 17:51:23 -08:00
Bob Brown 3079fb58ae ignore update failures caused by no network present (#2808) 2018-11-13 15:37:35 -08:00
Julien Russo 9f1b482de4 Translation improvements (#2663)
Moved command english translation to package.nls.json, added command translation for italian and modified package.json to use localization files.
2018-11-12 16:54:22 -08:00
Sean McManus 8f6714254a Seanmcm/0 21 0 changelog3 (#2796)
* Change "Fix for" to "Fix" in changelog.
2018-11-08 17:34:34 -08:00
Sean McManus 5246cdc527 Update changelog. (#2795) 2018-11-08 17:21:36 -08:00
Sean McManus 4938f5b2f4 Update changelog for 0.21.0-insiders. (#2794) 2018-11-08 16:14:52 -08:00
Bob Brown 21fef3b067 use WebviewPanel (#2781) (#2783) 2018-11-07 14:47:57 -08:00
Pierson Lee 71582d1883 Add avoidWindowsConsoleRedirection and fix externalConsole comment (#2772)
* Add avoidWindowsConsoleRedirection and fix externalConsole comment

* Update OptionsSchema.json

* Making Andrew happy by updating npm@latest
2018-11-06 13:33:04 -08:00
Pierson Lee 23fc338f71 Update launch.md 2018-11-05 10:31:37 -08:00
Sean McManus 4a8b143ce0 Add more crash telemetry filtering. (#2759) 2018-11-01 15:55:47 -07:00
Sean McManus eccee49017 Fix punctuation/spacing inconsistencies. (#2750) 2018-10-31 17:12:30 -07:00
Anandlal c607604b6b "taskName" changed to "label" as per version 2.0.0 (#2741)
https://code.visualstudio.com/docs/editor/tasks#_migrating-to-tasks-200
2018-10-31 16:24:50 -07:00
Sean McManus 460b95920f Update changelog, fwlinks, and update telemetry API (#2748)
Update changelog, fwlinks, and update telemetry API
2018-10-31 16:06:34 -07:00
Pierson Lee 1c38b55b9f Update external Console notes
Updated external console option to show changes to support for integratedTerminal.
2018-10-31 12:08:00 -07:00
Sean McManus e12bad5172 Fix 2 typos in the changelog. (#2723) 2018-10-25 16:42:57 -07:00
Bob Brown 04bb260577 update release notes (#2722) 2018-10-25 16:42:15 -07:00
Sean McManus b964d4ebc4 Fix comment for intelliSenseEngine setting. (#2720) 2018-10-25 15:57:20 -07:00
Sean McManus 72581c23b7 Update changelog for 0.20.0. (#2718)
* Update changelog for 0.20.0.

* Revise changelog for 0.20.0.
2018-10-25 15:29:44 -07:00
Sean McManus 807ff80f56 Update vscode telemetry api used. (#2707) 2018-10-23 20:23:12 -07:00
Griffin Downs b0e17a1fd9 Don't update pre-releases (#2693) 2018-10-19 16:00:55 -07:00
Griffin Downs bc64d25a1d Ensure that package version suffix + version suffix version are set (#2686) 2018-10-19 15:29:38 -07:00
Sean McManus ed5d8c8fac Get rid of the MacCrash memory addresses. (#2695) 2018-10-18 19:17:36 -07:00
Sean McManus 3a9f4c404d Update changelog for 0.19.1-insiders3. (#2694) 2018-10-18 17:19:28 -07:00
Bob Brown 4330679e23 Don't allow configuration providers to activate the extension when IntelliSense is disabled (#2692) 2018-10-18 12:29:06 -07:00
Andrew Wang 88e9724892 Attempt to fix security and gulp 4.0 (#2689) 2018-10-17 14:34:21 -07:00
Sean McManus acf7b464eb Update changelog.md. (#2676)
* Update changelog.md.
2018-10-16 13:38:58 -07:00
Sean McManus 78f5a38110 Update changelog for 0.19.1-insiders2 (#2649)
* Update changelog for 0.19.1-insiders2
2018-10-11 15:59:02 -07:00
Pierson Lee 31eed4cee2 Add missing interop 15 file to dev workflow (#2643) 2018-10-11 12:28:32 -07:00
Pierson Lee ea8ab1358f Update CHANGELOG.md and copyDebuggerDependencies (#2641)
Update for VSCodeDebugProtocol dll and for the Integratedterminal Work.
2018-10-10 17:53:20 -07:00
Pierson Lee 55558a53e3 Update links for mono framework and runtime (#2640)
Updating to 5.14.0.177 of mono. Update TPN header per CELA
2018-10-10 16:37:23 -07:00
Griffin Downs 536685c8a0 Grdowns/update channel fix (#2637)
* Use shell optional arg

* Add try/catch around spawn to override any possible exceptions

* Default vsixname to cpptools-linux32.vsix

* Move logFailure inline

* Remove potential PII from error message to be on the safe side

* Fix linter errors

* Remove spawn optional arg; instead remove quotes surrounding command

* Remove rethrowing of error at the top level checkAndApplyUpdate

* Commenting

* Remove default case in switch statement for vsixName; Add x86, i383, i686 cases
2018-10-10 15:51:29 -07:00
Sean McManus b6f184744c Update changelog. (#2625) 2018-10-08 15:04:16 -07:00
Sean McManus 539ecc536f Update the changlog for 0.19.1-insiders. (#2615)
* Update the changlog for 0.19.1-insiders.
2018-10-08 11:42:59 -07:00
Sean McManus e819f36e91 Fix error when rootRui is null. (#2614) 2018-10-05 15:34:44 -07:00
Bob Brown 140670c371 Update c_cpp_properties.json.md 2018-10-04 08:48:54 -07:00
Pierson Lee 102ffc1616 Fixing quoting around ssh's command (#2604)
This fixes #2585
2018-10-03 17:35:02 -07:00
Bob Brown 28981f3ce6 remove telemetry that is already being blocked (#2603) 2018-10-03 16:45:53 -07:00
shankaryoga21 775aba8650 don't use falsy comparisons when resolving default settings. (#2592) 2018-10-02 13:18:16 -07:00
Bob Brown b3fb2558fd update telemetry version (#2593) 2018-10-02 12:46:35 -07:00
Griffin Downs 80716ae228 Grdowns/update channel4 (#2576)
* Remove redundant error telemetry
* Check rate limit before attempting to download release JSON
2018-10-02 10:13:10 -07:00
Bob Brown 6d71c6dd4f Merge pull request #2575 from Microsoft/bobbrow/releaseToMaster
Merge release to master
2018-09-28 09:54:40 -07:00
Bob Brown (DEVDIV) da68908e3e update version and fwlinks for October release 2018-09-28 09:35:26 -07:00
Sean McManus 963ee02117 Merge pull request #2572 from Microsoft/master
Merge latest changes
2018-09-27 15:05:13 -07:00
Sean McManus 45a1804da4 Update changelog. (#2571) 2018-09-27 14:57:45 -07:00
Pierson Lee f66eb138f4 Return null config to VS Code (#2570)
return null to trigger VS Code to open a configuration file
https://github.com/Microsoft/vscode/issues/54213
2018-09-27 14:32:35 -07:00
Bob Brown da862646c3 Merge pull request #2566 from Microsoft/bobbrow/release-19.0
Bobbrow/release 19.0
2018-09-26 16:32:14 -07:00
Bob Brown (DEVDIV) 1bcaa540b6 update version number and fwlink for abtesting json 2018-09-26 16:30:07 -07:00
Bob Brown 96e3386288 september release notes/string changes (#2563) 2018-09-26 13:38:54 -07:00
Sean McManus 862a10f3f8 Merge branch 'master' of https://github.com/Microsoft/vscode-cpptools 2018-09-26 13:16:13 -07:00
Sean McManus 2e62382b24 Update changelog for 0.19.0. 2018-09-26 13:15:40 -07:00
Sean McManus 5f9ef54c54 Add ab testing for Go to Def (fix some ab testing bugs) (#2559)
* Add goto_def_intellisense abTesting.
2018-09-26 09:39:31 -07:00
Bob Brown 4575e2840e incorrect warning messages (#2560) 2018-09-25 17:13:10 -07:00
Bob Brown a9a09dcd11 Only serialize tasks that require it (#2553)
* Remove serialization in the queuing except for cases that actually need it
2018-09-25 13:28:14 -07:00
Bob Brown e0e7944f3a Don't add workspaceFolderBasename to new config files (#2552) 2018-09-25 12:48:14 -07:00
Griffin Downs 63e18afcf1 Update Channel pt 3 (#2543)
* Instead of uninstalling then installing, install and override when prompted
2018-09-24 16:32:06 -07:00
Bob Brown fcdcd80157 Fixing queuing logic that stalls LS on Mac (#2540) 2018-09-24 15:01:06 -07:00
Griffin Downs 126cf7cef6 Update channel feature pt 2 (#2541)
* Find Mac code script; Commenting; Move code into try catches correctly filter errors; Add notification on installation

* Merge files from correct commit

* Revert changes made from not having master branch code
2018-09-21 16:25:27 -07:00
Bob Brown ad451bb438 Resolve empty array environment variables #2532 (#2534) 2018-09-20 16:15:32 -07:00
Griffin Downs 83be111769 Add updateChannel setting (#2465)
* Read json from harded-coded file location

* Expose settings tracker

* Get linux download url

* Remove unused imports

* Correctly get changed setting

* Add update timer

* Minimum end to end

* Refactoring; Commenting; Renaming

* Commenting

* Add optional param to download fn; Refactoring; Renaming

* Commenting; Then parse fn

* Mark vars const; Add todos; Refactoring

* Commenting; Refactoring

* url from any to string; Index into parsed json as separate step

* Use temp files to prevent clutter

* Correct windows platform name check; Replace quotes

* Resolve vsixName for mac + win

* Factor version comparisons into ParsedVersion class while correcting version comparison

* Use which utility to find code script

* Update timer to once per hour

* Move downloadFileToDestination to common; Replace downloadCpptoolsJsonAsync

* Return changed settings on onDidChangeSettings

* Get changed settings without stealing them

* Remove tracker from client interface

* Add basic isReleaseJson fn; Add telemetry; Add catch functions

* Write type predicates for release json

* Refactoring; Rewrite version check; Rewrite build selection

* Factor target build search into helper fn

* Reorder fn defs

* Uninstall version before installing if downgrading

* Add undefined checks; Update version comparison

* Reorder fn

* Telemetry rename; Parse versions more safely

* Turn ParsedVersion into interface; Rename release to build

* Fix fn return types

* Commenting

* Remove unneeded validity check

* Rename telemetry event; Correct fn return type

* Update setting description

* Remove promise rejection

* Remove unwanted changes

* Rename var

* Remove imports; Move call to updateSettingsAsync to .then in abTesting

* Remove import; Remove unneeded uses of await

* Remove comment

* Reformat else ifs

* Remove '| undefined' instances

* Use find fn more idiomatically

* Add type specification for predicates + rename them

* Add url var to shorten call to downloadFileToDestination

* Move parsedVersion to separate file

* Move parsedVersion into PackageVersion class

* Move helper fn's to separate file

* Get script name for both insiders and release VSCode (untested)

* Move packageVersion + ghAPI from LanguageServe to src

* Update imports to reflect mv; Check isValid on PackageVersion

* Add todo's

* Correctly get download URL; Correctly verify releaseJson by only checking recent 5 builds

* Check version numbers against undefined instead of 0

* Await install command before removing install file; Change var name

* Re-merge package.json

* Rename ghAPI.ts to githubAPI.ts

* Rename vars; Remove TODO

* Modify version comparison (untested)

* Remove todo

* Create file async

* Download and install file async

* Rework promises

* Make functions async where possible

* Commenting

* Grandfather in insiders users

* Change syntax via await keyword

* Re-enable interval timer

* Add updateChannel settings get

* Immediately check for update on extension activation if on insiders

* Surround windows code script path in quotes

* Rename versionStr to version

* Change telemetry event

* Update telemetry/exception handling

* Update telemetry strings; Reformat is functions

* Another pass at promises + telemetry

* Commenting

* Remove undefined from fn return

* Fix headers not being forwarded to recursive call

* Another pass at promises

* Correctly return promise in checkAndApplyUpdate

* Remove debug vars

* Rename fns

* Fix version parsing

* Tidy version comparison

* Remove commented out code

* Variable rename; Add newline at EOF

* Add newline at EOF

* Commenting; Unbind functions and use function syntax for .thens

* Error message; add rejection

* Correct exceptions being handled one promise too late

* PR feedback

* Rewrite promise chain to await to allow premature cancellation of promise chain

* Mark vars const; Comment; Rename var
2018-09-19 10:44:24 -07:00
Bob Brown 2f931d930d Implement provider API v2 (#2531)
* Implement provider API v2
2018-09-18 16:33:08 -07:00
Sean McManus bc6cb3e55f Add the active selection end. (#2511)
* Add the active selection end.
2018-09-17 14:11:13 -07:00
Gabriel Arjones f44e9068ca Allow workspaceFolderBasename in default settings (#2503) 2018-09-10 12:33:30 -07:00
Gabriel Arjones c206a4b88c Add support for 'workspaceFolderBasename' expansion (#2491) (#2495) 2018-09-07 15:06:08 -07:00
Bob Brown 9e95e412a8 The user settings were not considered when querying the active configuration provider (#2485) 2018-09-05 12:40:28 -07:00
Bob Brown 86ce6c6115 Update c_cpp_properties.json.md 2018-09-04 09:17:44 -07:00
Pierson Lee ecd3eb24f4 Fix sh command (#2475)
When the change from bash to sh happened, the comparison operator was
not updated.

Fixes #2444
2018-08-31 15:30:33 -07:00
Bob Brown 25e29a01c2 Fix bug in default CL macros (#2468)
* incorrect cl macros being defined
2018-08-30 17:00:56 -07:00
Bob Brown e9b8ad66a1 fix bad line endings (#2469) 2018-08-30 16:48:44 -07:00
Bob Brown 3e5a6aae80 Update c_cpp_properties.json.md 2018-08-28 10:47:22 -07:00
Bob Brown 49fea0249d Update MinGW.md 2018-08-28 10:45:36 -07:00
Bob Brown 7de9956a92 Update Windows Subsystem for Linux.md
a few people seem to be getting confused about the example usage
2018-08-28 08:38:29 -07:00
Bob Brown 9abf44b7ac Update language-service.md (#2454) 2018-08-27 12:52:35 -07:00
Bob Brown daaf169c8a Update Enabling logging.md 2018-08-24 11:27:23 -07:00
Bob Brown 23d94452bb Update MinGW.md 2018-08-20 08:29:41 -07:00
Bob Brown 705122a168 update master branch version (#2428) 2018-08-17 13:53:15 -07:00
Sean McManus 757f1f94be Merge pull request #2427 from Microsoft/master
Update changelog and version for 0.18.1. fwlinks don't need to change…
2018-08-17 11:08:28 -07:00
Sean McManus 7fe2db1202 Update changelog and version for 0.18.1. fwlinks don't need to change. (#2426) 2018-08-17 10:53:49 -07:00
Sean McManus d8738c3e0c Merge pull request #2421 from Microsoft/master
Update changelog. (#2420)
2018-08-17 06:07:19 -07:00
Sean McManus b1bd33b8f4 Update changelog. (#2420) 2018-08-17 06:05:16 -07:00
Sean McManus 436c483d35 Merge pull request #2418 from Microsoft/master
Register the config provider for new clients. (#2416)
2018-08-17 05:05:56 -07:00
Sean McManus 99bd382707 Register the config provider for new clients. (#2416) 2018-08-16 15:50:36 -07:00
Bob Brown 356bb903d0 Merge pull request #2414 from Microsoft/master
Merge for 0.18.0
2018-08-16 10:34:19 -07:00
Sean McManus b0fc9427cf Merge branch 'release' into master 2018-08-16 10:01:07 -07:00
Sean McManus 60b20dce8d Update package-lock and fix new linter errors. (#2412)
Update package-lock and fix new linter errors.
2018-08-16 09:59:18 -07:00
Sean McManus 906fd2d8f0 Seanmcm/auto open cpp properties (#2410)
* Invoke `Edit Configurations...` when the `Configuration Help` button is clicked.
2018-08-16 09:34:20 -07:00
Bob Brown 4afadad93b update changelog (#2411) 2018-08-16 09:22:46 -07:00
Sean McManus 3790fa95e7 Add intelliSenseEngine "Disabled". (#2392)
* Add intelliSenseEngine "Disabled".
2018-08-16 09:12:32 -07:00
Griffin Downs a0882446d9 Update changelog to reflect compile commands parsing fix (#2409)
* Update changelog to reflect compile commands parsing fix
2018-08-16 06:35:39 -07:00
Sean McManus ce59810a6d Update changelog for 0.18.0. (#2384)
* Update changelog for 0.18.0.
2018-08-15 13:45:38 -07:00
Sean McManus 770013d77e Enable environment variables with clang_format_path. (#2380)
* Enable environment variables with clang_format_path.
2018-08-15 09:39:45 -07:00
Pierson Lee 2388fa97f4 Update FAQs.md (#2343) 2018-08-08 11:26:53 -07:00
Sean McManus 3381cde61c Update changelog for 0.17.8-insiders. (#2353)
* Update changelog for 0.17.8-insiders.
2018-08-03 17:36:17 -07:00
Sean McManus 3a46f10d97 Add gcc-x64 intelliSenseMode. (#2315)
* Add gcc-x64 intelliSenseMode.
2018-08-02 13:53:19 -07:00
Bob Brown 2b4b5d397d add a setting to modify the behavior of go to symbol in workspace (#2349)
* add a setting to modify the behavior of go to symbol in workspace
2018-08-02 13:37:47 -07:00
Andy Neff c36eb8e7b1 Using sh instead of bash (#2340)
Fixes #569
2018-07-30 15:37:55 -07:00
Bob Brown ad46d3887a Only allow one configuration popup at a time (#2337) 2018-07-30 14:28:19 -07:00
Bob Brown 8b704f5972 allow users to use ~ for ${userprofile} on Windows (#2333) 2018-07-27 12:50:56 -07:00
Bob Brown 1009b76b22 minor tweaks to config provider experience (#2302) 2018-07-27 09:27:14 -07:00
John Patterson 84ff661e15 adds CHANGELOG entry for PR 2322 (#2325)
Realized I had left out the CHANGELOG update. For [PR
2322](https://github.com/Microsoft/vscode-cpptools/pull/2322).
2018-07-27 09:24:11 -07:00
Xeonacid 2292e7d762 Improve description in Extension/README.md (#2336)
`MinGW` is the proper spelling

`OS X` is now called `macOS`
2018-07-27 09:23:40 -07:00
Andrew Wang c8e30c70b1 Allow telemetry to detect failed downloads (#2332) 2018-07-26 13:35:34 -07:00
John Patterson 7947dd80d6 Add multi-pass environment variable resolution (#2322)
* Dependent variable definition
```
"env": {
    "envRoot": "apps/tool/builldenv",
    "arm6.include": "${envRoot}/arm6/include"
},
...
"some_config": "${arm6.include}
```

* Additionally, this fixes an open bug that was not reported. If a variable contained "env", "config", or "workspaceFolder" it would not be parsed correctly. If you used a variable ${envRoot} it would match "envR" as the type and "oot" as the variable. This has been resolved.

* Also fixes travis-ci to run the unit tests as part of checkin validation
2018-07-24 14:40:58 -07:00
John Patterson 913f740cc2 adds settings for inactive region font & bg color (#2308)
* adds settings for inactive region font & bg color

This adds the inactiveRegionForegroundColor and inactiveRegionBackgroundColor
settings. If a preprocessor block is found to be inactive, it will be
colored by these fields if they are set. They accept hexadecimal font
strings or valid theme colors as their values.These fields also
interactive with the dimInactiveRegions setting.

This was requested in issue
https://github.com/Microsoft/vscode-cpptools/issues/2212.
2018-07-23 15:52:41 -07:00
Sean McManus 2cbc90d98b Fix empty windowsSDKVersion. (#2301) 2018-07-20 17:07:14 -07:00
Bob Brown 25a29d0bc3 update fwlinks 2018-07-20 10:45:55 -07:00
Bob Brown 052f4e7b39 update version 2018-07-20 10:34:59 -07:00
Bob Brown 2b245202b5 Merge pull request #2295 from Microsoft/bobbrow/merge_release
0.17.7
2018-07-19 12:27:41 -07:00
Bob Brown 15c6c0a50e update version number 2018-07-19 12:23:32 -07:00
Bob Brown a0e0254c73 Add a setting to silence configuration provider warnings (#2293)
* Add a setting to silence configuration provider warnings
2018-07-19 12:14:05 -07:00
Sean McManus 528905326f Update changelog. (#2289) 2018-07-19 12:03:37 -07:00
Sean McManus 458b2be489 Update changelog for 0.17.7. (#2288)
* Update changelog for 0.17.7.
* Fix main snippet.
2018-07-18 16:10:00 -07:00
Pierson Lee 95d4724dc8 Update launch.md with miDebuggerArgs (#2270) 2018-07-13 15:56:49 -07:00
Sean McManus a178faab9b Update cpp.hint to use the injected defaults. (#2261) 2018-07-12 15:22:47 -07:00
Sean McManus 25aa8206a0 Update changelog. (#2257)
* Update changelog.
2018-07-12 14:54:21 -07:00
Sean McManus 879d880c82 Seanmcm/windows sdk version (#2241)
* Add windowsSDKVersion.
2018-07-10 15:57:03 -07:00
Bob Brown 16c4defcd0 Add a command to change the active custom config provider (#2247) 2018-07-09 16:03:35 -07:00
Bob Brown 725828c1c5 disable the config provider message for headers outside the workspace & while debugging (#2239)
* disable the config provider message for headers & while debugging

* leave the message on for headers inside the workspace folder
2018-07-07 15:11:46 -07:00
Bob Brown 8b188541ba fix spelling 2018-07-06 14:09:42 -07:00
Sean McManus 28f1bc991e Add ${VcpkgRoot} variable 2018-07-06 14:08:37 -07:00
Sean McManus aa424f1946 Fix bug c_cpp_properties.json creation after being deleted. (#2235)
Fix bug c_cpp_properties.json creation after being deleted: https://github.com/Microsoft/vscode-cpptools/issues/2214
2018-07-06 13:12:08 -07:00
Bob Brown 130711f4c5 Update Building the Extension.md 2018-07-03 10:25:12 -07:00
Bob Brown 863d26451c Merge pull request #2218 from Microsoft/master
merge master -> release
2018-07-02 11:38:35 -07:00
Bob Brown 0a85b6c115 Merge branch 'release' into master 2018-07-02 11:38:11 -07:00
Sean McManus f2b3bd5a18 Update changelog. (#2213)
* Update changelog.
2018-07-02 11:33:07 -07:00
Bob Brown ab3e498c17 update version for insiders branch (#2211) 2018-06-29 14:08:08 -07:00
Bob Brown bfad3045bd Merge branch 'insiders' into master 2018-06-29 14:00:30 -07:00
Andrew Wang 842e685a6a Removing dashes for ps command (#2185) 2018-06-29 13:59:14 -07:00
Bob Brown 3b36a23956 Merge pull request #2203 from Microsoft/master
merge master (one more change for 0.17.6)
2018-06-28 16:11:04 -07:00
Bob Brown bf7287e70b Merge branch 'master' of https://github.com/Microsoft/vscode-cpptools 2018-06-28 16:09:01 -07:00
Bob Brown 63ce03573c vscode-cpptools is in the wrong dependency list 2018-06-28 16:08:48 -07:00
Bob Brown 9ddf1098f7 update version for release (#2201)
* Update package.json

* Update package-lock.json
2018-06-28 12:58:02 -07:00
Bob Brown 56f4be1f65 Merge pull request #2200 from Microsoft/master
merge master to release for 0.17.6
2018-06-28 12:56:01 -07:00
Bob Brown 3b6dc61562 sanitize inputs (#2199) 2018-06-28 12:47:06 -07:00
Sean McManus b8a15ddfe6 Updated changelog and fwlinks. (#2195)
* Updated changelog and fwlinks.
2018-06-27 20:23:31 -07:00
Bob Brown f3e188c0ce fix version number (#2194)
* Update package.json

* Update package-lock.json
2018-06-27 13:20:12 -07:00
Bob Brown d403c8f984 Polishing the custom configuration provider experience (#2188) 2018-06-26 13:10:49 -07:00
Bob Brown 35288aad17 start sending installation failure telemetry again (#2189) 2018-06-26 12:35:58 -07:00
Bob Brown 9604256fb8 Merge pull request #2168 from Microsoft/master
Fix ${config:a.b} https://github.com/Microsoft/vscode-cpptools/issues…
2018-06-21 18:42:58 -07:00
Bob Brown d3f701823d Merge branch 'release' into master 2018-06-21 18:42:44 -07:00
Sean McManus 987347c4b6 Update CHANGELOG.md (#2161)
* Update CHANGELOG.md
2018-06-21 18:04:33 -07:00
Sean McManus 7e7a522603 Fix ${config:a.b} https://github.com/Microsoft/vscode-cpptools/issues… (#2166)
* Fix ${config:a.b} https://github.com/Microsoft/vscode-cpptools/issues/2165 .
2018-06-21 18:04:05 -07:00
Bob Brown 14bc488e5b Merge pull request #2154 from Microsoft/master
merge 0.17.5 release notes
2018-06-19 14:57:20 -07:00
Bob Brown 352745754b update (#2153) 2018-06-19 14:52:37 -07:00
Bob Brown dde3b515db update version numbers (#2152)
* Update package.json

* Update package-lock.json
2018-06-19 12:12:30 -07:00
Bob Brown cc6d7f3cac Merge pull request #2150 from Microsoft/master
0.17.5 merge from master
2018-06-19 12:10:38 -07:00
Bob Brown f8dbe57da7 Merge branch 'release' into master 2018-06-19 11:51:57 -07:00
Sean McManus 4fe877ed26 Update changelog, fwlinks, and fix an issue with abTesting. (#2143)
* Update changelog, fwlinks, and fix an issue with abTesting.
* Adding debugger changes to changelog
2018-06-19 11:41:22 -07:00
Griffin Downs 974ecd3ecb Grdowns/detect compile commands (#2137) 2018-06-19 10:36:01 -07:00
Bob Brown 7be69a0880 Bobbrow/recursive includes (#2136)
* Make recursive includePath the default again. Refactor A/B testing stuff.

* fix initialization dependency bug

* bugfix
2018-06-15 16:39:01 -07:00
Bob Brown d77470f753 make browse.path optional (#2135) 2018-06-15 16:34:57 -07:00
James Hamm 846cdc3a32 Updated the link for creating issues. (#2126)
The current link returns a 301 (permanent redirect) so we may as well just point straight to the site.
2018-06-13 07:41:45 -07:00
Andrew Wang 17c307a369 Adding miDebuggerArgs (#1974)
Fixing GenerateOptionsSchema too, due to linting fixes
2018-06-07 18:26:47 -07:00
Andrew Wang 485d762d70 Updating debugging MI Engine docs (#2103)
* Updating debugging MI Engine docs

* Forgot extensions
2018-06-07 18:18:31 -07:00
Sean McManus 4b90e4c151 Merge pull request #2100 from Microsoft/0_17_5_insiders
0 17 5 insiders
2018-06-07 16:26:44 -07:00
Sean McManus cc85f3d7c3 Merge, Also updated changelog and versions. 2018-06-07 16:15:56 -07:00
Sean McManus 73c025dcee Update dependencies due to vulnerabilities from npm audit. (#2095)
* Update dependencies due to vulnerabilities from npm audit.
2018-06-07 14:24:12 -07:00
Bob Brown 90b1ebd74c update version (#2097)
* Update package.json
* Update package-lock.json
2018-06-07 09:16:50 -07:00
Griffin Downs 3027e18968 Grdowns/inactive region opacity (#2061) 2018-06-06 12:14:19 -07:00
Pierson Lee 7729d0a700 Update issue templates (#2087)
* Update issue templates

* Remove old issues_template.md
2018-06-04 16:54:33 -07:00
Sean McManus c0e32437df Update version. (#2071) 2018-05-31 16:11:05 -07:00
Sean McManus b580b7347f Merge pull request #2069 from Microsoft/master
0.17.4 release
2018-05-31 16:07:20 -07:00
Bob Brown 4b5b086150 Merge branch 'release' into master 2018-05-31 16:01:48 -07:00
Sean McManus c5105f0731 Update for 0.17.4. (#2067) 2018-05-31 15:53:11 -07:00
b5e00c068e disable recursive includePath for ${workspaceFolder} in default c_cpp_properties.json (#2059) 2018-05-31 12:44:44 -07:00
Bob Brown 9b33938293 Fix startup bug (#2065) 2018-05-31 12:16:36 -07:00
Bob Brown a096ec9c6f Update Customizing Default Settings.md
typo
2018-05-25 10:00:42 -07:00
Bob Brown 847a2e3d5a reduce promise reject messages in the standard case (#2041) 2018-05-24 16:32:46 -07:00
Bob Brown 7b91a97ba7 Update extension version (#2035)
* Update package.json

* Update package-lock.json
2018-05-24 12:21:48 -07:00
henrywiechert 306a55da2e Update IntelliSense engine.md (#2040)
fix a link
2018-05-24 12:20:58 -07:00
Sean McManus 7553bb9358 Update ISSUE_TEMPLATE.md (#2030) 2018-05-22 13:34:39 -07:00
Sean McManus d786b0f602 Merge pull request #2029 from Microsoft/seanmcm/0_17_3_release
Seanmcm/0 17 3 release
2018-05-22 13:17:55 -07:00
Bob Brown a60c1c51f5 doc updates (#2028) 2018-05-22 12:58:29 -07:00
Bob Brown 891d590562 add support for ${workspaceFolder:<folder_name>} (#2027) 2018-05-22 12:58:09 -07:00
Sean McManus df7b77b6cf Update for 0.17.3. 2018-05-22 12:54:40 -07:00
Bob Brown 94a2b67e14 add support for ${workspaceFolder:<folder_name>} 2018-05-22 12:49:13 -07:00
Sean McManus fbbe28458a Merge for 0.17.2-insiders. 2018-05-21 19:24:59 -07:00
Sean McManus 5883747474 Update package-lock.json. (#2024) 2018-05-21 16:49:05 -07:00
Sean McManus 3f62ffd135 Merge pull request #2023 from Microsoft/seanmcm/0_17_2_release
Seanmcm/0 17 2 release
2018-05-21 16:00:03 -07:00
Sean McManus 7de9d166b8 Update version. 2018-05-21 15:19:50 -07:00
Sean McManus 2edf7267e8 Update for 0.17.2. (#2022) 2018-05-21 15:18:37 -07:00
Sean McManus 3f5b0b7220 Update for 0.17.2. (#2022) 2018-05-21 15:14:40 -07:00
Bob Brown baebe0acec Merge pull request #2011 from Microsoft/bobbrow/regression
fix regression from extension API change
2018-05-18 14:20:32 -07:00
Bob Brown 6d1264e6b1 fix regression from extension API change 2018-05-18 14:11:17 -07:00
Bob Brown 0d80edba3d Update package.json 2018-05-18 13:33:00 -07:00
Bob Brown 76870c637c Merge pull request #2010 from Microsoft/master
Merge master into insiders
2018-05-18 13:32:20 -07:00
Bob Brown 7cd7d3422c Update package.json 2018-05-18 13:31:37 -07:00
Bob Brown a4edf98976 Update package.json 2018-05-18 13:31:25 -07:00
Bob Brown bffafc058a Merge branch 'insiders' into master 2018-05-18 13:30:35 -07:00
Sherry Shi 01efb1a584 Allow other VS Code extensions to provide custom intellisense configurations. (#1804) 2018-05-18 11:03:08 -07:00
Sean McManus b1e40a4ccc Merge pull request #2005 from Microsoft/seanmcm/0_17_1_release
Seanmcm/0 17 1 release
2018-05-17 12:10:07 -07:00
Sean McManus 7d4aed2009 Update version. 2018-05-17 11:34:10 -07:00
Sean McManus 20d782349d Merge branch 'master' into release 2018-05-17 11:30:23 -07:00
Sean McManus a3a0572325 Merge branch 'release' 2018-05-17 11:28:44 -07:00
Sean McManus c9473b21d4 Update changelog. (#2003) 2018-05-16 19:57:30 -07:00
Sean McManus 74b5867660 Seanmcm/0 17 1 changelog (#1996)
* Updates for 0.17.1.
* Add C++17 fixes for msvc-x64.
2018-05-15 15:48:06 -07:00
Bob Brown d1e90b507f Remove outdated logic from getConfigIndexForPlatform (#1992) 2018-05-14 23:02:35 -07:00
Bob Brown 7f10e90a6f update https-proxy-agent version (#1984) 2018-05-11 16:38:30 -07:00
Bob Brown fbfb83ac30 Update Enabling logging.md 2018-05-11 14:08:45 -07:00
Bob Brown 8f8ed52aae Fix the file watcher (#1983) 2018-05-11 12:33:42 -07:00
Bob Brown a190707f67 update telemetry for settings changes (#1973)
update telemetry for settings changes
2018-05-09 15:11:29 -07:00
Bob Brown 79871a6587 update c_cpp_properties.json reference 2018-05-08 16:10:30 -07:00
Bob Brown ba65c4877c documentation updates for 0.17.0 (#1952)
* documentation updates for 0.17.0

* updates to logging docs

* PR feedback
2018-05-08 15:01:15 -07:00
Bob Brown 8c6a167787 update package.json for release (#1951)
* update package.json for release

* Update package-lock.json
2018-05-07 13:49:53 -07:00
Bob Brown 0ac4744c11 Merge pull request #1950 from Microsoft/master
Merge master -> release
2018-05-07 13:47:11 -07:00
Bob Brown 7ea61221bc update release notes and don't enable recursive includes by default in new folders (#1948)
* update release notes and don't enable recursive includes by default in new folders.

* changelog bug
2018-05-07 13:44:53 -07:00
Andrew Wang ff31eef0a2 Extension Development Improvements (#1941)
1. Updated tasks.json to 2.0
2. Added tslint problem matcher
   - Weird issue that problem does not disappear when resolved.
3. Adding tslint for class and function names.
   - class must be in PascalCase
   - funcitons must be in camelCase
4. Addressing vulnerability warning
   - https://github.com/Microsoft/vscode/issues/49146
2018-05-07 11:22:12 -07:00
jogo- 842856f08a Fix typo in README.md (#1944) 2018-05-07 10:41:38 -07:00
jogo- 2ded5b241e Fix typo in c_cpp_properties.schema.json (#1945) 2018-05-07 10:40:56 -07:00
Bob Brown 58cfb5ee10 add support for custom variables (#1921)
* add support for custom variables

* support for string[] variables

* rename "variables" to "env"
2018-05-04 20:18:42 -07:00
Andrew Wang 8deee74b68 Adding OptionsSchema generation (#1937)
* Adding OptionsSchema generation

This is to prevent repetitive fields from being copy and pasted
improperly.

* Move tslint to be after compile

* Address PR issues
2018-05-04 16:19:53 -07:00
Sean McManus d6aa178cac Fix issues introduced with VS Code 1.23.0. (#1925) 2018-05-03 16:57:38 -07:00
Bob Brown b5b1ceea98 trim the path before checking if it exists (#1924) 2018-05-03 16:27:03 -07:00
Bob Brown 264ed5eb23 trim the path before checking if it exists (#1924) 2018-05-03 16:21:52 -07:00
Griffin Downs ded26d66b0 Move settings update into updateToVersion4 function (#1916) 2018-05-03 12:47:45 -07:00
Bob Brown 90d28133e4 Update package.json (#1923)
* Update package.json
* Update package-lock.json
2018-05-02 22:16:21 -07:00
Bob Brown 39273f1087 Merge pull request #1922 from Microsoft/master
merge master into insiders for April insiders2
2018-05-02 22:12:14 -07:00
Sean McManus 00008a2d80 Dev/seanmcm/update changelog master0 17 0 insiders2 (#1920)
* Update changelog.

* Update changelog with snippets/vcpkg change.
2018-05-02 22:09:52 -07:00
Bob Brown 9396786be8 update changelog (#1918)
* update changelog

* PR feedback
2018-05-02 16:59:44 -07:00
Jim Griesmer da17254c03 Provide user hint through IntelliSense fallback msg that vcpkg is installed and is being used. (#1910) 2018-05-02 15:42:06 -07:00
Andrew Wang 3ddc2292cd Improve README, issue template, and test error output (#1898)
* Improve README and test error output

* Adding popular feature requests

* Feature Requests gets thumbs up, not issues.

* Adding info for issues
2018-05-02 13:47:04 -07:00
Sean McManus f58217f03f Recursive includePath changes. (#1896)
* Recursive includePath changes.
* Keep config/icons visible with settings json files.
2018-04-30 14:16:51 -07:00
Jim Griesmer f2d328161e Slight tweak for what vcpkg will do. (#1897) 2018-04-30 14:04:41 -07:00
Jim Griesmer 947fb78e9a Users/jimgries/snippets (#1823) 2018-04-30 13:55:01 -07:00
Bob Brown 0521bbec32 additional logging for language server spawn failure (#1895)
* additional logging for language server spawn failure
* Show the client failure message once per session instead of once in forever
2018-04-30 08:11:00 -07:00
Jim Griesmer 9249e27df5 Initial implementation for supporting vcpkg (#1886)
* Initial implementation for supporting vcpkg
2018-04-27 14:50:24 -07:00
Bob Brown 063c4bd753 shouldn't be attempting to re-register vscode's commands (#1893) 2018-04-27 13:30:48 -07:00
Andrew Wang 7c34669c60 Updating License.txt (#1879)
* Updating EULA

* Fix text

* Updated fwlink for vsdbg
2018-04-27 12:09:37 -07:00
Bob Brown 7f2fa088d8 remove bad bracket 2018-04-24 21:00:57 -07:00
Bob Brown 548d32f21b workspaceFolder 2018-04-24 20:58:44 -07:00
Bob Brown e55ef6e153 fix commas 2018-04-24 20:57:37 -07:00
Bob Brown 8a0fe21176 Merge branch 'master' into insiders 2018-04-24 08:32:06 -07:00
Bob Brown fdff9df795 wrong name for enum (#1872) 2018-04-24 08:31:39 -07:00
Bob Brown d4e23a6063 merge master for 0.17.0 insiders build 2018-04-23 15:24:34 -07:00
Sean McManus 80da21f199 Seanmcm/update changelog0 17 insiders1 (#1867)
* Update changelog.md.

* Added the clang-format 6.0 update.
2018-04-23 15:19:14 -07:00
Sean McManus b60b17b6a5 Update changelog.md. (#1866) 2018-04-23 15:02:39 -07:00
Bob Brown 6faac1071f Fixing issues found while testing settings changes (#1865)
* Fixing issues found while testing settings changes

* missed a property in the schema

* additional safety around config updates
2018-04-23 14:13:34 -07:00
Sean McManus 6648c400b7 Add preferredPathSeparator setting and update package.json version and fwlinks (#1854)
* Add preferredPathSeparator setting
* Update package.json version and fwlinks.
2018-04-20 14:15:56 -07:00
Bob Brown 8f21515eeb Add VS Code settings for configuration properties (#1848)
* Add VS Code settings for configuration properties
2018-04-19 15:20:20 -07:00
Sean McManus 313ce1928f Update c_cpp_properties.json.md (#1851) 2018-04-19 14:52:40 -07:00
Bob Brown 999aad5633 fix typo 2018-04-18 14:40:01 -07:00
Bob Brown 136091e8ce Updates to MinGW documentation (#1844)
* documentation update for mingw
2018-04-17 13:32:24 -07:00
Sean McManus 91e4f64f3d Update MinGW.md (#1841) 2018-04-16 08:44:25 -07:00
Andrew Wang 1318cce09f Adding snippet to fix pipeProgram in pipeTransport (#1829)
* Adding snippet to fix pipeProgram in pipeTransport

Now with VSCode 64 bit, WSL users need to use the correct pipeProgram in
the correct folder. We will attempt to help users with this.

* Fix tslint issue

* Remove 64 bit check and check for relative path
2018-04-13 18:02:21 -07:00
Andrew Wang 308e5a5c13 Download and Install Progress Window for Packages (#1806)
* Adding progress bar

* Updating vscode requirement and package version

* Updating message
2018-04-10 16:19:39 -07:00
Bob Brown e2b5bf9fbc Address config issues: #1599, #1790 (#1807)
* addresses #1599, #1790

* Update all configs when c_cpp_properties.json is parsed
2018-04-10 14:34:43 -07:00
Andrew Wang 7cff0f175d Prevent package.json rewrite from being checked in with test (#1809)
* Fix up package.json rewrite

VSCode package.json is readonly.

Rewriting package.json will use the disk package.json to prevent getting
expanded fields from VSCode. It will only read from disk once.

Added `gulp pr-check` to make sure that package.json activationEvents has
not been rewritten for open source contributers.

* run pr-check needs to be before run test

* Update log message
2018-04-10 12:04:29 -07:00
Pierson Lee 6517b8e395 Update launch.md for args to include comment about doublequoting (#1794)
* Update launch.md

* Update launch.md
2018-04-10 11:05:01 -07:00
Sean McManus a44bab5589 Fix https://github.com/Microsoft/vscode-cpptools/issues/1792 . (#1793) 2018-04-04 17:10:40 -07:00
Sean McManus 28102494b1 Update CONTRIBUTING.md (#1776)
Fix broken link.
2018-04-03 15:22:20 -07:00
Sean McManus 88a0494ce5 Merge pull request #1766 from Microsoft/master
Merge for 0.16.1 release
2018-03-30 17:08:02 -07:00
Sean McManus b32debdb76 Update package-lock.json version. (#1765) 2018-03-30 16:27:55 -07:00
Sean McManus 480af0c155 Dev/seanmcm/0 16 1 update (#1762)
* Update for 0.16.1.
2018-03-30 15:45:36 -07:00
Andrew Wang b65a89733c Adding file validation for download and unzip. (#1751)
* Adding file validation for download and unzip.

Refactored the download retry code.

Added error handlers for read and write streams.

WriteStream writes to a *.tmp file and then renames. This catches the
case if VSCode dies in the middle of this process and the file is
partially written. We will continue where we left off.

* Adding return to resolve/reject calls.

* Fix retry loop and check err in unlink and rename

* Actually wait for those promises

* Fix TSLint error
2018-03-28 15:58:08 -07:00
Bob Brown 3bbfed643f Merge pull request #1746 from Microsoft/master
Merge to release 0.16.0
2018-03-27 20:36:40 -07:00
Sean McManus 638fd678dc Update changelog date. (#1745) 2018-03-27 20:34:35 -07:00
Sean McManus ff5d363926 Don't set the compilerPath if the default is empty. (#1741)
* Don't set the compilerPath if the default is empty or compile commands is set.
* Guard against empty std.
2018-03-27 18:43:07 -07:00
Andrew Wang e0bb796423 Boolean default types should be boolean not string (#1732) 2018-03-23 13:27:59 -07:00
Sean McManus 1b218b2bd9 Merge pull request #1731 from Microsoft/dev/seanmcm/0_16_0_insiders2
Dev/seanmcm/0 16 0 insiders2
2018-03-23 13:26:27 -07:00
Sean McManus ddd85515fa Merge and update for 0.16.0-insiders2 2018-03-23 13:18:29 -07:00
Bob Brown d079892710 Merge pull request #1726 from Microsoft/master
Merge to release for 0.16.0
2018-03-22 12:23:03 -07:00
Sean McManus 56fd1e7076 Update changelog. (#1721)
* Update changelog.

* Minor edit.

* Forgot a bug fix.

* Add debugger bug.
2018-03-22 07:50:58 -07:00
Andrew Wang 1699ec02cd Adding -c flag to WSL configurations (#1722)
Missing the -c flag for bash.exe
2018-03-21 19:18:53 -07:00
Shubham Bhattar 97a635bf2d "taskName" changed to "label" as per version 2.0.0 (#1713)
Reference Link: https://code.visualstudio.com/docs/editor/tasks#_migrating-to-tasks-200
2018-03-21 12:44:47 -07:00
Bob Brown f5a2192235 update documentation (#1710) 2018-03-20 17:14:56 -07:00
Bob Brown 5d85eae737 Database icon is not using the theme color (#1638) (#1711) 2018-03-20 17:14:04 -07:00
Sean McManus 4fe2ec1bfe Dev/seanmcm/fix blank config with file watcher limit (#1709)
Fix blank config in the status bar (and browse engine stuck initializing) when the file watcher limit is hit.
2018-03-20 16:14:27 -07:00
Bob Brown 83a9cb2b02 anticipating release (#1703) 2018-03-19 15:58:57 -07:00
Bob Brown 905041068f More guards against crashes in configuration processing (#1702) 2018-03-19 15:58:25 -07:00
Sean McManus c68ad37d98 Seanmcm/change compiler path comments (#1688)
* Modify compilerPath description.

* Modification.
2018-03-15 13:04:29 -07:00
Bob Brown f857bc45c3 deal with error cases in configurations (#1687) 2018-03-14 13:28:48 -07:00
Bob Brown 263b69ed15 Merge pull request #1654 from Microsoft/master
don't repeatedly mark the c_cpp_properties.json file as dirty on Windows
2018-03-08 15:21:29 -08:00
Bob Brown 1177ab5cee don't repeatedly mark the c_cpp_properties.json file as dirty on Windows (#1653) 2018-03-08 15:16:19 -08:00
Bob Brown 3ca02dac55 Merge pull request #1652 from Microsoft/master
merge master
2018-03-08 08:59:51 -08:00
Sean McManus 17d19a93e0 Fix bug with compilerPath/cppVersion. (#1650) 2018-03-07 20:32:28 -08:00
Sean McManus 42698a85cd Update changelog.md and merge fix for https://github.com/Microsoft/vscode-cpptools/issues/1640. 2018-03-07 17:52:35 -08:00
Sean McManus 5fb96a6d02 Fix launch.json and activation stuck on cpptools.json downloading. (#1649)
* Fix launch.json and activation stuck on cpptools.json downloading.
2018-03-07 17:45:11 -08:00
Bob Brown 605adb1edd Merge pull request #1648 from Microsoft/master
merge master into insiders
2018-03-07 15:29:54 -08:00
Bob Brown 5e88dbfd79 Merge branch 'insiders' into master 2018-03-07 15:28:50 -08:00
Griffin Downs 35e002756e Check whether propertiesFile is null before accessing (#1647)
Travis looks like it's stalled. I'm going to force this in so we can build an insiders package.
2018-03-07 12:54:33 -08:00
Bob Brown 70cff29645 replace workspaceRoot with workspaceFolder (#1641)
* replace workspaceRoot with workspaceFolder (actual support is on the server side)
* update changelog
2018-03-06 08:35:03 -08:00
Sean McManus bd181c3b8f add compilerPath, cStandard, and cppStandard settings, fix inactive region deletion bug (#1549)
* Add compilerPath setting.
* Add code to query the default compiler.
* Add cStandard and cppStandard settings.
* Fix bug with inactive region deletion.
2018-03-02 16:29:27 -08:00
Bob Brown 00f70aed7c add support for force includes in c_cpp_properties.json (#1630) 2018-03-02 15:11:00 -08:00
Bob Brown bea033ef67 TypeScript compile needs to happen as part of prepublish step. (#1629) 2018-03-01 10:46:27 -08:00
Pierson Lee b05e8c5627 Correct Fix to make sure debugger dependencies are copied (#1621)
* Correct Fix to make sure debugger dependencies are copied

Fix double compile and make sure that it is only run once.

* Fix log

* Andrew requested outDir
2018-02-28 14:32:26 -08:00
Pierson Lee 523e8c9c26 Fixing misisng compile step before executing .js file (#1618) 2018-02-27 17:04:36 -08:00
Andrew Wang 6ad4814173 copySourceDependencies needs to be run every time (#1617)
This fixes the nightly builds
2018-02-27 15:58:20 -08:00
Bob Brown 6756be66d5 update c_cpp_properties.json documentation to version 3 (#1615) 2018-02-27 13:29:40 -08:00
Bob Brown a6c6c7e691 Add a setting to manage inactive region colorization (#1604) 2018-02-26 15:56:44 -08:00
Bob Brown 9937753e3a Add setting to enable multiline comment customizations (#1583)
* Work in progress.  Wrote framework for comment pattern handling.  Implementation incomplete and some bugs remain.

* address TODOs

* incorrect disposal

* incorrect type decorations

* WIP: update changelog, add a test

* test updates

* rename the setting, update package.json and add more tests

* deal with whitespace continuations

* address PR feedback
2018-02-21 13:35:51 -08:00
Andrew Wang 03cc6b26ec Adding setupCommands to attach configuraitons (#1593)
Addressing #1581
2018-02-20 17:11:29 -08:00
Hogyun Yu  (aka Philographer) 8cb05ed0cb Update ReleaseNotes.html (#1572) 2018-02-16 08:59:48 -08:00
Bob Brown d5fb6a1d15 faster launch times for extension debugging (#1555)
* add a way to speed up subsequent launches of the extension.

* A cleaner way to exit

* update package.json

* read the environment variable to short-circuit the node_modules check.
2018-02-15 12:44:05 -08:00
Sean McManus e5976d2656 Merge pull request #1557 from Microsoft/master
Merge for release.
2018-02-14 16:55:56 -08:00
Bob Brown e70f625212 release notes (#1566) 2018-02-14 16:42:48 -08:00
Bob Brown 625e5478be define __CHAR_BIT__ for Mac (#1564)
* define `__CHAR_BIT__` for Mac
* update changelog
2018-02-14 12:49:44 -08:00
Sean McManus e825292931 Update changelog. (#1556)
* Update changelog.
2018-02-13 17:29:36 -08:00
Charles Milette 2fcd4b4943 Add _UNICODE to default defines on Windows (#1540)
* Add _UNICODE to default defines on Windows
Fixes #1538
2018-02-08 17:42:22 -08:00
ronglums f5b2d30182 Moved the extension building instructions into a separate file. (#1537)
Moved the extension building instructions into a separate file.
2018-02-08 12:02:32 -08:00
Joshua Cannon d5af9a1b45 Adding configuration variable replacement in c_cpp_properties.json. (#1529)
* Adding configuration variable replacement in c_cpp_properties.json. #314

* Fixing issues brought up by linter
2018-02-07 10:35:31 -08:00
Faheel Ahmad e6d8d1fb28 Improve documentation (#1515)
* improve Markdown formatting
* use consistent formatting rules for all Markdown files
* fix typos
* fix broken links
2018-02-07 08:04:18 -08:00
Sean McManus 536182cf1f Change for insiders. 2018-02-01 12:58:43 -08:00
Bob Brown 7a39edaf65 Fix crash in client module (#1506)
Temporary key name was lost outside of the switch block, resulting in an attempt to access .length of 'undefined'
2018-01-31 14:29:16 -08:00
Griffin Downs fd7b691885 Inactive region highlight (#1505)
* Add intermediary type to safely construct vscode.Ranges for use

* Fix incorrect object definition

* Fix file empty edge case; refactor + comment out code while testing

* Use InputRegions (lines only); Remove commented out code

* Commenting

* Fix linter error from merge with master
2018-01-31 14:02:01 -08:00
Sean McManus 42ddf188f3 Fix for https://github.com/Microsoft/vscode-extension-telemetry/issues/7 (#1499)
* Fix for https://github.com/Microsoft/vscode-extension-telemetry/issues/7 .
* Filter out settings values that don't match enum values.
2018-01-29 17:24:08 -08:00
Sean McManus 3512cb370b Seanmcm/telemetry fix (#1494)
* Fix telemetry.
2018-01-29 12:56:43 -08:00
Andrew Wang aa0f613dfb Force semicolon in object literal (#1493) 2018-01-26 11:01:44 -08:00
Griffin Downs b68d1e173e Add intermediary type to safely construct vscode.Ranges for use (#1492)
* Add intermediary type to safely construct vscode.Ranges for use

* Fix incorrect object definition
2018-01-25 16:46:24 -08:00
Sean McManus 58e403d9e0 Merge pull request #1490 from Microsoft/seanmcm/update0_15_0
Update stuff for 0.15.0 in preparation for the insider release.
2018-01-25 15:52:14 -08:00
Sean McManus d46c0594b5 Merge branch 'seanmcm/update0_15_0' of https://github.com/Microsoft/vscode-cpptools into seanmcm/update0_15_0 2018-01-25 14:35:19 -08:00
Sean McManus 44f65f2e14 Merge. 2018-01-25 14:35:01 -08:00
Bob Brown fca11d63c4 Merge branch 'master' into seanmcm/update0_15_0 2018-01-25 14:33:44 -08:00
grdowns 572f21a7e2 Merge pull request #1482 from Microsoft/inactive-region-highlight
Inactive region highlight
2018-01-25 14:31:09 -08:00
Sean McManus c2c84aaf7f Change date to 14th. 2018-01-25 14:13:46 -08:00
Griffin Downs 0eae7fd7a3 Rename method; Re-word commenting 2018-01-25 14:11:22 -08:00
Sean McManus ca777a2172 Change date. 2018-01-25 13:12:51 -08:00
Sean McManus c57da0d645 Change error limit to 25000. 2018-01-25 12:27:51 -08:00
Griffin Downs dd2ca57532 Compare each range by value instead of by reference 2018-01-25 11:52:43 -08:00
Griffin Downs f614c75ab6 Fix no return error 2018-01-25 11:05:42 -08:00
Griffin Downs be1bae2321 *Correctly* use guard 2018-01-25 10:37:25 -08:00
Griffin Downs 0af3069091 Guard against decorations being set on update but without changes 2018-01-25 10:26:30 -08:00
Sean McManus 8e86dd333a Update stuff for 0.15.0. 2018-01-24 19:47:17 -08:00
Griffin Downs 31a53bd95f Merge branch 'inactive-region-highlight' of https://github.com/Microsoft/vscode-cpptools into inactive-region-highlight 2018-01-24 14:27:02 -08:00
Griffin Downs 4d0490edf7 Merge branch 'master' of https://github.com/Microsoft/vscode-cpptools into inactive-region-highlight 2018-01-24 14:25:52 -08:00
Griffin Downs 02dc3fecda Express conditional more idiomatically 2018-01-24 14:25:20 -08:00
Griffin Downs 84fd6a21eb Uncomment guard block; Move comment 2018-01-24 14:11:55 -08:00
Griffin Downs b1c332ba34 Move interface + capitalize 2018-01-24 13:57:09 -08:00
grdowns 1e8ea4a656 Merge branch 'master' into inactive-region-highlight 2018-01-24 13:54:44 -08:00
Bob Brown 510094a71d fix a bug in resolveVariables util function (#1488) 2018-01-24 13:54:17 -08:00
Griffin Downs 6f9a8e10a8 Modify light theme coloration; Add decorationRangePair interface; Guard against undefined return value 2018-01-24 13:45:56 -08:00
Griffin Downs 4ab47bd2c9 Var rename for consistence + commenting 2018-01-24 10:23:16 -08:00
Griffin Downs 1ccc670265 Wording on comment 2018-01-24 10:08:35 -08:00
Griffin Downs e4634395c3 Refactor updateInactiveRegions + comment 2018-01-24 10:04:25 -08:00
Griffin Downs 3c012719c6 Use Map to track text editors and apply decorations as they become visible 2018-01-24 09:41:10 -08:00
Griffin Downs 74f567db16 Rename and move decoration object 2018-01-23 14:14:20 -08:00
Griffin Downs d444874f0d Remove auto-generated files/changes; Properly set text decorations 2018-01-23 13:38:44 -08:00
Griffin Downs 762de3ff28 Merge branch 'master' of https://github.com/Microsoft/vscode-cpptools into inactive-region-highlight 2018-01-22 17:03:38 -08:00
Griffin Downs 24c4f7f8c3 Add TODO 2018-01-22 15:59:25 -08:00
Griffin Downs 0622ade175 Fix deprecated launch.json; Add auto-generated files 2018-01-22 15:58:13 -08:00
Andrew Wang ecd1b06bef Adding triple-equals to tslint (#1480)
https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true
2018-01-22 11:12:45 -08:00
jogo- dfec64f233 Fix typos in CHANGELOG.md (#1478) 2018-01-22 08:51:36 -08:00
Griffin Downs 0bdd303978 Add notification for inactive regions; Respond by changing text color 2018-01-19 16:15:46 -08:00
Bob Brown 6c21e5445b Create CODE_OF_CONDUCT.md 2018-01-19 08:47:11 -08:00
Seokhwan Song 02201d3961 fix wrong URL (msvscode -> vscode) (#1470) 2018-01-19 08:12:46 -08:00
131 changed files with 20505 additions and 8427 deletions
+30
View File
@@ -0,0 +1,30 @@
---
name: Debugger
about: Issues pertaining to debugging such as call stack, breakpoints, watch window,
launching or attaching to a debuggee.
---
Type: Debugger
**Input information below**
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
**Describe the bug**
- OS and Version:
- VS Code Version:
- C/C++ Extension Version:
- Other extensions you installed (and if the issue persists after disabling them):
- A clear and concise description of what the bug is.
**To Reproduce**
*Please include a code sample and `launch.json` configuration.*
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Additional context**
*If applicable, please include logging by adding "logging": { "engineLogging": true, "trace": true, "traceResponse": true } in your `launch.json`*
Add any other context about the problem here including log or error messages in your Debug Console or Output windows.
@@ -0,0 +1,34 @@
---
name: General Extension
about: Issues pertaining to downloading, installing, or building the extension.
---
Type: General
**Input information below**
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
**Describe the bug**
- OS and Version:
- VS Code Version:
- C/C++ Extension Version:
- Other extensions you installed (and if the issue persists after disabling them):
- A clear and concise description of what the bug is.
**To Reproduce**
*Please include code sample and `task.json` files.*
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here including log messages from the Output window.
@@ -0,0 +1,39 @@
---
name: Language Service
about: 'Issues pertaining to IntelliSense, autocomplete, code editing, etc. '
---
**Type: LanguageService**
<!----- Input information below ----->
<!--
**Please review existing issues and our documentation at https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation prior to filing an issue.**
-->
**Describe the bug**
- OS and Version:
- VS Code Version:
- C/C++ Extension Version:
- Other extensions you installed (and if the issue persists after disabling them):
- A clear and concise description of what the bug is.
**To Reproduce**
<!-- Steps to reproduce the behavior: -->
<!-- *The most actionable issue reports include a code sample including configuration files such as c_cpp_properties.json* -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
**Additional context**
<!--
* Call Stacks: For bugs like crashes, deadlocks, infinite loops, etc. that we are not able to repro and for which the call stack may be useful, please attach a debugger and/or create a dmp and provide the call stacks. Windows binaries have symbols available in VS Code by setting your "symbolSearchPath" to "https://msdl.microsoft.com/download/symbols".
* Add any other context about the problem here including log messages in your Output window ("C_Cpp.loggingLevel": "Debug" in settings.json).
-->
+7
View File
@@ -0,0 +1,7 @@
# ignore cache files for sample projects
.vscode/ipch
browse*.db*
*.obj
*.pdb
*.exe
*.ilk
-43
View File
@@ -1,43 +0,0 @@
language: node_js
node_js:
- "8"
before_install:
# Do not modify. Required for GUI based tests: See https://docs.travis-ci.com/user/gui-and-headless-browsers/#Using-xvfb-to-Run-Tests-That-Require-a-GUI
- if [ $TRAVIS_OS_NAME == "linux" ]; then
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;
sh -e /etc/init.d/xvfb start;
sleep 3;
fi
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: 'deb https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main'
key_url: 'https://packages.microsoft.com/keys/microsoft.asc'
packages:
- gdb
- g++-4.9
script:
# Download debugAdapters from an existing extension version. See TravisCI settings to set CPPTOOL_VERSION
- mkdir -p ~/.vscode/extensions/ms-vscode.cpptools-$CPPTOOL_VERSION
- wget https://github.com/Microsoft/vscode-cpptools/releases/download/$CPPTOOL_VERSION/cpptools.vsix -O ~/cpptools.vsix
- unzip ~/cpptools.vsix "extension/debugAdapters/*" -d ~/.
- mv ~/extension/debugAdapters ~/.vscode/extensions/ms-vscode.cpptools-$CPPTOOL_VERSION/debugAdapters
# Build and then run tests
- cd Extension
- npm install
- npm run tslint
- npm run compile
- npm run test
after_failure:
- find ~ -name "integrationTests.log" -type f -exec cat {} \;
after_success:
- find ~ -name "integrationTests.log" -type f -exec cat {} \;
+3
View File
@@ -0,0 +1,3 @@
## Microsoft Open Source Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact opencode@microsoft.com with any additional questions or comments.
+16 -14
View File
@@ -1,18 +1,20 @@
# How to Contribute Changes
## Contribution Steps:
* [Build and debug the extension](Documentation/Getting%20started.md#build-and-debug-the-cpptools-extension).
* File an [issue](https://github.com/Microsoft/vscode-cpptools/issues) and a [pull request](https://github.com/Microsoft/vscode-cpptools/pulls) with the change and we will review it.
* If the change affects functionality, add a line describing the change to [CHANGELOG.md](Extension/CHANGELOG.md).
* Try and add a test in [test/extension.test.ts](Extension/test/unitTests/extension.test.ts).
* Run tests via opening the [Extension](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension) folder in Visual Studio Code, selecting the `Launch Tests` configuration in the Debug pane, and choosing `Start Debugging`.
## Contribution Steps
* [Build and debug the extension](Documentation/Building%20the%20Extension.md).
* File an [issue](https://github.com/Microsoft/vscode-cpptools/issues) and a [pull request](https://github.com/Microsoft/vscode-cpptools/pulls) with the change and we will review it.
* If the change affects functionality, add a line describing the change to [**CHANGELOG.md**](Extension/CHANGELOG.md).
* Try and add a test in [**test/extension.test.ts**](Extension/test/unitTests/extension.test.ts).
* Run tests via opening the [**Extension**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension) folder in Visual Studio Code, selecting the "Launch Tests" configuration in the Debug pane, and choosing "Start Debugging".
## About the Code
* Execution starts in the `activate` method in [main.ts](Extension/src/main.ts).
* `processRuntimeDependencies` handles the downloading and installation of the OS-dependent files. Downloading code exists in [packageManager.ts](Extension/src/packageManager.ts).
* `downloadCpptoolsJsonPkg` handles the `cpptools.json`, which can be used to enable changes to occur mid-update, such as turning the `intelliSenseEngine` to `"Default"` for a certain percentage of users.
* The debugger code is in the [Debugger](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension/src/Debugger) folder.
* [LanguageServer/client.ts](Extension/src/LanguageServer/client.ts) handles various language server functionality.
* [LanguageServer/configurations.ts](Extension/src/LanguageServer/configurations.ts) handles functionality related to `c_cpp_properties.json`.
* [telemetry.ts](Extension/src/telemetry.ts): Telemetry data gets sent to either `logLanguageServerEvent` or `logDebuggerEvent`.
* The Tag Parser (symbol database) doesn't automatically expand macros, so the [cpp.hint](Extension/cpp.hint) file contains definitions of macros that should be expanded in order for symbols to be parsed correctly.
* Execution starts in the `activate` method in [**main.ts**](Extension/src/main.ts).
* `processRuntimeDependencies` handles the downloading and installation of the OS-dependent files. Downloading code exists in [**packageManager.ts**](Extension/src/packageManager.ts).
* `downloadCpptoolsJsonPkg` handles the **cpptools.json**, which can be used to enable changes to occur mid-update, such as turning the `intelliSenseEngine` to `"Default"` for a certain percentage of users.
* The debugger code is in the [**Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/master/Extension/src/Debugger) folder.
* [**LanguageServer/client.ts**](Extension/src/LanguageServer/client.ts) handles various language server functionality.
* [**LanguageServer/configurations.ts**](Extension/src/LanguageServer/configurations.ts) handles functionality related to **c_cpp_properties.json**.
* [**telemetry.ts**](Extension/src/telemetry.ts): Telemetry data gets sent to either `logLanguageServerEvent` or `logDebuggerEvent`.
* The Tag Parser (symbol database) doesn't automatically expand macros, so the [**cpp.hint**](Extension/cpp.hint) file contains definitions of macros that should be expanded in order for symbols to be parsed correctly.
@@ -0,0 +1,19 @@
#ifndef BOX_H
#define BOX_H
/**
* Definition of a box object with three dimensions.
*/
struct box
{
int length;
int width;
int height;
int volume()
{
return length * width * height;
}
};
#endif
+24
View File
@@ -0,0 +1,24 @@
# Box Sample
This sample is a simple C++ program that computes and outputs the volume of a box.
We use this example in our blog posts to illustrate new extension features.
## Build and Debug Active File
Available as of March 2019, "Build and Debug Active File" automatically configures the build tasks and kicks off a build and debug session. There are
three ways to get started with this feature.
### Command
While editing a file in your workspace folder, you can open the command palette and select the `C/C++: Build and Debug Active File` command.
This option will generate a tasks.json file for you, build your active source file, and then launch the debugger.
![Open command palette and select Build and Debug Active File](build_debug_command.png)
### Context Menu
While editing a file in a workspace folder, you can right click in the editor field and select the "Build and Debug Active File" context menu option.
This option will generate a tasks.json file for you, build your active source file, and then launch the debugger.
![Right click and select Build and Debug Active File](build_debug_context_menu.png)
### F5
Another way to begin building and debugging your active file is to execute the command by pressing <kbd>F5</kbd>. This method will configure
both a tasks.json and launch.json file for you, build your active source file, and then launch the debugger.
@@ -0,0 +1,16 @@
#include <iostream>
#include "Objects/box.h"
using namespace std;
/**
* Calculate and print the volume of a box.
*/
int main()
{
box package{ 10, 10, 10 };
cout << "Package length: " << package.length << endl;
cout << "Package width: " << package.width << endl;
cout << "Package height: " << package.height << endl;
cout << "Package volume: " << package.volume() << endl;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

+2 -2
View File
@@ -4,7 +4,7 @@
"version": "2.0.0",
"tasks": [
{
"taskName": "build",
"label": "build",
"type": "shell",
"group": {
"kind": "build",
@@ -47,4 +47,4 @@
}
}
]
}
}
@@ -1,2 +0,0 @@
main.exe
main.exe.dSYM
-17
View File
@@ -1,17 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/main.exe", // this is executable to launch the debugger with
"args": ["YourNameHere"],
"stopAtEntry": true, // if true then stop at the main entry (function)
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "lldb"
}
]
}
-19
View File
@@ -1,19 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"taskName": "clang++",
"command": "clang++ --debug -o main.exe main.cpp",
// "--debug" enables debugging symbols
// "-o main.exe" specifies the output executable
// "main.cpp" is the source file to compile
"type": "shell",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
-10
View File
@@ -1,10 +0,0 @@
# README
This is a sample debuggable C++ project. It uses the vendor provided version of clang installed. `tasks.json` and `launch.json` have been edited to demonstrate how to create a configuration for a C++ project that builds with clang.
There's a sample build task in `.vscode/tasks.json`; you can also see the build configurations by using the menu option `Configure` -> `Configure Tasks` or by clicking the gear icon in the Debug Panel.
To run a build, use the menu option `Tasks` -> `Run Build Task...`.
There's a sample debug configuration in `.vscode/launch.json`; you can also see the configuration by using the menu option `Debug` -> `Open Configurations`.
To debug the build, use the menu option `Debug` -> `Start Debugging`. The executable will launch and stop in the main function.
-17
View File
@@ -1,17 +0,0 @@
#include <iostream>
#include <string>
using namespace std;
void greet(const string& person) {
cout << "Hello, " << person << "!" << endl;
}
int main(int argc, char** argv) {
if(argc >= 2) {
greet(argv[1]);
} else {
cerr << "insufficient args, usage: " << argv[0] << " personNameHere" << endl;
}
return 0;
}
+14
View File
@@ -0,0 +1,14 @@
## How to build and debug the Microsoft CppTools Extension
These steps will allow you to debug the TypeScript code that is part of the Microsoft CppTools extension for Visual Studio Code.
Prerequisite steps:
* Clone the release branch of [this](https://github.com/Microsoft/vscode-cpptools) repository.
* git clone -b release https://github.com/Microsoft/vscode-cpptools
* Install [npm](https://nodejs.org).
* From a command line, run the following commands from the **Extension** folder in the root of the repository:
* `npm install` will install the dependencies needed to build the extension.
* **(optional)** `npm install -g vsce` will install `vsce` globally to create a VSIX package that you can install.
* **(optional)** Set an environment variable `CPPTOOLS_DEV=1`.
* This enables the local developer workflow when testing the debugger, copying dependencies from the **node_modules** folder. Testing the language server does not require this step.
* Open the **Extension** folder in Visual Studio Code and press F5. This will launch a VS Code Extension Host window and activate the TypeScript debugger. You can set breakpoints on the extension source code and debug your scenario.
+82 -33
View File
@@ -1,7 +1,6 @@
# How To Debug MIEngine (Work in Progress)
*This is a work in progress. Please create a pull request with updates if there is anything wrong with it.*
# How To Debug MIEngine
MIEngine is one of the components used to enable the C/C++ debugging scenario with the Microsoft C/C++ extension with VS Code. This document is to help enable users who want to debug and contribute to MIEngine to fix issues or extend functionality. MIEngine is used to communicate with `gdb/lldb` using the MI protocol.
MIEngine is one of the components used to enable the C/C++ debugging scenario with the Microsoft C/C++ extension with VS Code. This document is to help enable users who want to debug and contribute to MIEngine to fix issues or extend functionality. MIEngine is used to communicate with `gdb`/`lldb` using the MI protocol.
**Repository:** https://github.com/Microsoft/MIEngine
@@ -9,69 +8,119 @@ MIEngine is one of the components used to enable the C/C++ debugging scenario wi
To build MIEngine, you will either need Visual Studio 2015+ installed or at the very least [MSBuild](https://github.com/Microsoft/msbuild) installed. The configuration you want to build is `Desktop.Debug`.
You can open the solution file `MIDebugEngine.sln` located under `src` and change the configuration and build. You will want to look in the `bin\Desktop.Debug` folder for the compiled bits. You will need to copy the following files to your `.vscode\extensions\ms-vscode.cpptools-<version>\debugadapters\bin` folder in your users/home folder:
You can open the solution file **MIDebugEngine.sln** located under **src** and change the configuration and build. You will want to look in the **bin\Desktop.Debug** folder for the compiled bits. You will need to copy the following files to your **.vscode\extensions\ms-vscode.cpptools-\<version\>\debugadapters\bin** folder in your users/home folder:
* Microsoft.MICore.dll
* Microsoft.MICore.XmlSerializers.dll
* Microsoft.MIDebugEngine.dll
* vscode\OpenDebugAD7.exe
* vscode\Microsoft.DebugEngineHost.dll
* vscode\Microsoft.VisualStudio.Shared.VSCodeDebugProtocol.dll
The symbol files are as follows:
**On Windows**
* Microsoft.MICore.pdb
* Microsoft.MIDebugEngine.dll
* Microsoft.MIDebugEngine.pdb
* vscode\OpenDebugAD7.pdb
* vscode\Microsoft.DebugEngineHost.pdb
**On Linux/Mac**
* Microsoft.MICore.dll.mdb
* Microsoft.MIDebugEngine.dll.mdb
* vscode\OpenDebugAD7.exe.mdb
* vscode\Microsoft.DebugEngineHost.dll.mdb
### Debugging On Windows
On Windows, the easiest way to debug is to use Visual Studio. Locate the `package.json` file in the extension folder and open it in an editor.
On Windows, the easiest way to debug is to use Visual Studio. Locate the **src\Debugger\extension.ts** file in the **Extension** folder and open it in an editor.
Locate the following line:
If you are not building the extension, Locate the **out\src\Debugger\extension.ts** file in the **.vscode\extensions\ms-vscode.cpptools** folder and open it in an editor.
Locate the following lines:
```json
"program": "./debugAdapters/OpenDebugAD7",
return {
command: command
};
```
and add the following line below it:
and add the following line to the object:
```json
"args": ["--pauseForDebugger"],
args: ["--pauseForDebugger"]
```
This will cause the debugger to look like it has hung once you start debugging, but in reality it is waiting for a debugger to attach. Set your breakpoints and attach your debugger to the `OpenDebugAD7.exe` process. Once the debugger is attached, VS Code should start debugging and you can reproduce your scenario.
### Debugging MIEngine running on Linux or Mac OS X
#### With MonoDevelop
On Linux and Mac OS X, we use `mono` as our framework. You can download Xamarin Studio v5.10.1.6 and remotely attach to your Mac or Linux box to debug there.
#### Install Prerequisites
1. Install [GTK](http://www.mono-project.com/download/)
2. Install [Xamarin Studio v5.10.1.6](http://download.xamarin.com/studio/Windows/XamarinStudio-5.10.1.6-0.msi)
##### Install Prerequisites
1. Install [GTK](http://www.mono-project.com/download/).
2. Install [Xamarin Studio v5.10.1.6](http://download.xamarin.com/studio/Windows/XamarinStudio-5.10.1.6-0.msi).
Remote attach functionality behind a flag. You can run it like this:
```
cd "\Program Files (x86)\MonoDevelop\bin"
set MONODEVELOP_SDB_TEST=1
MonoDevelop.exe
```PowerShell
cd "\Program Files (x86)\MonoDevelop\bin"
set MONODEVELOP_SDB_TEST=1
MonoDevelop.exe
```
#### Create an empty project for attaching (one-time setup)
1. Launch MonoDevelop
2. File -> New Solution
3. Misc/Generic Project
4. Name project and hit "Create"
5. Right-click the project node (blue square) and do "Options"
6. Under Run -> Custom Commands, select "Execute" in the lower dropdown and choose a command (I use c:\windows\notepad.exe - it doesn't matter what the command is, but MonoDevelop requires it to exist before it'll light up the Run menu).
##### Create an empty project for attaching (one-time setup)
#### Configure the extension to enable remote debugging
Open the `~/.vscode/extensions/ms-vscode.cpptools-<version>/debugAdapters/OpenDebugAD7` file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from Xamarin Studio.
1. Launch MonoDevelop.
2. File -> New Solution.
3. Misc/Generic Project.
4. Name project and hit "Create".
5. Right-click the project node (blue square) and do "Options".
6. Under Run -> Custom Commands, select "Execute" in the lower dropdown and choose a command (I use `c:\windows\notepad.exe` - it doesn't matter what the command is, but MonoDevelop requires it to exist before it'll light up the Run menu).
#### Attach the remote debugger
In MonoDevelop: Run -> Run With -> Custom Command Mono Soft Debugger
Fill in the IP and port of the Linux/Mac OS X machine and hit "Connect" to start debugging
##### Configure the extension to enable remote debugging
After you've done this once, you can hit the MonoDevelop "Play" button or F5 to bring up the connect dialog again.
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from Xamarin Studio.
Note: If you are debugging to CentOS, you will need to make an exception in the firewall
* sudo firewall-cmd --zone=public --add-port=1234/tcp --permanent
* sudo firewall-cmd --reload
##### Attach the remote debugger
In MonoDevelop: Run -> Run With -> Custom Command Mono Soft Debugger.
Fill in the IP and port of the Linux/Mac OS X machine and hit "Connect" to start debugging.
After you've done this once, you can hit the MonoDevelop "Play" button or <kbd>F5</kbd> to bring up the connect dialog again.
#### With VS Code + Mono Debug
##### Install Prerequisites
1. Install [VS Code](https://code.visualstudio.com/Download).
2. Install Mono Debug extension for VS Code.
##### Create an empty project (one-time setup)
1. Open to a new folder and create `.vscode/launch.json`.
2. Create the following configuration in launch.json.
```
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Mono",
"request": "attach",
"type": "mono",
"address": "<INSERT_MACHINE_IP_ADDRESS_HERE>",
"port": 1234
}
]
}
```
##### Configure the extension to enable remote debugging
Open the **~/.vscode/extensions/ms-vscode.cpptools-\<version\>/debugAdapters/OpenDebugAD7** file with a text editor and locate and uncomment the line at the bottom. When you start debugging, it will now hang until the remote debugger is attached from VS Code.
##### Attach the remote debugger
Select the `Attach to Mono` configuration and hit F5.
#### Additional Notes
Note: If you are debugging to CentOS, you will need to make an exception in the firewall.
* `sudo firewall-cmd --zone=public --add-port=1234/tcp --permanent`
* `sudo firewall-cmd --reload`
+36 -34
View File
@@ -1,52 +1,54 @@
# Pipe Transport
Pipe Transport allows communication through a pipe program to a remote shell. An example on linux would be `ssh`.
Pipe Transport allows communication through a pipe program to a remote shell. An example on Linux would be `ssh`.
## How-To
We have added `"pipeTransport"` as an option within the `launch.json` file. The structure looks as follows:
```
"pipeTransport": {
"pipeCwd": "/usr/bin",
"pipeProgram": "/usr/bin/ssh",
"pipeArgs": [
"-pw",
"<password>",
"[email protected]"
],
"debuggerPath": "/usr/bin/gdb"
},
We have added `"pipeTransport"` as an option within the **launch.json** file. The structure looks as follows:
```json
"pipeTransport": {
"pipeCwd": "/usr/bin",
"pipeProgram": "/usr/bin/ssh",
"pipeArgs": [
"-pw",
"<password>",
"[email protected]"
],
"debuggerPath": "/usr/bin/gdb"
},
```
The `pipeArgs` can be any set of arguments necessary to setup and authenticate the pipe connection. In the example, a password is used but you can also use an ssh key.
You may also need to add a `sourceFileMap` to map the path of where the code exists on the remote shell to where it is locally:
```
"sourceFileMap": {
// "remote": "local"
"/home/user/src": "/src/projectA/src"
}
```json
"sourceFileMap": {
// "remote": "local"
"/home/user/src": "/src/projectA/src"
}
```
## Attach
You can also use the above `pipeTransport` block to attach to a remote process. In the attach case, you will need to specify a `processId`. We have added the ability to query processes from the remote machine. To do this, change `"processId": "${command.pickProcess}"` to `"processId": "${command.pickRemoteProcess}"`. The `pipeTransport` settings will be used to query the processes on the remote machine. Then select the process from the drop down list. As with `launch`, you may need to configure `sourceFileMap`.
## Docker example
The `pipeTransport` can also be used to debug a process in a Docker container. For an attach, the `launch.json` will include:
The `pipeTransport` can also be used to debug a process in a Docker container. For an attach, **launch.json** will include:
```json
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "docker",
"pipeArgs": [
"exec",
"-i",
"hello_gdb",
"sh",
"-c"
],
"debuggerPath": "/usr/bin/gdb"
},
```
"pipeTransport": {
"pipeCwd": "${workspaceRoot}",
"pipeProgram": "docker",
"pipeArgs": [
"exec",
"-i",
"hello_gdb",
"sh",
"-c"
],
"debuggerPath": "/usr/bin/gdb"
},
```
Where `hello_gdb` is the name of your container.
Launching a process is accomplished by starting a container and then using the same `pipeTransport` launch additional processes in the container. See this [`launch.json`](https://github.com/andyneff/hello-world-gdb/blob/master/.vscode/launch.json) for a [full example](https://github.com/andyneff/hello-world-gdb/)
Launching a process is accomplished by starting a container and then using the same `pipeTransport` launch additional processes in the container. See this [**launch.json**](https://github.com/andyneff/hello-world-gdb/blob/master/.vscode/launch.json) for a [full example](https://github.com/andyneff/hello-world-gdb/).
@@ -1,88 +1,91 @@
# Windows 10's Windows Subsystem for Linux
With the release of Windows 10 Creators Update (Build 15063), you will now be able to use Visual Studio Code and the Microsoft C/C++ extension to debug your `Windows Subsystem for Linux (WSL)` [Bash on Ubuntu](https://msdn.microsoft.com/en-us/commandline/wsl/about) projects.
With the release of Windows 10 Creators Update (Build 15063), you will now be able to use Visual Studio Code and the Microsoft C/C++ extension to debug your [Windows Subsystem for Linux (WSL)](https://msdn.microsoft.com/en-us/commandline/wsl/about) projects.
Code can be written on Windows itself using VSCode and debugged through `bash.exe` to the Bash on Windows layer.
As of the Fall Creator's Update, you can have multiple distros installed, but `bash.exe` and `wsl.exe` use the default distro. Use [WSL Config](https://msdn.microsoft.com/en-us/commandline/wsl/wsl-config) to set your default distro.
**NOTE: Creator's Update (Build 15063 or later) is required due to bugfixes within the subsystem that we rely on to provide debugging. Debugging using a previous version of WSL is unsupported and likely will not work. To check your Windows version, enter `winver` in a command prompt.**
**NOTE: Creator's Update (Build 15063 or later) is required due to bug-fixes within the subsystem that we rely on to provide debugging. Debugging using a previous version of WSL is unsupported and likely will not work. To check your Windows version, enter `winver` in a command prompt.**
## Prerequisites
* [Windows 10 Creators Update or later with Windows Subsystem for Linux](https://msdn.microsoft.com/en-us/commandline/wsl/install_guide) installed.
* Install g++/gcc and gdb within `WSL` to allow compiling and debugging. You can use the package manager to do this. For example, to install g++, you can run `sudo apt install g++` in the Bash window.
* [Visual Studio Code](https://code.visualstudio.com) + Microsoft C/C++ extension for VSCode.
## How-To
To debug, commands will be routed from Windows through `bash.exe` to set up debugging. Because our extension runs as a 32-bit process, it will need to use the `C:\Windows\SysNative` folder to access the `bash.exe` executable that is normally in `C:\Windows\System32`. We will be using the `"pipeTransport"` ability within the extension to do debugging and `"sourceFileMap"` to map the source from the subsystem's paths back to Windows path.
To debug, commands will be routed from Windows through `bash.exe` to set up debugging. Because our extension runs as a 32-bit process, it will need to use the `C:\Windows\SysNative` folder to access the `bash.exe` executable that is normally in `C:\Windows\System32`. We will be using the `"pipeTransport"` ability within the extension to do debugging and `"sourceFileMap"` to map the source from the subsystem's paths back to Windows path.
**NOTE: Applications will need to be compiled in the `Windows Subsystem for Linux (WSL)` prior to debugging.**
### Example `launch.json` for Launching
In the following example, I have a local drive, `Z:\` that has my source code within windows for an app called kitchensink. I have set up the `"program"` and `"cwd"` paths to point to the directory within `WSL`. I have set up the `"pipeTransport"` to use `bash.exe`. I have also set up a `"sourceFileMap"` to have everything that is returned by `gdb` that starts with `/mnt/z` to point to `Z:\\` in Windows.
In the following example, I have a local drive, `Z:\` that has my source code within windows for an app called _kitchensink_. I have set up the `"program"` and `"cwd"` paths to point to the directory within `WSL`. I have set up the `"pipeTransport"` to use `bash.exe`. I have also set up a `"sourceFileMap"` to have everything that is returned by `gdb` that starts with `/mnt/z` to point to `Z:\\` in Windows.
```
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "/mnt/z/Bash/kitchensink/a.out",
"args": ["-fThreading"],
"stopAtEntry": false,
"cwd": "/mnt/z/Bash/kitchensink",
"environment": [],
"externalConsole": true,
"windows": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/z": "z:\\"
```json
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "/mnt/z/Bash/kitchensink/a.out",
"args": ["-fThreading"],
"stopAtEntry": false,
"cwd": "/mnt/z/Bash/kitchensink",
"environment": [],
"externalConsole": true,
"windows": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
}
]
},
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/z": "z:\\"
}
}
```
### Example `launch.json` for Attaching to an Existing Process
This configuration similar to the launch process above. I have chosen to start the same application above from the Bash command line and now I want to attach to it for debugging. I have changed the `"processID"` to use the remote process picker by specifying the command `"${command:pickRemoteProcess}"` and set up the same `"sourceFileMap"`. When I press F5 to attach, I get a picker drop down showing the running processes within `WSL`. I can scroll or search for the process I want to attach to and start debugging.
This configuration similar to the launch process above. I have chosen to start the same application above from the Bash command line and now I want to attach to it for debugging. I have changed the `"processID"` to use the remote process picker by specifying the command `"${command:pickRemoteProcess}"` and set up the same `"sourceFileMap"`. When I press <kbd>F5</kbd> to attach, I get a picker drop down showing the running processes within `WSL`. I can scroll or search for the process I want to attach to and start debugging.
```
{
"name": "C++ Attach",
"type": "cppdbg",
"request": "attach",
"program": "/mnt/z/Bash/kitchensink/a.out",
"processId": "${command:pickRemoteProcess}",
"windows": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/z": "z:\\"
```json
{
"name": "C++ Attach",
"type": "cppdbg",
"request": "attach",
"program": "/mnt/z/Bash/kitchensink/a.out",
"processId": "${command:pickRemoteProcess}",
"windows": {
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
}
]
},
"pipeTransport": {
"pipeCwd": "",
"pipeProgram": "c:\\windows\\sysnative\\bash.exe",
"pipeArgs": ["-c"],
"debuggerPath": "/usr/bin/gdb"
},
"sourceFileMap": {
"/mnt/z": "z:\\"
}
}
```
+4 -4
View File
@@ -1,15 +1,15 @@
# Natvis - Custom views for native objects
Natvis framework is a framework that allows developers to write custom schemas to help visualize native objects.
The Natvis framework allows developers to write custom schemas to help visualize native objects.
For gdb/lldb debugging (`"type": "cppdbg"`), a subset of the Natvis framework has been ported to the C/C++ extension and the code resides in the [MIEngine](https://github.com/Microsoft/MIEngine) shared component. If additional features that are not implemented are requested, please file an [issue](https://github.com/Microsoft/MIEngine/issues) on the MIEngine GitHub page with details of what is missing.
For Visual C++ debugging (`"type": "cppvsdbg"`), the debugger contains the full implementation of the Natvis framework as Visual Studio.
For Visual C++ debugging (`"type": "cppvsdbg"`), the debugger contains the full implementation of the Natvis framework as Visual Studio.
## Documentation
Official documentation can be found [here](https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects).
The official documentation can be found [here](https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects).
## Schema
The natvis schema can be found [here](natvis.xsd).
The Natvis schema can be found [here](natvis.xsd).
+72 -21
View File
@@ -1,22 +1,39 @@
# FAQs
## Table of Contents
* Setup
* [Debugging Setup](#debugging-setup)
* Debugger
* [Why is debugging not working](#why-is-debugging-not-working)?
* Build
* [How to enable debug symbols](#how-to-enable-debug-symbols)
* Setup: [Debugging Setup](#debugging-setup)
* Setup: [What is the .vscode/ipch folder?](#what-is-the-vscodeipch-folder)
* Setup: [How do I disable the IntelliSense cache (ipch)?](#how-do-i-disable-the-intellisense-cache-ipch)
* Debugger: [Why is debugging not working?](#why-is-debugging-not-working)
* Build: [How to enable debug symbols](#how-to-enable-debug-symbols)
* Logging: [How to enable logging](#how-to-enable-logging)
## Debugging Setup
The debugger needs to be configured to know which executable and debugger to use:
Click menu item: `Debug` -> `Add Configuration...`
The `launch.json` will now be open for editing with a new configuration. The default settings will *probably* work except that you need to specify the **program** setting.
The file **launch.json** will now be open for editing with a new configuration. The default settings will *probably* work except that you need to specify the **program** setting.
See the [`Documentation/Debugger`](https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation/Debugger) folder in this repository for more in-depth documentation on how to configure the debugger.
See the [**Documentation/Debugger**](https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation/Debugger) folder in this repository for more in-depth documentation on how to configure the debugger.
## What is the .vscode/ipch folder?
The language server caches information about included header files to improve the performance of IntelliSense. When you edit C/C++ files in your workspace folder, the language server will store cache files in the `.vscode/ipch` folder by default. VS Code per-workspace storage folders were not selected for the following reasons:
* The workspace storage location provided by VS Code is somewhat obscure and we had reservations about writing GB's worth of files in this location where users may not see them or know where to find them.
* Parity with Visual Studio. This is how Visual Studio works and they receive little to no feedback/complaints on the location.
With this in mind we knew that we wouldn't be able to please everyone, so we provided settings to allow you to customize this the way that works best for your situation. We also figured that putting the files in the workspace folder would bring the issue to your attention quickly so that you can take action if you don't like the default behavior.
#### `"C_Cpp.intelliSenseCachePath": <string>`
This setting allows you to set workspace or global overrides for the cache path. For example, if you want to share a single cache location for all workspace folders, you just open the VS Code settings, and add a "User" setting for "IntelliSense Cache Path".
#### `"C_Cpp.intelliSenseCacheSize": <number>`
This setting allows you to set a limit on the amount of caching the extension does. This is an approximation, but the extension will make a best effort to keep the cache size as close to the limit you set as possible. If you are sharing the cache location across workspaces as explained above, you can still increase/decrease the limit, but you should make sure that you add a "User" setting for "IntelliSense Cache Size".
## How do I disable the IntelliSense cache (ipch)?
If you do not want to use the IntelliSense caching feature to improve the performance of IntelliSense, you can disable the feature by setting the "IntelliSense Cache Size" setting to 0. (or `"C_Cpp.intelliSenseCacheSize": 0"` in the JSON settings editor)
## Why is debugging not working?
@@ -26,26 +43,60 @@ When you start debugging, if it is showing that your breakpoints aren't bound (s
### Debugging starts but all the lines in my stack trace are grey
If your debugger is showing a grey stacktrace or won't stop at a breakpoint,or the symbols in the call stack are grey then your executable was compiled without [debug symbols](#how-to-enable-debug-symbols).
If your debugger is showing a grey stacktrace or won't stop at a breakpoint, or the symbols in the call stack are grey then your executable was compiled without [debug symbols](#how-to-enable-debug-symbols).
## How to enable debug symbols
## How to enable debug symbols?
Enabling debug symbols are dependent on the type of compiler you are using. Below are some of the compilers and the compiler options necessary to enable debug symbols.
When in doubt, please check your compiler's documentation for the options necessary to include debug symbols in the output. This may be some variant of `-g` or `--debug`.
#### Clang (C++)
If you invoke the compiler manually then add the `--debug` option.
* #### Clang (C++)
* If you invoke the compiler manually then add the `--debug` option.
* If you're using a script then make sure the `CXXFLAGS` environment variable is set; e.g. `export CXXFLAGS="${CXXFLAGS} --debug"`
* If you're using CMake then set make sure the `CMAKE_CXX_FLAGS` is set; e.g. `export CMAKE_CXX_FLAGS=${CXXFLAGS}`
If you're using a script then make sure the `CXXFLAGS` environment variable is set; e.g. `export CXXFLAGS="${CXXFLAGS} --debug"`
* #### Clang (C)
See Clang C++ but use `CFLAGS` instead of `CXXFLAGS`.
If you're using cmake then set make sure the `CMAKE_CXX_FLAGS` is set; e.g. `export CMAKE_CXX_FLAGS=${CXXFLAGS}`
* #### gcc or g++
If you invoke the compiler manually, add the `-g` option.
#### Clang (C)
See Clang C++ but use `CFLAGS` instead of `CXXFLAGS`.
* #### cl.exe
Symbols are located in the `*.pdb` file.
#### gcc or g++
If you invoke the compiler manually, add the `-g` option.
## How to enable logging
#### cl.exe
Symbols are located in the `*.pdb` file.
Enabling logging will show communication information between VS Code and our extension and between our extension and the debugger.
### Logging for `MI` debuggers
The logging block with its defaults is as follows:
```
"logging": {
"trace": false,
"traceResponse": false,
"engineLogging": false
}
```
#### VS Code and the CppTools extension
The logging here is called `trace` logging and can be enabled by setting `trace` and `traceResponse` to `true` in the logging block inside `launch.json`. This will help diagnose issues related to VS Code's communication to our extension and our responses.
#### CppTools extension and the debugger
The logging between CppTools and the debugger is called `engineLogging`. When using an `MI` debugger such as `gdb` or `lldb`, this will show the request, response and events using the `mi` interpreter. This logging will help us determine whether the debugger is receiving the right commands and generating the correct responses.
### Logging for `Visual C++` debugger
The logging block with its defaults is as follows:
```
"logging": {
"engineLogging": false
}
```
The `Visual C++` debugger logging will show only the communication to and from VS Code as all communication to the debugger is done internally to the process and is not visible through logging.
@@ -1,18 +1,3 @@
## How to build and debug the Microsoft CppTools Extension
These steps will allow you to debug the typescript code that is part of the Microsoft CppTools extension for Visual Studio Code.
Prerequisite steps:
* Clone [this](https://github.com/Microsoft/msvscode-cpptools) repository.
* Install [npm](https://nodejs.org).
* From a command line, run the following commands from the Extension folder in the root of the repository:
* `npm install -g vsce`
* This will install `vsce` globally to create the vsix package.
* `npm install` will install the dependencies needed to build the extension.
* Set an environment variable `CPPTOOLS_DEV=1`.
* This enables the local developer workflow, copying dependencies from the `node_modules` folder.
* Open the Extension folder in Visual Studio Code and F5.
* [How to contribute changes](LanguageServer/How%20to%20Contribute%20Changes.md).
# Configuring includePath for better IntelliSense results
@@ -22,9 +7,9 @@ This page describes how to configure include paths for folders containing C or C
## Where are the include paths defined?
The include paths are defined in the `"includePath"` setting in a file called **c_cpp_properties.json** located in the .vscode directory in the opened folder.
The include paths are defined in the `"includePath"` setting in a file called **c_cpp_properties.json** located in the **.vscode** directory in the opened folder.
You can create or open this file by either using the `"C/Cpp: Edit Configurations"` command in the command palette or by selecting `"Edit "includePath" setting"` in the lightbulb menu (see the screenshot below). The quickiest way to locate a lightbulb is to scroll to the top of the source file and click on any green squiggle that shows up under a #include statement.
You can create or open this file by either using the `"C/Cpp: Edit Configurations"` command in the command palette or by selecting `"Edit "includePath" setting"` in the lightbulb menu (see the screenshot below). The quickest way to locate a lightbulb is to scroll to the top of the source file and click on any green squiggle that shows up under a #include statement.
![lightbulb menu "Edit "includePath" setting"](https://github.com/Microsoft/vscode-cpptools/raw/master/Images/Lightbulb.png)
@@ -36,9 +21,9 @@ You can create or open this file by either using the `"C/Cpp: Edit Configuration
You can specify the remaining paths using one of the techniques described below.
#### 1. Use compile_commands.json file to supply includePaths and defines information
#### 1. Use `compile_commands.json` file to supply includePaths and defines information
The extension can get the information for `"includePath"` and `"defines"` from a compile_commands.json file, which can be auto-generated by many build systems such as CMake and Ninja. Look for the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac"), and set the `"compileCommands"` property in **c_cpp_properties.json** to the full path to your compile_commands.json file and the extension will use that instead of the `"includes"` and `"defines"` properties for IntelliSense.
The extension can get the information for `"includePath"` and `"defines"` from a **compile_commands.json** file, which can be auto-generated by many build systems such as CMake and Ninja. Look for the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac"), and set the `"compileCommands"` property in **c_cpp_properties.json** to the full path to your **compile_commands.json** file and the extension will use that instead of the `"includes"` and `"defines"` properties for IntelliSense.
![use compileCommands setting](https://github.com/Microsoft/vscode-cpptools/raw/master/Images/compile_commands.png)
@@ -68,5 +53,4 @@ This indicates that the IntelliSense engine has got the include paths resolved s
[IntelliSense engines](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/IntelliSense%20engine.md)
[c_cpp_properties.json reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
[**c_cpp_properties.json** reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
@@ -0,0 +1,16 @@
#### Old information (it still works, but is no longer recommended):
Logging is controlled by environment variables and is disabled by default. To enable logging, launch VS Code from an environment that contains the following variables:
```
VSCODE_CPP_LOGDIR=c:\path\to\logfolder
VSCODE_CPP_LOGFILE_LEVEL=5
```
When you open your folder in VS Code, we will create a **vscode.cpp.log.\<pid\>.txt** file for each extension process launched (\<pid\> = process id).
The log file level is a number that determines how much detail we'll log. Level 5 is generally detailed enough to give us information about what is going on in your session. We don't recommend you set this higher than 7 since the log quickly becomes cluttered with information that doesn't really help us diagnose your issues and actually makes it harder for us to spot problems. It may also slow down the extension considerably and make it harder for you to reproduce your problem.
**Note:** You will likely need to reload the window or close VS Code to flush the contents of the log file since we do not flush the log after every call. If your log file seems to be empty, try reloading the window after you have followed the steps to reproduce your issue.
**Don't forget to remove the environment variables when you are finished providing us with the logs.** You wouldn't want the extension to needlessly spend CPU time and disk space writing data you don't need into log files.
@@ -0,0 +1,76 @@
## Extension version 0.16.1 and earlier:
For developers using MinGW on Windows, we recommend you start with the following **c_cpp_properties.json** template. Select "C/Cpp: Edit Configurations" from the command palette to create this file if you haven't already.
In earlier versions of the extension, the `includePath` and a some system defines need to be set in order for IntelliSense to work properly. Note that you may have to change the MinGW version number to match what you have installed. Eg. `C:/MinGW/lib/gcc/mingw32/5.3.0/` instead of `C:/MinGW/lib/gcc/mingw32/6.3.0/`.
```json
{
"configurations": [
{
"name": "MinGW",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/mingw32",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/backward",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed"
],
"defines": [
"_DEBUG",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"browse": {
"path": [
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
"C:/MinGW/include/*",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
]
}
```
The `includePath` above includes the system header paths that gcc uses in version 6.3.0 for C++ projects and matches the output of `"gcc -v -E -x c++ nul"`. The `intelliSenseMode` should be set to **"clang-x64"** to get MinGW projects to work properly with IntelliSense. The `__GNUC__=#` define should match the major version of the toolchain in your installation (6 in this example).
For C projects, simply remove the C++ lines:
```json
{
"configurations": [
{
"name": "MinGW",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed"
],
"defines": [
"_DEBUG",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"browse": {
"path": [
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
"C:/MinGW/include/*",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
]
}
```
@@ -0,0 +1,139 @@
# Windows Subsystem for Linux
To use the Windows Subsystem for Linux with this extension you need to add a configuration to your **c_cpp_properties.json** file which adds the necessary header paths from within the WSL filesystem to the `includePath`.
Select "C/Cpp: Edit Configurations" from the command palette to create the **c_cpp_properties.json** file if you haven't already.
## Release
For developers using Ubuntu with the current version of WSL released with the Fall Creators Update, you can add the following configuration template to your **c_cpp_properties.json** file.
```json
{
"name": "WSL",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5/backward",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
```
The `includePath` above includes the system header paths that gcc uses for C++ projects and matches the output of `gcc -v -E -x c++ - < /dev/null`. The intelliSenseMode should be set to **"clang-x64"** to get WSL projects to work properly with IntelliSense.
Note that `${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/` is the path to the root of the Ubuntu filesystem. This will be different if you are using a different distro. You can discover the paths to your distro's filesystem by using this handy PowerShell command:
```Powershell
PS R:\> ($(get-appxpackage).PackageFamilyName | findstr /i 'SUSE Ubuntu') -replace '^', "$`{localappdata`}/Packages/"
${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
${localappdata}/Packages/46932SUSE.openSUSELeap42.2_022rs5jcyhyac
${localappdata}/Packages/46932SUSE.SUSELinuxEnterpriseServer12SP2_022rs5jcyhyac
```
For C projects, simply remove the C++ lines:
```json
{
"name": "WSL",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
```
### Beta
For developers using Bash on Ubuntu on Windows with the beta version of WSL from before the Fall Creators Update, you can add the following configuration template to your **c_cpp_properties.json** file.
```json
{
"name": "WSL (Beta)",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"${localappdata}/lxss/rootfs/usr/include/c++/5",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/lxss/rootfs/usr/include/c++/5/backward",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/lxss/rootfs/usr/local/include",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/lxss/rootfs/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/lxss/rootfs/usr/include/c++/5",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/lxss/rootfs/usr/local/include",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/lxss/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
```
The `includePath` above includes the system header paths that gcc uses for C++ projects and matches the output of `gcc -v -E -x c++ - < /dev/null`. The intelliSenseMode should be set to **"clang-x64"** to get WSL projects to work properly with IntelliSense.
Note that `${localappdata}/lxss/rootfs/` is the path to the root of the filesystem for Bash on Ubuntu on Windows.
For C projects, simply remove the C++ lines as in the previous example.
---
With these configurations, you should be all set up to use the new IntelliSense engine for linting, memberlist autocomplete, and quick info (tooltips). Add `"C_Cpp.intelliSenseEngine": "Default"` to your **settings.json** file to try out the new IntelliSense engine.
And remember to [heed the warnings of the Windows team about not creating or editing Linux files from a Windows app](https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/)!
@@ -0,0 +1,99 @@
# Customizing Default Settings
In version 0.17.0 we introduced new settings that allow you to override the extension's default values for properties set in **c_cpp_properties.json**.
## New VS Code settings
The following `C_Cpp.default.*` settings map to each of the properties in a configuration block of **c_cpp_properties.json**. Namely:
```
C_Cpp.default.includePath : string[]
C_Cpp.default.defines : string[]
C_Cpp.default.compileCommands : string
C_Cpp.default.macFrameworkPath : string[]
C_Cpp.default.forcedIncludes : string[]
C_Cpp.default.intelliSenseMode : string
C_Cpp.default.compilerPath : string
C_Cpp.default.cStandard : c89 | c99 | c11
C_Cpp.default.cppStandard : c++98 | c++03 | c++11 | c++14 | c++17
C_Cpp.default.browse.path : string[]
C_Cpp.default.browse.databaseFilename : string
C_Cpp.default.browse.limitSymbolsToIncludedHeaders : boolean
```
These settings have all of the benefits of VS Code settings, meaning that they can have default, "User", "Workspace", and "Folder" values. So you can set a global value for `C_Cpp.default.cppStandard` in your "User" settings and have it apply to all of the folders you open. If any one folder needs a different value, you can override the value by adding a "Folder" or "Workspace" value.
This property of VS Code settings allows you to configure each of your workspaces independently - making the **c_cpp_properties.json** file optional.
## Updated **c_cpp_properties.json** syntax
A special variable has been added to the accepted syntax of **c_cpp_properties.json** that will instruct the extension to insert the value from the VS Code settings mentioned above. If you set the value of any setting in **c_cpp_properties.json** to "${default}" it will instruct the extension to read the VS Code default setting for that property and insert it. For example:
```
"configurations": [
{
"name": "Win32",
"includePath": [
"additional/paths",
"${default}"
],
"defines": [
"${default}",
],
"macFrameworkPath": [
"${default}",
"additional/paths"
],
"forceInclude": [
"${default}",
"additional/paths"
],
"compileCommands": "${default}",
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "${default}",
"path": [
"${default}",
"additional/paths"
]
},
"intelliSenseMode": "${default}",
"cStandard": "${default}",
"cppStandard": "${default}",
"compilerPath": "${default}"
}
],
```
Take note that for the properties that accept string[], the syntax proposed above allows you to augment the VS Code setting with additional values, thus allowing you to have common paths listed in the VS Code settings and configuration-specific settings in **c_cpp_properties.json**.
If a property is missing from **c_cpp_properties.json**, the extension will use the value in the VS Code setting. If a developer assigns values to all of the settings that apply for a given folder, then **c_cpp_properties.json** could be removed from the .vscode folder as it will no longer be needed.
### System includes
A new setting will be added that allows you specify the system include path separate from the folder's include path. If this setting has a value, then the system include path the extension gets from the compiler specified in the `compilerPath` setting will not be added to the path array that the extension uses for IntelliSense. We may want to provide a VS Code command to populate this value from the compiler's default for users who are interested in using it in case they want to make some modifications to the defaults.
```
C_Cpp.default.systemIncludePath : string[]
```
### System Include Path/Defines Resolution Strategies
The extension determines the system includePath and defines to send to the IntelliSense engine in the following manner:
1. If `compileCommands` has a valid value and the file open in the editor is in the database, use the compile command in the database entry to determine the include path and defines.
* The system include path and defines are determined using the following logic (in order):
1. If `systemIncludePath` has a value, use it (continue to the next step to search for system defines).
2. If `compilerPath` is valid, query it.
3. Interpret the first argument in the command as the compiler and attempt to query it.
4. If `compilerPath` is `""`, use an empty array for system include path and defines.
5. If `compilerPath` is undefined, look for a compiler on the system and query it.
2. If `compileCommands` is invalid or the current file is not listed in the database, use the `includePath` and `defines` properties in the configuration for IntelliSense.
* The system include path and defines are determined using the following logic (in order):
1. If `systemIncludePath` has a value, use it (continue to the next step to search for system defines).
2. If `compilerPath` is valid, query it.
3. If `compilerPath` is `""`, use an empty array for system include path and defines (they are assumed to be in the `includePath` and `defines` for the current config already).
4. If `compilerPath` is undefined, look for a compiler on the system and query it.
System includes should no longer be added to the `"includePath"` or `"browse.path"` variables. If the extension detects any system include paths in the `"includePath"` property it will silently remove them so that it can ensure system include paths are added last and in the correct order (this is especially important for GCC/Clang). In a future update we may add a notification message to the extension to remind developers to remove system include paths from their `"includePath"` and `'browse.path"` as they will be ignored.
@@ -2,21 +2,11 @@
If you are experiencing a problem that we are unable to diagnose based on information in your issue report, we might ask you to enable logging and send us your logs.
As of version 0.14.0 of the extension, logging information is now delivered directly to the Output window in VSCode. To turn on full logging for an issue report, add `"C_Cpp.loggingLevel": "Information"` to your settings.json.
As of version 0.14.0 of the extension, logging information is now delivered directly to the Output window in VSCode. To turn on full logging for an issue report, add `"C_Cpp.loggingLevel": "Information"` or `"C_Cpp.loggingLevel": "Debug"` to your **settings.json**.
![image](https://user-images.githubusercontent.com/12818240/31898313-b32ff284-b7cd-11e7-97f5-89df93b5d9de.png)
![image](https://user-images.githubusercontent.com/12818240/44601186-8a2af380-a790-11e8-9094-7064d1ba3cfb.png)
#### Old information (it still works, but is no longer recommended):
VS Code organizes the logging from different extensions to improve readability so you must select the "C/C++" option in the log filter selector to see logging from the C/C++ extension:
~~Logging is controlled by environment variables and is disabled by default. To enable logging, launch VS Code from an environment that contains the following variables:~~
![image](https://user-images.githubusercontent.com/12818240/39769357-d6673bea-52a0-11e8-86c6-3be91618e8fc.png)
```
VSCODE_CPP_LOGDIR=c:\path\to\logfolder
VSCODE_CPP_LOGFILE_LEVEL=5
```
~~When you open your folder in VS Code, we will create a vscode.cpp.log.\<pid\>.txt file for each extension process launched (\<pid\> = process id).~~
~~The log file level is a number that determines how much detail we'll log. Level 5 is generally detailed enough to give us information about what is going on in your session. We don't recommend you set this higher than 7 since the log quickly becomes cluttered with information that doesn't really help us diagnose your issues and actually makes it harder for us to spot problems. It may also slow down the extension considerably and make it harder for you to reproduce your problem.~~
~~**Don't forget to remove the environment variables when you are finished providing us with the logs.** You wouldn't want the extension to needlessly spend CPU time and disk space writing data you don't need into log files.~~
+32 -24
View File
@@ -1,27 +1,24 @@
# Frequently asked questions
[How do I get IntelliSense to work correctly](#how-do-i-get-intellisense-to-work-correctly)?
[Why do I see red squiggles under Standard Library types](#why-do-i-see-red-squiggles-under-standard-library-types)?
[How do I get the new IntelliSense to work with MinGW on Windows](#how-do-i-get-the-new-intellisense-to-work-with-mingw-on-windows)?
[What is the difference between "includePath" and "browse.path" in c\_cpp\_properties.json](#what-is-the-difference-between-includepath-and-browsepath-in-c_cpp_propertiesjson)?
[How do I re-create the IntelliSense database](#how-do-i-re-create-the-intellisense-database)?
* [How do I get IntelliSense to work correctly?](#how-do-i-get-intellisense-to-work-correctly)
* [Why do I see red squiggles under Standard Library types?](#why-do-i-see-red-squiggles-under-standard-library-types)
* [How do I get the new IntelliSense to work with MinGW on Windows?](#how-do-i-get-the-new-intellisense-to-work-with-mingw-on-windows)
* [How do I get the new IntelliSense to work with the Windows Subsystem for Linux?](#how-do-i-get-the-new-intellisense-to-work-with-the-windows-subsystem-for-linux)
* [What is the difference between `"includePath"` and `"browse.path"` in **c_cpp_properties.json**?](#what-is-the-difference-between-includepath-and-browsepath-in-c_cpp_propertiesjson)
* [How do I re-create the IntelliSense database?](#how-do-i-re-create-the-intellisense-database)
## How do I get IntelliSense to work correctly?
There are two IntelliSense engines present in the extension: the "fuzzy" engine (or Tag Parser), and the new "Default" engine. If you are using version 0.11.0 or higher of the cpptools extension, then you can preview our new IntelliSense engine which has more accurate auto-complete suggestions and tooltips. To use the new engine, you need to ensure that `"C_Cpp.intelliSenseEngine"` is set to `"Default"` in your settings. Since the engine is still in preview it is not on by default for everyone yet.
After selecting the IntelliSense engine that you prefer, take a look at the Problems window in VS Code to see if you need to do any further configuration for your folder. For example, the Default engine will not provide squiggles and auto-complete suggestions for a translation unit (read: a source file and its dependencies) if the include path is not configured properly. You can select any of the problems in the window to navigate to the line when the problem was detected and a lightbulb will appear in the editor with some options (code actions) to help you resolve the problem.
After selecting the IntelliSense engine that you prefer, take a look at the Problems window in VS Code to see if you need to do any further configuration for your folder. For example, the Default engine will not provide squiggles and auto-complete suggestions for a translation unit (read: a source file and its dependencies) if the include path is not configured properly. You can select any of the problems in the window to navigate to the line when the problem was detected and a lightbulb will appear in the editor with some options (code actions) to help you resolve the problem:
1. Update your includePath (and preprocessor defines)
1. Update your `includePath` (and preprocessor defines)
2. Force semantic IntelliSense
#### Update your includePath (and preprocessor defines)
#### Update your `includePath` (and preprocessor defines)
Selecting this option will open a file called c_cpp_properties.json. If you haven't created this file already, it will be created for you in the .vscode folder of your workspace.
Selecting this option will open a file called **c_cpp_properties.json**. If you haven't created this file already, it will be created for you in the **.vscode** folder of your workspace.
Add the necessary paths to your include files to the `"includePath"` array. The `${workspaceRoot}` variable is available to use to get a relative path to the folder you have opened. Also add any required symbols that need to be defined to the `"defines"` array. Both "\<var\>" and "\<var\>=\<value\>" syntax is accepted. When you edit and save this file, the IntelliSense engine will reset and reparse source your source files and headers with the new settings.
@@ -31,27 +28,38 @@ If you want IntelliSense to operate on your files even when all #include directi
## Why do I see red squiggles under Standard Library types?
The most common reason for this is missing or sorted include paths. If you are using a compiler in the GCC family, the system includes that you add to your `"includePath"` in **c_cpp_properties.json** should match the output of the following command: `gcc -Wp,-v -E -xc -x c++ /dev/null` (replace 'gcc' with whichever compiler you are using). GCC and its relatives require the paths to be in a specific order too, so sorting the paths for aesthetics will likely result in incorrect IntelliSense results.
The most common reason for this is missing include paths and defines. The easiest way to fix this on each platform is as follows:
**Linux/Mac**
* Set `"intelliSenseMode": "clang-x64"` or `"intelliSenseMode": "gcc-x64"` and `"compilerPath"` in **c_cpp_properties.json** to the path to your compiler.
**Windows**
* If you are using a Microsoft compiler from Visual Studio, set `"intelliSenseMode": "msvc-x64"`, but don't add the `"compilerPath"` property to **c_cpp_properties.json**.
* If you are using Clang for Windows, set `"intelliSenseMode": "msvc-x64"`, and `"compilerPath"` in **c_cpp_properties.json** to the path to your compiler.
## How do I get the new IntelliSense to work with MinGW on Windows?
Since MinGW is a relative of GCC, Microsoft mode compilation (which is the default on Windows) doesn't work very well with it. To use GCC/CLang mode, set the `"intelliSenseMode"` property in your **c_cpp_properties.json** file to `"clang-x64"`. An example **c_cpp_properties.json** [is shared here for your convenience](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md).
The page discussing configuration with MinGW is [here](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md).
## What is the difference between "includePath" and "browse.path" in c\_cpp\_properties.json?
## How do I get the new IntelliSense to work with the Windows Subsystem for Linux?
Starting with version 0.11.0 of the cpptools extension, there are now two settings in the c\_cpp\_properties.json file. They are used by the different IntelliSense engines that we support and have slightly different meanings for the components that use them.
The page discussing configuration with WSL is [here](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/Windows%20Subsystem%20for%20Linux.md).
The active IntelliSense engine is controlled via the `"C_Cpp.intelliSenseEngine"` setting in your settings.json file. The valid values for this setting are:
* `"Default"`
* `"Tag Parser"`
## What is the difference between `"includePath"` and `"browse.path"` in **c_cpp_properties.json**?
**includePath**: This array of path strings is used by the new "Default" IntelliSense engine that was introduced in version 0.11.0 of the extension. This new engine provides semantic-aware IntelliSense features and will be the eventual replacement for the Tag Parser that has been powering the extension since it was first released. It currently provides tooltips and error squiggles in the editor. The remaining features (e.g. code completion, signature help, go to definition, ...) are implemented using the Tag Parser's database, so it is still important to ensure that the browse.path setting is properly set.
Starting with version 0.11.0 of the cpptools extension, there are now two settings in the **c_cpp_properties.json** file. They are used by the different IntelliSense engines that we support and have slightly different meanings for the components that use them.
The paths that you specify for this setting are the same paths that you would send to your compiler via the `-I` switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your `#include` directives while attempting to resolve them. These paths are _not searched recursively_.
The active IntelliSense engine is controlled via the `"C_Cpp.intelliSenseEngine"` setting in your **settings.json** file. The valid values for this setting are `"Default"` and `"Tag Parser"`.
**browse.path**: This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will _recursively_ enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a `/*` to the path string.
* #### `"includePath"`
This array of path strings is used by the new "Default" IntelliSense engine that was introduced in version 0.11.0 of the extension. This new engine provides semantic-aware IntelliSense features and will be the eventual replacement for the Tag Parser that has been powering the extension since it was first released. It currently provides tooltips and error squiggles in the editor. The remaining features (e.g. code completion, signature help, go to definition, ...) are implemented using the Tag Parser's database, so it is still important to ensure that the browse.path setting is properly set.
When you open a workspace for the first time, the extension adds `${workspaceRoot}` to both arrays. If this is undesirable, you can open your c_cpp_properties.json file and remove it.
The paths that you specify for this setting are the same paths that you would send to your compiler via the `-I` switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your #include directives while attempting to resolve them. These paths are **not** searched recursively.
* #### `"browse.path"`
This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will _recursively_ enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a `/*` to the path string.
When you open a workspace for the first time, the extension adds `${workspaceRoot}` to both arrays. If this is undesirable, you can open your **c_cpp_properties.json** file and remove it.
## How do I re-create the IntelliSense database?
@@ -1,6 +1,6 @@
# IntelliSense engines
There are two IntelliSense engines used to power the C/C++ IntelliSense experience in VS Code.
There are two IntelliSense engines used to power the C/C++ IntelliSense experience in VS Code.
* `"Default"` - Visual Studio's IntelliSense engine, which is the default engine that provides semantic-aware IntelliSense features
* `"Tag Parser"` - the "fuzzy" IntelliSense engine that provides quick but "fuzzy" results, is used to provide the fallback experience if the default engine is unable to fully resolve include paths
@@ -15,26 +15,30 @@ Ultimately all the IntelliSense and code browsing features will be powered by th
The other IntelliSense features, such as global auto-complete, and code browsing features, such as Go to definition/declaration, are currently powered by the "Tag Parser" based engine.
#### includePath and browse.path
The two IntelliSense engines use two differnt settings in the **c_cpp_properties.json** file for specifying include paths. This file is located in the .vscode directory in the opened folder. You can create or open this file by either using the "C/Cpp: Edit Configurations" command in the command palette or by selecting "Edit "includePath" setting" in the lightbulb menu. Look for the following settings in the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac").
### `includePath` and `browse.path`
The two IntelliSense engines use two different settings in the **c_cpp_properties.json** file for specifying include paths. This file is located in the **.vscode** directory in the opened folder. You can create or open this file by either using the "C/Cpp: Edit Configurations" command in the command palette or by selecting "Edit "includePath" setting" in the lightbulb menu. Look for the following settings in the section where your current configuration is defined (by default there's one configuration per OS, such as "Win32 or "Mac").
* `"includePath"`: This array of path strings is used by the "Default" IntelliSense engine. The paths that you specify for this setting are the same paths that you would send to your compiler via the -I switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your #include directives while attempting to resolve them. These paths are searched **non-recursively**.
* #### `"includePath"`
This array of path strings is used by the "Default" IntelliSense engine. The paths that you specify for this setting are the same paths that you would send to your compiler via the -I switch. When your source files are parsed, the IntelliSense engine will prepend these paths to the files specified by your #include directives while attempting to resolve them. These paths are searched **non-recursively**.
* `"browse.path"`: This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will **recursively** enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a /* to the path string.
* #### `"browse.path"`
This array of path strings is used by the "Tag Parser" (a.k.a. "browse engine"). This engine will **recursively** enumerate all files under the paths specified and track them as potential includes while tag parsing your project folder. To disable recursive enumeration of a path, you can append a `/*` to the path string.
#### How fallback works and how to control the behavior
### How fallback works and how to control the behavior
The extension first tries to fully parse any opened file using the "Default" IntelliSense engine. If it discovers that it cannot find a header file or a dependency, it will fall back to the tag parser and provide the fuzzy IntelliSense behavior. The fallback affects a full translation unit (TU), not just a single open file. The Problems panel provides details about unresolved headers and dependencies. Other opened TUs will continue to use the "Default" IntelliSense engine provided that all #include dependencies are resolved.
The extension first tries to fully parse any opened file using the "Default" IntelliSense engine. If it discovers that it cannot find a header file or a dependency, it will fall back to the tag parser and provide the fuzzy IntelliSense behavior. The fallback affects a full translation unit (TU), not just a single open file. The Problems panel provides details about unresolved headers and dependencies. Other opened TUs will continue to use the "Default" IntelliSense engine provided that all #include dependencies are resolved.
We recognize that resolving all #includes may not be necessary for all projects and you may still want to experience the productivity benefits of using the "Default" sematic engine without customizing the default include path. For that, the “Force semantic IntelliSense” action can be chosen. When invoked, all unresolved #include squiggles will turn red and semantic member list and linting will be enabled in all files regardless of whether or not #include statements can be resolved.
We recognize that resolving all #includes may not be necessary for all projects and you may still want to experience the productivity benefits of using the "Default" semantic engine without customizing the default include path. For that, the “Force semantic IntelliSense” action can be chosen. When invoked, all unresolved #include squiggles will turn red and semantic member list and linting will be enabled in all files regardless of whether or not #include statements can be resolved.
### IntelliSense engine setting
#### IntelliSense engine setting
We recommend using the "Default" engine for the best IntelliSense experience. However, it is possible to explicitly choose the IntelliSense engine by editing your [user or workspace settings](https://code.visualstudio.com/docs/getstarted/settings). The setting you should modify is `"C_Cpp.intelliSenseEngine"`. There are two values for this setting:
* `"Default"` - use Visual Studio's IntelliSense engine
* `"Default"` - use Visual Studio's IntelliSense engine
* `"Tag Parser"` - use the "fuzzy" IntelliSense engine
#### See Also
[Configuring includePath for better IntelliSense results](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started.md)
### See Also
[c_cpp_properties.json reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
[Configuring includePath for better IntelliSense results](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started%20with%20IntelliSense%20configuration.md)
[**c_cpp_properties.json** reference guide](https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/c_cpp_properties.json.md)
+22 -67
View File
@@ -1,76 +1,31 @@
For developers using MinGW on Windows, we recommend you start with the following **c_cpp_properties.json** template. Select "C/Cpp: Edit Configurations" from the command palette to create this file if you haven't already.
# MinGW
Note that you may have to change the MinGW version number to match what you have installed. Eg. `C:/MinGW/lib/gcc/mingw32/5.3.0/` instead of `C:/MinGW/lib/gcc/mingw32/6.3.0/`.
To use MinGW on Windows, we recommend you add the following configuration to your **c_cpp_properties.json** file. Select "C/Cpp: Edit Configurations" from the command palette to create this file if you haven't already.
```
## Extension version 0.17.0 and higher:
When you set the `compilerPath` property and change `intelliSenseMode` to `clang-x64` (or `gcc-x64` in version 0.18.0 and higher), you no longer need to copy the system include path or defines to `includePath`, `browse.path`, or `defines` to enable IntelliSense to work properly. For example:
```json
{
"configurations": [
{
"name": "Win32",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/mingw32",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include/c++/backward",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed"
],
"defines": [
"_DEBUG",
"UNICODE",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"browse": {
"path": [
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
"C:/MinGW/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
]
"name": "MinGW",
"intelliSenseMode": "gcc-x64",
"compilerPath": "C:/mingw64/bin/gcc.exe",
"includePath": [
"${workspaceFolder}"
],
"defines": [],
"cStandard": "c11",
"cppStandard": "c++17"
}
```
The `includePath` above includes the system header paths that gcc uses in version 6.3.0 for C++ projects and matches the output of `gcc -v -E -x c++ -`. The `intelliSenseMode` should be set to **"clang-x64"** to get MinGW projects to work properly with IntelliSense. The `__GNUC__=#` define should match the major version of the toolchain in your installation (6 in this example).
Replace "gcc.exe" with whatever compiler you're using, e.g. "g++.exe", "clang-5.0.exe", etc. -- just make sure the file is a valid Windows executable (not a 0 size symlink).
For C projects, simply remove the c++ lines:
For Cygwin, set the `compilerPath` to the appropriate Cygwin path, e.g. "C:/cygwin64/bin/g++.exe".
```
{
"configurations": [
{
"name": "Win32",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed"
],
"defines": [
"_DEBUG",
"UNICODE",
"__GNUC__=6",
"__cdecl=__attribute__((__cdecl__))"
],
"browse": {
"path": [
"C:/MinGW/lib/gcc/mingw32/6.3.0/include",
"C:/MinGW/lib/gcc/mingw32/6.3.0/include-fixed",
"C:/MinGW/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
]
}
```
If it seems like the `compilerPath` is not getting used, you can debug the issue via [enabling logging](Enabling%20logging.md).
With these configurations, you should be all set up to use the new IntelliSense engine for linting, memberlist autocomplete, and quick info (tooltips). Add `"C_Cpp.intelliSenseEngine": "Default"` to your **settings.json** file to try out the new IntelliSense engine.
## Extension version 0.16.1 and earlier:
If you have an older version of the C/C++ extension installed, use [these instructions](Archive/MinGW.md) instead.
@@ -1,139 +1,33 @@
# Windows Subsystem for Linux
> **Note:** If you are on **build 17110 of Windows or higher**, you must use extension version 0.17.0 or higher for IntelliSense to work. The Windows team turned on case-sensitive folders for the WSL environment and the C/C++ extension doesn't support case-sensitive folders until version 0.17.0.
To use the Windows Subsystem for Linux with this extension you need to add a configuration to your **c_cpp_properties.json** file which adds the necessary header paths from within the WSL filesystem to the `includePath`.
Select "C/Cpp: Edit Configurations" from the command palette to create the **c_cpp_properties.json** file if you haven't already.
## Release
## With extension version 0.17.0 and higher:
For developers using Ubuntu with the current version of WSL released with the Fall Creators Update, you can add the following configuration template to your **c_cpp_properties.json** file.
In **c_cpp_properties.json** you can directly address your WSL compiler and include paths by using *nix-style paths and we will do the conversion to Windows paths for you. If you have multiple distros installed, we disambiguate the `compilerPath` by picking the one marked as Default when you run `wslconfig.exe /l` in a CMD or PowerShell window. We continue to support Windows-style paths for these properties as outlined in the [archived instructions](Archive/Windows%20Subsystem%20for%20Linux.md) if you prefer to use those.
```json
{
"name": "WSL",
"intelliSenseMode": "clang-x64",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"includePath": [
"${workspaceRoot}",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5/backward",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include"
"${workspaceFolder}/**"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
"defines": [],
"cStandard": "c11",
"cppStandard": "c++17"
}
```
The `includePath` above includes the system header paths that gcc uses for C++ projects and matches the output of `gcc -v -E -x c++ - < /dev/null`. The intelliSenseMode should be set to **"clang-x64"** to get WSL projects to work properly with IntelliSense.
## Earlier versions of the extension:
Note that `${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/` is the path to the root of the Ubuntu filesystem. This will be different if you are using a different distro. You can discover the paths to your distro's filesystem by using this handy Powershell command:
```Powershell
PS R:\> ($(get-appxpackage).PackageFamilyName | findstr /i 'SUSE Ubuntu') -replace '^', "$`{localappdata`}/Packages/"
${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
${localappdata}/Packages/46932SUSE.openSUSELeap42.2_022rs5jcyhyac
${localappdata}/Packages/46932SUSE.SUSELinuxEnterpriseServer12SP2_022rs5jcyhyac
```
For C projects, simply remove the c++ lines:
```json
{
"name": "WSL",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/local/include",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/Packages/CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc/LocalState/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
```
## Beta
For developers using Bash on Ubuntu on Windows with the beta version of WSL from before the Fall Creators Update, you can add the following configuration template to your **c_cpp_properties.json** file.
```json
{
"name": "WSL (Beta)",
"intelliSenseMode": "clang-x64",
"includePath": [
"${workspaceRoot}",
"${localappdata}/lxss/rootfs/usr/include/c++/5",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/lxss/rootfs/usr/include/c++/5/backward",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/lxss/rootfs/usr/local/include",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/lxss/rootfs/usr/include"
],
"defines": [
"__linux__",
"__x86_64__"
],
"browse": {
"path": [
"${localappdata}/lxss/rootfs/usr/include/c++/5",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu/c++/5",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include",
"${localappdata}/lxss/rootfs/usr/local/include",
"${localappdata}/lxss/rootfs/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed",
"${localappdata}/lxss/rootfs/usr/include/x86_64-linux-gnu",
"${localappdata}/lxss/rootfs/usr/include/*"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
```
The `includePath` above includes the system header paths that gcc uses for C++ projects and matches the output of `gcc -v -E -x c++ - < /dev/null`. The intelliSenseMode should be set to **"clang-x64"** to get WSL projects to work properly with IntelliSense.
Note that `${localappdata}/lxss/rootfs/` is the path to the root of the filesystem for Bash on Ubuntu on Windows.
For C projects, simply remove the c++ lines as in the previous example.
If you are on a build of Windows prior to 17110 and you have an older version of the C/C++ extension installed, use [these instructions](Archive/Windows%20Subsystem%20for%20Linux.md) instead.
---
With these configurations, you should be all set up to use the new IntelliSense engine for linting, memberlist autocomplete, and quick info (tooltips). Add `"C_Cpp.intelliSenseEngine": "Default"` to your **settings.json** file to try out the new IntelliSense engine.
And remember to [heed the warnings of the Windows team about not creating or editing Linux files from a Windows app](https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/)!
Remember to [heed the warnings of the Windows team about not creating or editing Linux files from a Windows app](https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/)!
@@ -1,52 +1,100 @@
# c_cpp_properties.json Reference Guide
# `c_cpp_properties.json` Reference Guide
### Example:
```
> See also: [Customizing Default Settings](Customizing%20Default%20Settings.md)
### Example
```json
{
"env" : {
"myDefaultIncludePath": [
"${workspaceFolder}",
"${workspaceFolder}/include"
],
"myCompilerPath": "/usr/local/bin/gcc-7"
},
"configurations": [
{
"name": "Win32",
"intelliSenseMode": "msvc-x64",
"includePath": [ "${workspaceRoot}" ],
"name": "Mac",
"intelliSenseMode": "clang-x64",
"includePath": [ "${myDefaultIncludePath}", "/another/path" ],
"macFrameworkPath": [ "/System/Library/Frameworks" ],
"defines": [ "FOO", "BAR=100" ],
"forcedInclude": [ "${workspaceFolder}/include/config.h" ],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "/path/to/compile_commands.json",
"browse": {
"path": [ "${workspaceRoot}" ],
"path": [ "${workspaceFolder}" ],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 2
"version": 4
}
```
## Top-level properties
**configurations**: An array of configuration objects that provide the IntelliSense engine with information about your project and your preferences. By default, the extension creates 3 configurations for you, one each for Linux, Mac, and Windows, but it is not required to keep them all. You may also add additional configurations if necessary.
* #### `env`
An array of user-defined variables that will be available for substitution in the configurations via the standard environment variable syntax: `${<var>}` or `${env:<var>}`. Strings and arrays of strings are accepted.
**version**: We recommend you don't edit this field. It tracks the current version of the c_cpp_properties.json file so that the extension knows what properties and settings should be present and how to upgrade this file to the latest version.
* #### `configurations`
An array of configuration objects that provide the IntelliSense engine with information about your project and your preferences. By default, the extension creates a configuration for you based on your operating system. You may also add additional configurations.
* #### `version`
We recommend you don't edit this field. It tracks the current version of the **c_cpp_properties.json** file so that the extension knows what properties and settings should be present and how to upgrade this file to the latest version.
## Configuration properties
**name**: A friendly name for the configuration. "Linux", "Mac", and "Win32" are special names that instruct the extension to load that configuration by default on the associated operating system unless additional configurations have been created. The status bar in VS Code will show you which configuration is active. You can also click on the label in the status bar to change the active configuration.
* #### `name`
A friendly name for the configuration. "Linux", "Mac", and "Win32" are special names that instruct the extension to load that configuration by default on the associated operating system unless additional configurations have been created. The status bar in VS Code will show you which configuration is active. You can also click on the label in the status bar to change the active configuration.
**intelliSenseMode**: If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this property determines which mode the IntelliSense engine will run in. `"msvc-x64"` maps to Visual Studio mode with 64-bit pointer sizes. `"clang-x64"` maps to GCC/CLang mode with 64-bit pointer sizes. Windows uses `"msvc-x64"` by default and Linux/Mac use `"clang-x64"` by default.
* #### `intelliSenseMode`
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this property determines which mode the IntelliSense engine will run in. `"msvc-x64"` maps to Visual Studio mode with 64-bit pointer sizes. `"clang-x64"` maps to CLang mode with 64-bit pointer sizes. `"gcc-x64"` maps to GCC mode with 64-bit pointer sizes. Windows uses `"msvc-x64"` by default, macOS uses `"clang-x64"` by default, and Linux uses `"gcc-x64"` by default.
**includePath**: If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of paths will be used by IntelliSense to search for headers included by your source files. This is basically the same as the list of paths you pass to your compiler with the `-I` switch; the IntelliSense engine will not do a recursive search in these paths for includes.
* #### `includePath`
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of paths will be used by IntelliSense to search for headers included by your source files. This is basically the same as the list of paths you pass to your compiler with the `-I` switch. If a path ends with `/**` the IntelliSense engine will do a recursive search for includes starting from that directory. If on Windows with Visual Studio installed, or if a compiler is specified in the `compilerPath` setting, it is not necessary to list the system include paths in this list.
**defines**: If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of preprocessor symbols will be used by IntelliSense during the compilation of your source files. This is basically the same as the list of symbols you pass to your compiler with the `-D` switch.
* #### `macFrameworkPath`
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of paths will be used by IntelliSense to search for framework headers included by your source files. This is basically the same as the list of paths you pass to your compiler with the `-F` switch; the IntelliSense engine will not do a recursive search in these paths for includes.
**compileCommands** (optional): If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, the includes and defines discovered in this file will be used instead of the values set for `includePath` and `defines`. If the compile commands datasbase does not contain an entry for the translation unit that corresponds to the file you opened in the editor, then a warning message will appear and the extension will use the `includePath` and `defines` settings instead.
* #### `defines`
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, this list of preprocessor symbols will be used by IntelliSense during the compilation of your source files. This is basically the same as the list of symbols you pass to your compiler with the `-D` switch. If on Windows with Visual Studio installed, or if a compiler is specified in the `compilerPath` setting, it is not necessary to list the system include paths in this list.
*For more information about the file format, see the [Clang documentation](https://clang.llvm.org/docs/JSONCompilationDatabase.html). Some build systems, such as CMake, [simplify generating this file](https://cmake.org/cmake/help/v3.5/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html).*
* #### `forcedInclude` (optional)
A list of files that should be included before any other characters in the source file are processed. Files are included in the order listed.
**browse**: The set of properties used when `"C_Cpp.intelliSenseEngine"` is set to `"Tag Parser"` (also referred to as "fuzzy" IntelliSense, or the "browse" engine). These properties are also used by the Go To Definition/Declaration features, or when the "Default" IntelliSense engine is unable to resolve `#include`s in your source files.
* #### `compilerPath` (optional)
The absolute path to the compiler you use to build your project. The extension will query the compiler to determine the system include paths and default defines to use for IntelliSense.
Args can be added to modify the includes/defines used, e.g. `-nostdinc++`, `-m32`, `-fno-ms-extensions`, etc., but paths with spaces must be surrounded by double quotes (`"`) if args are used.
If you want to disable automatic querying of system include paths and defines, set this value to the emptry string `""`. This is generally not recommended, but there are some cases where automatic querying of system includes and defines is undesirable.
* #### `cStandard`
The C standard revision to use for IntelliSense in your project.
* #### `cppStandard`
The C++ standard revision to use for IntelliSense in your project.
* #### `compileCommands` (optional)
If `"C_Cpp.intelliSenseEngine"` is set to "Default" in your settings file, the includes and defines discovered in this file will be used instead of the values set for `includePath` and `defines`. If the compile commands database does not contain an entry for the translation unit that corresponds to the file you opened in the editor, then a warning message will appear and the extension will use the `includePath` and `defines` settings instead.
>For more information about the file format, see the [Clang documentation](https://clang.llvm.org/docs/JSONCompilationDatabase.html). Some build systems, such as CMake, [simplify generating this file](https://cmake.org/cmake/help/v3.5/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html).
* #### `browse`
The set of properties used when `"C_Cpp.intelliSenseEngine"` is set to `"Tag Parser"` (also referred to as "fuzzy" IntelliSense, or the "browse" engine). These properties are also used by the Go To Definition/Declaration features, or when the "Default" IntelliSense engine is unable to resolve the #includes in your source files.
### Browse properties
**path**: This list of paths will be used by the Tag Parser to search for headers included by your source files. The Tag Parser will automatically search all subfolders in these paths unless the path ends with a `/*` or `\*`. For example, `/usr/include` directs the Tag Parser to search the `include` folder and its subfolders for headers while `/usr/include/*` directs the Tag Parser not to look in any subfolders of `/usr/include`.
* #### `path`
This list of paths will be used by the Tag Parser to search for headers included by your source files. If omitted, `includePath` will be used as the `path`. The Tag Parser will automatically search all subfolders in these paths unless the path ends with a `/*` or `\*`. For example, `/usr/include` directs the Tag Parser to search the `include` folder and its subfolders for headers while `/usr/include/*` directs the Tag Parser not to look in any subfolders of `/usr/include`.
**limitSymbolsToIncludedHeaders**: When true, the Tag Parser will only parse code files that have been directly or indirectly included by a source file in the ${workspaceRoot}. When false, the Tag Parser will parse all code files found in the paths specified in the **path** list.
* #### `limitSymbolsToIncludedHeaders`
When true, the Tag Parser will only parse code files that have been directly or indirectly included by a source file in `${workspaceFolder}`. When false, the Tag Parser will parse all code files found in the paths specified in the **path** list.
**databaseFilename**: When set, this instructs the extension to save the Tag Parser's symbol database somewhere other than the workspace's default storage location. If a relative path is specified, it will be made relative to the workspace's default storage location, not the workspace folder itself. The ${workspaceRoot} variable can be used to specify a path relative to the workspace folder (e.g. $[workspaceRoot}/.vscode/browse.vc.db)
* #### `databaseFilename`
When set, this instructs the extension to save the Tag Parser's symbol database somewhere other than the workspace's default storage location. If a relative path is specified, it will be made relative to the workspace's default storage location, not the workspace folder itself. The `${workspaceFolder}` variable can be used to specify a path relative to the workspace folder (e.g. `${workspaceFolder}/.vscode/browse.vc.db`)
+2 -1
View File
@@ -3,6 +3,7 @@ node_modules
# ignore compliled typescript
out
dist
# ignore downloaded extension files and folders
server
@@ -17,4 +18,4 @@ install.lock
*.vsix
# ignore vscode test
.vscode-test/
.vscode-test/
+32 -22
View File
@@ -7,22 +7,31 @@
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"stopOnEntry": false,
"sourceMaps": true,
"outDir": "${workspaceRoot}/out/src",
"preLaunchTask": "npm"
"outFiles": [
"${workspaceFolder}/dist/**/*.js"
],
"preLaunchTask": "Compile Dev",
},
{
"name": "Launch Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
"args": [
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/unitTests"
],
"stopOnEntry": false,
"sourceMaps": true,
"outDir": "${workspaceRoot}/out/test",
"preLaunchTask": "npm"
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"preLaunchTask": "TypeScript Compile"
},
{
"name": "Node Attach",
@@ -31,20 +40,21 @@
"port": 5858
},
{
"name": "Launch Integration Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"${workspaceRoot}/test/integrationTests/testAssets/SimpleCppProject",
"--extensionDevelopmentPath=${workspaceRoot}",
"--extensionTestsPath=${workspaceRoot}/out/test/integrationTests"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceRoot}/out/test/**/*.js"
]
},
"name": "Launch Integration Tests",
"type": "extensionHost",
"request": "launch",
"runtimeExecutable": "${execPath}",
"args": [
"${workspaceFolder}/test/integrationTests/testAssets/SimpleCppProject",
"--extensionDevelopmentPath=${workspaceFolder}",
"--extensionTestsPath=${workspaceFolder}/out/test/integrationTests/languageServer"
],
"stopOnEntry": false,
"sourceMaps": true,
"outFiles": [
"${workspaceFolder}/out/test/**/*.js"
],
"preLaunchTask": "Pretest"
},
]
}
}
+86 -28
View File
@@ -1,30 +1,88 @@
// Available variables which can be used inside of strings.
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process
// A task runner that calls a custom npm script that compiles the extension.
{
"version": "0.1.0",
// we want to run npm
"command": "npm",
// the command is a shell script
"isShellCommand": true,
// show the output window only if unrecognized errors occur.
"showOutput": "silent",
// we run the custom script "compile" as defined in package.json
"args": ["run", "compile", "--loglevel", "silent"],
// The tsc compiler is started in watching mode
"isWatching": true,
// use the standard tsc in watch mode problem matcher to find compile problems in the output.
"problemMatcher": "$tsc-watch"
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "TypeScript Compile",
"group": {
"kind": "build",
"isDefault": true
},
"isBackground": true,
"type": "shell",
"presentation": {
"echo": true,
"reveal": "silent",
"focus": false,
"panel": "shared"
},
"command": "npm",
"args": [
"run",
"compile",
"--loglevel",
"silent"
],
"problemMatcher": "$tsc-watch"
},
{
"label": "TypeScript Lint",
"group": "build",
"isBackground": false,
"type": "shell",
"command": "npm",
"args": [
"run",
"tslint"
],
"problemMatcher": {
"fileLocation": "absolute",
"source": "tslint",
"pattern": [
{
"regexp": "(ERROR:) ([a-zA-Z/:\\-\\.]*)\\[(\\d+), (\\d+)\\]: (.*)",
"severity": 1,
"file": 2,
"line": 3,
"column": 4,
"message": 5
}
]
},
"dependsOn": [
"TypeScript Compile"
]
},
{
"label": "Compile Dev",
"group": "build",
"isBackground": false,
"type": "shell",
"command": "npm",
"args": [
"run",
"compileDev"
],
"dependsOn": [
"TypeScript Compile"
],
"problemMatcher": "$tsc-watch"
},
{
"label": "Pretest",
"group": "build",
"isBackground": false,
"type": "shell",
"command": "npm",
"args": [
"run",
"pretest"
],
"dependsOn": [
"TypeScript Compile"
],
"problemMatcher": "$tsc-watch"
}
]
}
+29 -8
View File
@@ -1,14 +1,35 @@
obj/**
# ignore vscode settings for extension development
.vscode/**
typings/**
out/test/**
# ignore binaries
obj/**
# ignore source files
tools/**
notices/**
test/**
src/**
**/*.map
.gitignore
# ignore .js files that are webpacked or only used for development
out/src/**
out/tools/**
# ignore ts files in ui
ui/*.ts
# ignore Azure-Pipelines files
jobs/**
# ignore development files
tsconfig.json
tslint.json
webpack.config.js
README.md
gulpfile.js
.gitattributes
.gitignore
CMakeLists.txt
debugAdapters/install.lock*
out/src/Debugger/copyScript.js
tools/**
notices/**
typings/**
**/*.map
+402 -19
View File
@@ -1,6 +1,389 @@
# C/C++ for Visual Studio Code Change Log
## Version 0.14.6: Janurary 17, 2017
## Version 0.23.0: May 6, 2019
### New Features
* Add a configuration UI editor to edit IntelliSense settings defined in the underlying `c_cpp_properties.json` file. [PR #3479](https://github.com/Microsoft/vscode-cpptools/pull/3479), [PR #3487](https://github.com/Microsoft/vscode-cpptools/pull/3487), [PR #3519](https://github.com/Microsoft/vscode-cpptools/pull/3519), [#3524](https://github.com/Microsoft/vscode-cpptools/issues/3524), [PR #3563](https://github.com/Microsoft/vscode-cpptools/pull/3563), [#3526](https://github.com/Microsoft/vscode-cpptools/issues/3526)
* Add a new command `C/C++: Edit configurations (UI)` to open the UI editor.
* Replace the `C/C++: Edit configurations...` command with `C/C++: Edit configurations (JSON)` to open `c_cpp_properties.json`.
* The default whether to open the UI editor or JSON file is based on the `workbench.settings.editor` setting.
* Add command `C/C++: Log Diagnostics` to log language service diagnostics. [PR #3489](https://github.com/Microsoft/vscode-cpptools/pull/3489)
* Add support for `.env` files for `cppvsdbg`. [#3490](https://github.com/Microsoft/vscode-cpptools/issues/3490)
### Other Changes
* Enable flag `/permissive-` as an argument to `compilerPath` with `cl.exe`. [#1589](https://github.com/Microsoft/vscode-cpptools/issues/1589), [#3446](https://github.com/Microsoft/vscode-cpptools/issues/3446)
* Configuration squiggles for `c_cpp_properties.json` now validates if the setting values of `compilerPath` and `intelliSenseMode` match on Windows. [#2983](https://github.com/Microsoft/vscode-cpptools/issues/2983)
* Enable `-fms-extensions` to be used as an argument to `compilerPath` on Linux/Mac. [#3063](https://github.com/Microsoft/vscode-cpptools/issues/3063)
* Change the default value of `C_Cpp.intelliSenseEngineFallback` setting to `Disabled`. [#3165](https://github.com/Microsoft/vscode-cpptools/issues/3165)
* Add squiggle when `compilerPath` uses spaces and arguments without `"`. [#3357](https://github.com/Microsoft/vscode-cpptools/issues/3357)
* Change the `Disabled` value for `C_Cpp.errorSquiggles` to stop showing missing header squiggles. [#3361](https://github.com/Microsoft/vscode-cpptools/issues/3361)
* Add `enableConfigurationSquiggles` setting to allow squiggles to be disabled for `c_cpp_properties.json`. [#3403](https://github.com/Microsoft/vscode-cpptools/issues/3403)
* Switch to using the `installExtension` command for offline/insider vsix installing (to reduce install failures). [#3408](https://github.com/Microsoft/vscode-cpptools/issues/3408)
* Add a better example to the description of `C_Cpp.clang_format_style` and `C_Cpp.clang_format_fallback_style`. [#3419](https://github.com/Microsoft/vscode-cpptools/issues/3419)
* Add a new (default) value of `EnabledIfIncludesResolve` to `C_Cpp.errorSquiggles`, which only shows error squiggles if include headers are successfully resolved. [PR #3421](https://github.com/Microsoft/vscode-cpptools/pull/3421)
* Disable debug heap by default with cppvsdbg. [#3484](https://github.com/Microsoft/vscode-cpptools/issues/3484)
* Reported by Djoulihen (@Djoulihen)
* Enable configuration squiggles for paths delimited by semicolons. [PR #3517](https://github.com/Microsoft/vscode-cpptools/pull/3517)
* Don't show release notes if the extension has never been installed before. [#3533](https://github.com/Microsoft/vscode-cpptools/issues/3533)
* Remove IntelliSense fallback code actions.
### Bug Fixes
* Fix browsing for functions with BOOST_FOREACH. [#953](https://github.com/Microsoft/vscode-cpptools/issues/953)
* Work around issue with VS Code not treating `.C` files as C++ files [Microsoft/vscode#59369](https://github.com/Microsoft/vscode/issues/59369) -- `.C` files become associated by name in `files.associations`. [#2558](https://github.com/Microsoft/vscode-cpptools/issues/2558)
* Fix various IntelliSense parsing bugs. [#2824](https://github.com/Microsoft/vscode-cpptools/issues/2824), [#3110](https://github.com/Microsoft/vscode-cpptools/issues/3110), [#3168](https://github.com/Microsoft/vscode-cpptools/issues/3168)
* Preserve newlines in documentation comments. [#2937](https://github.com/Microsoft/vscode-cpptools/issues/2937)
* Fix documentation comments above multi-line templates (and some other issues). [#3162](https://github.com/Microsoft/vscode-cpptools/issues/3162)
* Fix "Extension causes high cpu load" due to module loading. [#3213](https://github.com/Microsoft/vscode-cpptools/issues/3213)
* Fix auto-removal of compiler-provided paths in `includePath` when they end with a directory separator on Windows. [#3245](https://github.com/Microsoft/vscode-cpptools/issues/3245)
* Fix duplicate compiler build tasks appearing when `compilerPath` has arguments. [PR #3360](https://github.com/Microsoft/vscode-cpptools/pull/3360)
* Fix environment variables not resolving with `C_Cpp.intelliSenseCachePath`. [#3367](https://github.com/Microsoft/vscode-cpptools/issues/3367)
* Fix the formatting of snippets text. [#3376](https://github.com/Microsoft/vscode-cpptools/issues/3376)
* Fix the default `AccessModifierOffset` used when formatting. [#3376](https://github.com/Microsoft/vscode-cpptools/issues/3376)
* Fix null reference during initialization when using custom configuration providers. [PR #3377](https://github.com/Microsoft/vscode-cpptools/pull/3377)
* Fix symbol parsing when `__MINGW_ATTRIB_*` is used. [#3390](https://github.com/Microsoft/vscode-cpptools/issues/3390)
* Fix `compile_commands.json` configuration prompt being disabled per user instead of per folder. [PR #3399](https://github.com/Microsoft/vscode-cpptools/pull/3399)
* Fix `.cmd` and `.bat` files not working for `compilerPath` on Windows. [#3428](https://github.com/Microsoft/vscode-cpptools/issues/3428)
* Fix `compilerPath` with arguments that are surrounded by quotes. [#3428](https://github.com/Microsoft/vscode-cpptools/issues/3428)
* Fix documentation comments interpreting special characters as markdown. [#3441](https://github.com/Microsoft/vscode-cpptools/issues/3441)
* Fix hover using the configuration of the active document instead of the hovered document. [#3452](https://github.com/Microsoft/vscode-cpptools/issues/3452)
* Fix `c_cpp_properties.json` squiggles when the configuration name has regex characters. [PR #3478](https://github.com/Microsoft/vscode-cpptools/pull/3478)
* Use the `editor.tabSize` setting instead of `2` when creating build tasks. [PR #3486](https://github.com/Microsoft/vscode-cpptools/pull/3486)
* Fix some potential crashes on hover. [#3509](https://github.com/Microsoft/vscode-cpptools/issues/3509)
* Fix for `NullReferenceException` occurring when `"args"` is not specified in `launch.json`. [#3532](https://github.com/Microsoft/vscode-cpptools/issues/3532)
* Fix `Go to Definition` giving no results when IntelliSense doesn't find the symbol. [#3549](https://github.com/Microsoft/vscode-cpptools/issues/3549)
* Fix configuration squiggles with trailing backslashes. [PR #3573](https://github.com/Microsoft/vscode-cpptools/pull/3573)
* Fix `includePath` code actions, configuration prompts, and the `C/C++: Change configuration provider...` command. [PR #3576](https://github.com/Microsoft/vscode-cpptools/pull/3576)
* Fix randomly occurring crash (that could occur when opening files while IntelliSense squiggles are pending).
* Fix crash on hover (that could occur when document comments have blank lines).
* Fix code action sometimes not appearing over a squiggled identifier.
* Fix icon of parameters in completion results.
## Version 0.22.1: March 21, 2019
* Fix `tasks.json` with single-line comments being overwritten when `Build and Debug Active File` is used. [#3327](https://github.com/Microsoft/vscode-cpptools/issues/3327)
* Fix an invalid `compilerPath` property getting added to `tasks.json` after doing `Configure Task` with a C/C++ compiler.
* Add IntelliSense caching for macOS 10.13 or later (0.22.0 only supported Windows and Linux).
## Version 0.22.0: March 19, 2019
### Major Changes
* Add warning squiggles for invalid properties and paths in `c_cpp_properties.json`. [#2799](https://github.com/Microsoft/vscode-cpptools/issues/2799), [PR #3283](https://github.com/Microsoft/vscode-cpptools/pull/3283)
* Add C/C++ compiler build tasks for compiling the active source file, with support for `F5` debugging and the `Build and Debug Active File` context menu command. [PR #3118](https://github.com/Microsoft/vscode-cpptools/pull/3118), [PR #3244](https://github.com/Microsoft/vscode-cpptools/pull/3244)
* Add AutoPCH support to reduce IntelliSense parsing time, with `C_Cpp.intelliSenseCachePath` and `C_Cpp.intelliSenseCacheSize` settings. It isn't enabled for Mac yet. [PR #3184](https://github.com/Microsoft/vscode-cpptools/pull/3184)
### Minor Changes
* Fix IntelliSense not working on Windows when the username has a space in it and file `C:\Users\<firstname>` exists. [#1377](https://github.com/Microsoft/vscode-cpptools/issues/1377), [#2114](https://github.com/Microsoft/vscode-cpptools/issues/2114), [#2176](https://github.com/Microsoft/vscode-cpptools/issues/2176), [#3052](https://github.com/Microsoft/vscode-cpptools/issues/3052), [#3139](https://github.com/Microsoft/vscode-cpptools/issues/3139)
* Enable `${command:cpptools.activeConfigName}` in tasks. [#1524](https://github.com/Microsoft/vscode-cpptools/issues/1524)
* Fix bugs with squiggles and IntelliSense updating after edits. [#1779](https://github.com/Microsoft/vscode-cpptools/issues/1779), [#3124](https://github.com/Microsoft/vscode-cpptools/issues/3124), [#3260](https://github.com/Microsoft/vscode-cpptools/issues/3260)
* Fix formatting (and other non-IntelliSense operations) being blocked by IntelliSense processing. [#1928](https://github.com/Microsoft/vscode-cpptools/issues/1928)
* Fix completion when the start of an identifier matches a keyword. [#1986](https://github.com/Microsoft/vscode-cpptools/issues/1986)
* Fix auto-removal of compiler-provided paths in `includePath`. [#2177](https://github.com/Microsoft/vscode-cpptools/issues/2177)
* Fix crash on Windows when 8.3 filenames are used. [#2453](https://github.com/Microsoft/vscode-cpptools/issues/2453), [#3104](https://github.com/Microsoft/vscode-cpptools/issues/3104)
* Add support for `Scope::Member` scoped symbol searches. [#2484](https://github.com/Microsoft/vscode-cpptools/issues/2484)
* Fix signature help active parameter selection when parameter names are missing or subsets of each other. [#2952](https://github.com/Microsoft/vscode-cpptools/issues/2952)
* Fix `--enable-pretty-printing` with `gdb` when complex objects are used as keys in maps. [#3024](https://github.com/Microsoft/vscode-cpptools/issues/3024)
* Fix IntelliSense-based `Go to Definition` for `noexcept` methods. [#3060](https://github.com/Microsoft/vscode-cpptools/issues/3060)
* Render macro hover expansions as C/C++. [#3075](https://github.com/Microsoft/vscode-cpptools/issues/3075)
* Enable completion after `struct` when manually invoked. [#3080](https://github.com/Microsoft/vscode-cpptools/issues/3080)
* Add `C_Cpp.suggestSnippets` setting to disable language server snippets. [#3083](https://github.com/Microsoft/vscode-cpptools/issues/3083)
* Show a prompt for changing `C_Cpp.updateChannel` to `Insiders`. [#3089](https://github.com/Microsoft/vscode-cpptools/issues/3089)
* lh123 (@lh123) [PR #3221](https://github.com/Microsoft/vscode-cpptools/pull/3221)
* Fix `compilerPath` not getting priority over the `compile_commands.json` compiler. [#3102](https://github.com/Microsoft/vscode-cpptools/issues/3102)
* Fix Linux `compile_commands.json` compiler querying with relative paths. [#3112](https://github.com/Microsoft/vscode-cpptools/issues/3112)
* Allow `*` in `includePath` to apply to `browse.path` when `browse.path` is not specified. [#3121](https://github.com/Microsoft/vscode-cpptools/issues/3121)
* Tucker Kern (@mill1000) [PR #3122](https://github.com/Microsoft/vscode-cpptools/pull/3122)
* Disable `(` and `<` completion commit characters. [#3127](https://github.com/Microsoft/vscode-cpptools/issues/3127)
* Add Chinese translations for command titles. [PR #3128](https://github.com/Microsoft/vscode-cpptools/pull/3128)
* Fix remote process picker bug. [#2585](https://github.com/Microsoft/vscode-cpptools/issues/2585), [#3150](https://github.com/Microsoft/vscode-cpptools/issues/3150)
* Fix command not found and empty `c_cpp_properties.json` if activation is too slow. [#3160](https://github.com/Microsoft/vscode-cpptools/issues/3160), [#3176](https://github.com/Microsoft/vscode-cpptools/issues/3176)
* Fix `cppvsdbg` debugger showing `"An unspecified error has occurred."` for structured binding variables. [#3197](https://github.com/Microsoft/vscode-cpptools/issues/3197)
* Fix bugs with the Insider reload prompt appearing when it shouldn't. [#3206](https://github.com/Microsoft/vscode-cpptools/issues/3206)
* Fix variable expansion (e.g. `${env.HOME}`) not working when `${default}` is used in `c_cpp_properties.json`. [#3309](https://github.com/Microsoft/vscode-cpptools/issues/3309)
* Fix other unreported IntelliSense engine bugs.
## Version 0.21.0: January 23, 2019
### New Features
* Add documentation comments for hover, completion, and signature help. [#399](https://github.com/Microsoft/vscode-cpptools/issues/399)
* Add completion committing for methods after `(`. [#1184](https://github.com/Microsoft/vscode-cpptools/issues/1184)
* Add macro expansions to hover. [#1734](https://github.com/Microsoft/vscode-cpptools/issues/1734)
* Add support for `__int128_t` and `__uint128_t` types. [#1815](https://github.com/Microsoft/vscode-cpptools/issues/1815)
* Add Italian translations for command titles.
* Julien Russo (@Dotpys) [PR #2663](https://github.com/Microsoft/vscode-cpptools/pull/2663)
* Add icons for operators, structs/unions, enum values, template arguments, and macros. [#2849](https://github.com/Microsoft/vscode-cpptools/issues/2849)
* Change `#include` completion to show individual folders instead of the entire paths, fixing previous performance problems. [#2836](https://github.com/Microsoft/vscode-cpptools/issues/2836)
* Add text `(declaration)`, `(typedef)`, `(type alias)`, and `(union)` to symbols. [#2851](https://github.com/Microsoft/vscode-cpptools/issues/2851)
* Add a refresh button to the `Attach to Process` picker. [#2885](https://github.com/Microsoft/vscode-cpptools/issues/2885)
* Matt Bise (@mbise1993) [PR #2895](https://github.com/Microsoft/vscode-cpptools/pull/2895)
* Add completion committing for templates after `<`. [#2953](https://github.com/Microsoft/vscode-cpptools/issues/2953)
### Bug Fixes
* Add the Microsoft digital signature to Windows binaries to avoid getting incorrectly flagged by virus scanners. [#1103](https://github.com/Microsoft/vscode-cpptools/issues/1103), [#2970](https://github.com/Microsoft/vscode-cpptools/issues/2970)
* Fix bugs when UTF-8 characters > 1 byte are used. [#1504](https://github.com/Microsoft/vscode-cpptools/issues/1504), [#1525](https://github.com/Microsoft/vscode-cpptools/issues/1525), [#2034](https://github.com/Microsoft/vscode-cpptools/issues/2034), [#2082](https://github.com/Microsoft/vscode-cpptools/issues/2082), [#2883](https://github.com/Microsoft/vscode-cpptools/issues/2883)
* Fix some IntelliSense process crashes. [#1785](https://github.com/Microsoft/vscode-cpptools/issues/1785), [#2913](https://github.com/Microsoft/vscode-cpptools/issues/2913)
* Fix several incorrect IntelliSense error squiggles. [#1942](https://github.com/Microsoft/vscode-cpptools/issues/1942), [#2422](https://github.com/Microsoft/vscode-cpptools/issues/2422), [#2474](https://github.com/Microsoft/vscode-cpptools/issues/2474), [#2478](https://github.com/Microsoft/vscode-cpptools/issues/2478), [#2597](https://github.com/Microsoft/vscode-cpptools/issues/2597), [#2763](https://github.com/Microsoft/vscode-cpptools/issues/2763)
* Fix some main process crashes. [#2505](https://github.com/Microsoft/vscode-cpptools/issues/2505), [#2768](https://github.com/Microsoft/vscode-cpptools/issues/2768)
* Fix incorrect IntelliSense error with Mac clang 10.0 libraries. [#2608](https://github.com/Microsoft/vscode-cpptools/issues/2608)
* Fix completion not working in template specializations. [#2620](https://github.com/Microsoft/vscode-cpptools/issues/2620)
* Fix incorrect completions after Enter is used after struct, class, etc. [#2734](https://github.com/Microsoft/vscode-cpptools/issues/2734)
* Fix memory "leak" when parsing a large workspace. [#2737](https://github.com/Microsoft/vscode-cpptools/issues/2737)
* Fix IntelliSense-based `Go to Definition` with overloads that return a template with a default param (e.g. vector) [#2736](https://github.com/Microsoft/vscode-cpptools/issues/2736)
* Fix `Go to Definition` when `__catch()`, `_NO_EXCEPT_DEBUG`, or `_LIBCPP_BEGIN_NAMESPACE_STD` is used. [#2761](https://github.com/Microsoft/vscode-cpptools/issues/2761), [#2766](https://github.com/Microsoft/vscode-cpptools/issues/2766)
* Fix `Go to Definition` when `method(void)` is used. [#2802](https://github.com/Microsoft/vscode-cpptools/issues/2802)
* Fix error `"TypeError: Cannot read property 'map' of undefined at asCompletionResult"`. [#2807](https://github.com/Microsoft/vscode-cpptools/issues/2807)
* Fix quotes around defines not supported for custom configuration providers. [#2820](https://github.com/Microsoft/vscode-cpptools/issues/2820)
* Fix PowerShell bug on Win7. [#2822](https://github.com/Microsoft/vscode-cpptools/issues/2822)
* Fix Tag Parser completion details missing keywords (i.e. `using`, `class`, `#define`, etc.). [#2850](https://github.com/Microsoft/vscode-cpptools/issues/2850)
* Fix problem with empty recursive include paths. [#2855](https://github.com/Microsoft/vscode-cpptools/issues/2855)
* Fix `NullReferenceException` on debugger launch with VS Code Insiders. [#2858](https://github.com/Microsoft/vscode-cpptools/issues/2858), [PR Microsoft/MIEngine#810](https://github.com/Microsoft/MIEngine/pull/810)
* Fix IntelliSense errors with template argument deduction. [#2907](https://github.com/Microsoft/vscode-cpptools/issues/2907), [#2912](https://github.com/Microsoft/vscode-cpptools/issues/2912)
* Retry Insider VSIX downloading with `http.proxySupport` `"off"`. [#2927](https://github.com/Microsoft/vscode-cpptools/issues/2927)
* Fix snippet completions being offered when they shouldn't be. [#2942](https://github.com/Microsoft/vscode-cpptools/issues/2942)
* Set the `editor.wordBasedSuggestions` to `false` by default to prevent incorrect completions. [#2943](https://github.com/Microsoft/vscode-cpptools/issues/2943)
* Fix IntelliSense-based `Go to Definition` for functions with function pointer parameters. [#2981](https://github.com/Microsoft/vscode-cpptools/issues/2981)
* Fix `<` incorrectly triggering completions. [#2985](https://github.com/Microsoft/vscode-cpptools/issues/2985)
* Fix recursive includes not adding paths used by `forcedInclude` files. [#2986](https://github.com/Microsoft/vscode-cpptools/issues/2986)
* Fix crash when `//` is used in a recursive `includePath`. [#2987](https://github.com/Microsoft/vscode-cpptools/issues/2987)
* Fix compiler in `compile_commands.json` not taking precedence over the `Cpp.default.compilerPath`. [#2793](https://github.com/Microsoft/vscode-cpptools/issues/2793)
* Fix `#include` completion not working for symlinks. [#2843](https://github.com/Microsoft/vscode-cpptools/issues/2843)
* Fix IntelliSense-based `Go to Definition` for `const` methods. [#3014](https://github.com/Microsoft/vscode-cpptools/issues/3014)
* Support `C_Cpp.updateChannel` for VS Code Exploration builds.
## Version 0.20.1: October 31, 2018
* Fix IntelliSense-based `Go to Declaration` when there's only a definition in a TU. [#2743](https://github.com/Microsoft/vscode-cpptools/issues/2743)
* Fix `#include` completion for standalone header files. [#2744](https://github.com/Microsoft/vscode-cpptools/issues/2744)
* Fix the highest hitting main process crash.
* Fix IntelliSense process crash with completion.
## Version 0.20.0: October 30, 2018
* Add IntegratedTerminal support for Linux and Windows. [#35](https://github.com/microsoft/vscode-cpptools/issues/35)
* Unify Visual Studio Code debug protocol parsing by using a shared library with Visual Studio.
* Fix IntelliSense-based `Go to Definition` on overloads (in the same TU). [#1071](https://github.com/Microsoft/vscode-cpptools/issues/1071)
* Fix inactive regions not being disabled when falling back to the Tag Parser. [#2181](https://github.com/Microsoft/vscode-cpptools/issues/2181)
* Fix `#include` completion not working with `compile_commands.json` or custom configuration providers. [#2242](https://github.com/Microsoft/vscode-cpptools/issues/2242)
* Fix IntelliSense failing if recursive includes removes all paths. [#2442](https://github.com/Microsoft/vscode-cpptools/issues/2442)
* Fix incorrect IntelliSense errors with MinGW (stop using `-fms-extensions` by default). [#2443](https://github.com/Microsoft/vscode-cpptools/issues/2443), [#2623](https://github.com/Microsoft/vscode-cpptools/issues/2623)
* Fix error squiggles sometimes not updating after typing. [#2448](https://github.com/Microsoft/vscode-cpptools/issues/2448)
* Add support for Mac framework paths in `compile_commands.json`. [#2508](https://github.com/Microsoft/vscode-cpptools/issues/2508)
* Fix IntelliSense-based `Go to Definition` falling back to the Tag Parser for definitions not in the TU. [#2536](https://github.com/Microsoft/vscode-cpptools/issues/2536), [#2677](https://github.com/Microsoft/vscode-cpptools/issues/2677)
* Fix IntelliSense-based `Go to Definition` on the identifier of a definition with no declaration. [#2573](https://github.com/Microsoft/vscode-cpptools/issues/2573)
* Fix IntelliSense-based `Go to Definition` not falling back to the declaration (in certain cases). [#2574](https://github.com/Microsoft/vscode-cpptools/issues/2574)
* Fix IntelliSense-based `Go to Definition` going to the wrong location after edits are made. [#2579](https://github.com/Microsoft/vscode-cpptools/issues/2579)
* Fix `Go to Definition` when the `intelliSenseEngineFallback` is `Disabled` and `#include`s are missing. [#2583](https://github.com/Microsoft/vscode-cpptools/issues/2583)
* Fix empty `C_Cpp.default.*` settings not being used. [#2584](https://github.com/Microsoft/vscode-cpptools/issues/2584)
* Fix quoting around `ssh`'s command (for the debugger). [#2585](https://github.com/Microsoft/vscode-cpptools/issues/2585)
* Fix crash on hover (and `Go to Definition`) when using the `Tag Parser`. [#2586](https://github.com/Microsoft/vscode-cpptools/issues/2586)
* Fix errors when a workspace folder isn't open. [#2613](https://github.com/Microsoft/vscode-cpptools/issues/2613), [#2691](https://github.com/Microsoft/vscode-cpptools/issues/2691)
* Fix `-isystem` without a space after getting ignored in `compile_comamands.json`. [#2629](https://github.com/Microsoft/vscode-cpptools/issues/2629)
* Fix Insiders update channel installation bugs. [#2636](https://github.com/Microsoft/vscode-cpptools/issues/2636), [#2685](https://github.com/Microsoft/vscode-cpptools/issues/2685)
* Fix IntelliSense-based `Go to Declaration` falling back to the Tag Parser if the definition is also in the TU. [#2642](https://github.com/Microsoft/vscode-cpptools/issues/2642)
* Fix the `Disabled` `intelliSenseEngine` setting not working with custom configuration providers. [#2656](https://github.com/Microsoft/vscode-cpptools/issues/2656)
## Version 0.19.0: September 27, 2018
* Change the symbol database to update without needing to save. [#202](https://github.com/Microsoft/vscode-cpptools/issues/202)
* Enable IntelliSense-based `Go to Definition` for the current translation unit, including local variables and overloaded operators. [#255](https://github.com/Microsoft/vscode-cpptools/issues/255), [#979](https://github.com/Microsoft/vscode-cpptools/issues/979)
* Improved the `Go to Definition` performance with large workspaces and files with lots of `#include`s. [#273](https://github.com/Microsoft/vscode-cpptools/issues/273)
* Disable `Go to Definition` for invalid tokens, e.g. comments, strings, keywords, etc. [#559](https://github.com/Microsoft/vscode-cpptools/issues/559)
* Add `C_Cpp.updateChannel` setting for easier access to Insider builds of the extension. [#1526](https://github.com/Microsoft/vscode-cpptools/issues/1526)
* Add support for v2 of the configuration provider API. [#2237](https://github.com/Microsoft/vscode-cpptools/issues/2237)
* Fix bug with parsing definitions in `compile_commands.json`. [#2305](https://github.com/Microsoft/vscode-cpptools/issues/2305)
* Fix `sh` failure when attaching to a remote Linux process. [#2444](https://github.com/Microsoft/vscode-cpptools/issues/2444)
* Fix incorrect default `cl.exe` macro. [PR #2468](https://github.com/Microsoft/vscode-cpptools/issues/2468)
* Fix multiple bugs with the symbols in the Outline view not updating correctly. [#2477](https://github.com/Microsoft/vscode-cpptools/issues/2477), [#2500](https://github.com/Microsoft/vscode-cpptools/issues/2500), [#2504](https://github.com/Microsoft/vscode-cpptools/issues/2504)
* Add support for `workspaceFolderBasename` expansion. [#2491](https://github.com/Microsoft/vscode-cpptools/issues/2491)
* Gabriel Arjones (@g-arjones) [PR #2495](https://github.com/Microsoft/vscode-cpptools/pull/2495), [PR #2503](https://github.com/Microsoft/vscode-cpptools/pull/2503)
* Fix bug with variable resolution. [#2532](https://github.com/Microsoft/vscode-cpptools/issues/2532)
* Fix off-by-one bug with hover and `Go to Definition`. [#2535](https://github.com/Microsoft/vscode-cpptools/issues/2535)
* Fix [Microsoft/vscode#54213](https://github.com/Microsoft/vscode/issues/54213)
## Version 0.18.1: August 17, 2018
* Fix 0.18.0 regression causing non-MinGW compilers to use `-fms-extensions` on Windows. [#2424](https://github.com/Microsoft/vscode-cpptools/issues/2424), [#2425](https://github.com/Microsoft/vscode-cpptools/issues/2425)
## Version 0.18.0: August 17, 2018
### New Features
* Add the `C_Cpp.intelliSenseEngine` setting value of `Disabled` (for users who only use the debugger). [#785](https://github.com/Microsoft/vscode-cpptools/issues/785)
* Add `C_Cpp.workspaceSymbols` setting with default `Just My Code` to filter out system header symbols. [#1119](https://github.com/Microsoft/vscode-cpptools/issues/1119), [#2320](https://github.com/Microsoft/vscode-cpptools/issues/2320)
* Add `C_Cpp.inactiveRegionForegroundColor` and `C_Cpp.inactiveRegionBackgroundColor` settings. [#1620](https://github.com/Microsoft/vscode-cpptools/issues/1620), [#2212](https://github.com/Microsoft/vscode-cpptools/issues/2212)
* John Patterson (@john-patterson) [PR #2308](https://github.com/Microsoft/vscode-cpptools/pull/2308)
* Add `gcc-x64` `intelliSenseMode` and send the correct clang or gcc version to our parser, fixing various IntelliSense errors. [#2112](https://github.com/Microsoft/vscode-cpptools/issues/2112), [#2175](https://github.com/Microsoft/vscode-cpptools/issues/2175), [#2260](https://github.com/Microsoft/vscode-cpptools/issues/2260), [#2299](https://github.com/Microsoft/vscode-cpptools/issues/2299), [#2317](https://github.com/Microsoft/vscode-cpptools/issues/2317)
* Make `Go to Definition` on the definition go to the declaration instead. [#2298](https://github.com/Microsoft/vscode-cpptools/issues/2298)
* Add multi-pass environment variable resolution allowing variables defined in terms of other variables. [#2057](https://github.com/Microsoft/vscode-cpptools/issues/2057)
* John Patterson (@john-patterson) [PR #2322](https://github.com/Microsoft/vscode-cpptools/pull/2322)
* Allow users to use `~` for `${userProfile}` on Windows. [PR #2333](https://github.com/Microsoft/vscode-cpptools/pull/2333)
* Add support for compiler flags `-fms-extensions` and `-fno-ms-extensions` on Windows (the default for MinGW-based compilers). [#2363](https://github.com/Microsoft/vscode-cpptools/issues/2363)
* Make completion "show more results" (i.e. inaccessible members) when invoked a 2nd time. [#2386](https://github.com/Microsoft/vscode-cpptools/issues/2386)
### Bug Fixes
* Fix attach to process for systems without `bash` by using `sh` instead. [#569](https://github.com/Microsoft/vscode-cpptools/issues/569)
* Andy Neff (@andyneff) [PR #2340](https://github.com/Microsoft/vscode-cpptools/pull/2340)
* Fix IntelliSense crash after hover or completion with `_Complex` types. [#689](https://github.com/Microsoft/vscode-cpptools/issues/689), [#1112](https://github.com/Microsoft/vscode-cpptools/issues/1112)
* Fix `files.exclude` not working to exclude non-workspace folders from symbol parsing. [#1066](https://github.com/Microsoft/vscode-cpptools/issues/1066)
* Fix `Switch Header/Source` to give results that match the parent folder name before using just the file name. [#1085](https://github.com/Microsoft/vscode-cpptools/issues/1085)
* Fix incorrect IntelliSense errors caused by namespace lookup failure when instantiation template arguments in clang mode. [#1395](https://github.com/Microsoft/vscode-cpptools/issues/1395), [#1559](https://github.com/Microsoft/vscode-cpptools/issues/1559), [#1753](https://github.com/Microsoft/vscode-cpptools/issues/1753), [#2272](https://github.com/Microsoft/vscode-cpptools/issues/2272)
* Fix missing parameter help when using { for constructors. [#1667](https://github.com/Microsoft/vscode-cpptools/issues/1667)
* Fix Mac framework dependencies not being discovered. [#1913](https://github.com/Microsoft/vscode-cpptools/issues/1913)
* Fix `compilerPath` not working with `${workspaceFolder}`. [#1982](https://github.com/Microsoft/vscode-cpptools/issues/1982)
* Fix red flame getting stuck after modifying `c_cpp_properties.json`. [#2077](https://github.com/Microsoft/vscode-cpptools/issues/2077)
* Don't add empty `windowsSDKVersion` if none exists. [#2300](https://github.com/Microsoft/vscode-cpptools/issues/2300)
* Fix IntelliSense crash when the gcc-8 type_traits header is used. [#2323](https://github.com/Microsoft/vscode-cpptools/issues/2323), [#2328](https://github.com/Microsoft/vscode-cpptools/issues/2328)
* Limit configuration popups to one at a time. [#2324](https://github.com/Microsoft/vscode-cpptools/issues/2324)
* Don't show `includePath` code actions if compile commands or custom configuration providers are used. [#2334](https://github.com/Microsoft/vscode-cpptools/issues/2334)
* Fix `C_Cpp.clang_format_path` not accepting environment variables. [#2344](https://github.com/Microsoft/vscode-cpptools/issues/2344)
* Fix IntelliSense not working with non-ASCII characters in the WSL install path. [#2351](https://github.com/Microsoft/vscode-cpptools/issues/2351)
* Filter out buggy IntelliSense error `"= delete" can only appear on the first declaration of a function`. [#2352](https://github.com/Microsoft/vscode-cpptools/issues/2352)
* Fix IntelliSense failing with WSL if gcc is installed bug g++ isn't. [#2360](https://github.com/Microsoft/vscode-cpptools/issues/2360)
* Fix WSL paths starting with `/mnt/` failing to get symbols parsed. [#2361](https://github.com/Microsoft/vscode-cpptools/issues/2361)
* Fix IntelliSense process crash when hovering over a designated initializer list with an anonymous struct. [#2370](https://github.com/Microsoft/vscode-cpptools/issues/2370)
* Stop showing "File: " in completion details for internal compiler defines. [#2387](https://github.com/Microsoft/vscode-cpptools/issues/2387)
* Invoke `Edit Configurations...` when the `Configuration Help` button is clicked. [#2408](https://github.com/Microsoft/vscode-cpptools/issues/2408)
* Fix provider configuration prompt not showing for newly added workspace folders. [#2415](https://github.com/Microsoft/vscode-cpptools/issues/2415)
* Fix to allow SIGINT to be sent using the kill -2 command when using pipeTransport.
## Version 0.17.7: July 22, 2018
* Fix `Go to Definition` for code scoped with an aliased namespace. [#387](https://github.com/Microsoft/vscode-cpptools/issues/387)
* Fix incorrect IntelliSense errors with template template-arguments. [#1014](https://github.com/Microsoft/vscode-cpptools/issues/1014)
* Fix crash when using designated initializer lists. [#1440](https://github.com/Microsoft/vscode-cpptools/issues/1440)
* Add `windowsSdkVersion` to `c_cpp_properties.json`. [#1585](https://github.com/Microsoft/vscode-cpptools/issues/1585)
* Add `${vcpkgRoot}` variable. [#1817](https://github.com/Microsoft/vscode-cpptools/issues/1817)
* Fix dangling IntelliSense processes. [#2075](https://github.com/Microsoft/vscode-cpptools/issues/2075), [#2169](https://github.com/Microsoft/vscode-cpptools/issues/2169)
* Fix incorrect IntelliSense errors when class template argument deduction is used. [#2101](https://github.com/Microsoft/vscode-cpptools/issues/2101)
* Skip automatic parsing of source files in Mac system framework paths. [#2156](https://github.com/Microsoft/vscode-cpptools/issues/2156)
* Fix `Edit Configurations...` not working after `c_cpp_properties.json` is deleted. [#2214](https://github.com/Microsoft/vscode-cpptools/issues/2214)
* Fix indexing of the entire root drive on Windows when no is folder open. [#2216](https://github.com/Microsoft/vscode-cpptools/issues/2216)
* Disable the config provider message for headers outside the workspace and when debugging. [#2221](https://github.com/Microsoft/vscode-cpptools/issues/2221)
* Add `Change Configuration Provider...` command. [#2224](https://github.com/Microsoft/vscode-cpptools/issues/2224)
* Fix out-of-memory crash with `#include` code actions when no folder is open. [#2225](https://github.com/Microsoft/vscode-cpptools/issues/2225)
* Fix `intelliSenseMode` with custom config providers on Windows. [#2228](https://github.com/Microsoft/vscode-cpptools/issues/2228)
* Fix formatting not working on Windows if the VC++ 2015 redist isn't installed. [#2232](https://github.com/Microsoft/vscode-cpptools/issues/2232)
* Fix variables not resolving in `macFrameworkPath`. [#2234](https://github.com/Microsoft/vscode-cpptools/issues/2234)
* Fix `Go to Definition` not working for macros followed by `.` or `->`. [#2245](https://github.com/Microsoft/vscode-cpptools/issues/2245)
* Fix `#include` autocomplete with Mac framework headers. [#2251](https://github.com/Microsoft/vscode-cpptools/issues/2251)
* Fix debugging to support empty arguments for debuggee. [#2258](https://github.com/Microsoft/vscode-cpptools/issues/2258)
* Fix `Go to Definition` bug (missing symbols outside the workspace). [#2281](https://github.com/Microsoft/vscode-cpptools/issues/2281)
* Fix incorrect hover in enum definitions. [#2286](https://github.com/Microsoft/vscode-cpptools/issues/2286)
* Add a setting to silence configuration provider warnings. [#2292](https://github.com/Microsoft/vscode-cpptools/issues/2292)
* Fix debugging async Visual C++ causing debugger to hang.
* Fix `main` snippet.
## Version 0.17.6: July 2, 2018
* Fix the database icon getting stuck with recursive includes. [#2104](https://github.com/Microsoft/vscode-cpptools/issues/2104)
* Fix the red flame appearing late with recursive includes. [#2105](https://github.com/Microsoft/vscode-cpptools/issues/2105)
* Fix source files being parsed in system directories. [#2156](https://github.com/Microsoft/vscode-cpptools/issues/2156)
* Fix internal document corruption (visible after formatting) when edits are made too soon after activation. [#2162](https://github.com/Microsoft/vscode-cpptools/issues/2162)
* Fix a crash when saving with recursive includes. [#2173](https://github.com/Microsoft/vscode-cpptools/issues/2173)
* Fix a crash when the `includePath` or `browse.path` is `"**"`. [#2174](https://github.com/Microsoft/vscode-cpptools/issues/2174)
* Fix IntelliSense for WSL without g++ installed. [#2178](https://github.com/Microsoft/vscode-cpptools/issues/2178)
* Fix random IntelliSense (completion) failures due to edits being delayed. [#2184](https://github.com/Microsoft/vscode-cpptools/issues/2184)
* Fix database deletion failure with non-ASCII file paths on Windows. [#2205](https://github.com/Microsoft/vscode-cpptools/issues/2205)
* Fix `Go to Definition` results with `var::` and `var->`, and filter out invalid constructor results. [#2207](https://github.com/Microsoft/vscode-cpptools/issues/2207)
* Fix a performance bug with recursive includes.
* Fixed a CPU usage problem on Mac related to system frameworks parsing.
* Keep the IntelliSense process around for 10 seconds after a file is closed in case it's needed again.
* Added an API so build system extensions can provide IntelliSense configurations for source files. More details at [npmjs.com](https://www.npmjs.com/package/vscode-cpptools).
* Fix automatic argument quoting when debugging with gdb/lldb to include when the argument has a '(' or ')' in it. Also escape existing '"' symbols.
* Removed `-` in `ps` call for ProcessPicker and RemoteProcessPicker. [#2183](https://github.com/Microsoft/vscode-cpptools/issues/2183)
## Version 0.17.5: June 21, 2018
* Detect `compile_commands.json` and show prompt to use it. [#1297](https://github.com/Microsoft/vscode-cpptools/issues/1297)
* Change inactive regions from gray to translucent. [#1907](https://github.com/Microsoft/vscode-cpptools/issues/1907)
* Improve performance of recursive includes paths. [#2068](https://github.com/Microsoft/vscode-cpptools/issues/2068)
* Fix IntelliSense client failure due to `No args provider`. [#1908](https://github.com/Microsoft/vscode-cpptools/issues/1908)
* Fix `#include` completion with headers in the same directory. [#2031](https://github.com/Microsoft/vscode-cpptools/issues/2031)
* Fix non-header files outside the workspace folder not being parsed (i.e. so `Go to Definition` works). [#2053](https://github.com/Microsoft/vscode-cpptools/issues/2053)
* Fix some crashes. [#2080](https://github.com/Microsoft/vscode-cpptools/issues/2080)
* Support asm clobber registers on Windows. [#2090](https://github.com/Microsoft/vscode-cpptools/issues/2090)
* Fix usage of `${config:section.setting}`. [#2165](https://github.com/Microsoft/vscode-cpptools/issues/2165)
* `browse.path` now inherits `includePath` if not set in `c_cpp_properties.json`.
* On Windows, `compilerPath` now populates with the guessed `cl.exe` path, and the `MSVC` include path is based on the `cl.exe` path.
* Fix files under a non-recursive `browse.path` being removed from the database.
* Fix `*` not working in `browse.path` with WSL.
* Fix -break-insert main returning multiple bind points. [PR Microsoft/MIEngine#729](https://github.com/Microsoft/MIEngine/pull/729)
* Use -- instead of -x for gnome-terminal. [PR Microsoft/MIEngine#733](https://github.com/Microsoft/MIEngine/pull/733)
* Added `miDebuggerArgs` in order to pass arguments to the program in `miDebuggerPath`. [PR Microsoft/MIEngine#720](https://github.com/Microsoft/MIEngine/pull/720)
## Version 0.17.4: May 31, 2018
* Fix infinite loop (caused by deadlock) when using recursive includes. [#2043](https://github.com/Microsoft/vscode-cpptools/issues/2043)
* Stop using recursive includes in the default configuration.
* @Hyzeta [PR #2059](https://github.com/Microsoft/vscode-cpptools/pull/2059)
* Fix various other potential deadlocks and crashes.
* Fix `Go to Definition` on `#include` not filtering out results based on the path. [#1253](https://github.com/Microsoft/vscode-cpptools/issues/1253), [#2033](https://github.com/Microsoft/vscode-cpptools/issues/2033)
* Fix database icon getting stuck. [#1917](https://github.com/Microsoft/vscode-cpptools/issues/1917)
## Version 0.17.3: May 22, 2018
* Add support for `${workspaceFolder:folderName}`. [#1774](https://github.com/Microsoft/vscode-cpptools/issues/1774)
* Fix infinite loop during initialization on Windows. [#1960](https://github.com/Microsoft/vscode-cpptools/issues/1960)
* Fix main process IntelliSense-related crashes. [#2006](https://github.com/Microsoft/vscode-cpptools/issues/2006)
* Fix deadlock after formatting large files. [#2007](https://github.com/Microsoft/vscode-cpptools/issues/2007)
* Fix recursive includes failing to find some system includes. [#2019](https://github.com/Microsoft/vscode-cpptools/issues/2019)
## Version 0.17.1: May 17, 2018
* Fix IntelliSense update slowness when using recursive includes. [#1949](https://github.com/Microsoft/vscode-cpptools/issues/1949)
* Fix code navigation failure after switching between WSL and non-WSL configs. [#1958](https://github.com/Microsoft/vscode-cpptools/issues/1958)
* Fix extension crash when the `includePath` is a file or the root drive. [#1979](https://github.com/Microsoft/vscode-cpptools/issues/1979), [#1965](https://github.com/Microsoft/vscode-cpptools/issues/1965)
* Fix IntelliSense crash in `have_member_access_from_class_scope`. [#1763](https://github.com/Microsoft/vscode-cpptools/issues/1763)
* Fix `#include` completion bugs. [#1959](https://github.com/Microsoft/vscode-cpptools/issues/1959), [#1970](https://github.com/Microsoft/vscode-cpptools/issues/1970)
* Add `Debug` value for `loggingLevel` (previously the hidden value `"6"`).
* Fix C++17 features not being fully enabled with msvc-x64 mode. [#1990](https://github.com/Microsoft/vscode-cpptools/issues/1990)
* Fix IntelliSense interprocess deadlocks. [#1407](https://github.com/Microsoft/vscode-cpptools/issues/1407), [#1777](https://github.com/Microsoft/vscode-cpptools/issues/1777)
## Version 0.17.0: May 7, 2018
* Auto-complete for headers after typing `#include`. [#802](https://github.com/Microsoft/vscode-cpptools/issues/802)
* Add support for recursive `includePath`, e.g. `${workspaceFolder}/**`. [#897](https://github.com/Microsoft/vscode-cpptools/issues/897)
* Configuration improvements. [#1338](https://github.com/Microsoft/vscode-cpptools/issues/1338)
* Potentially addresses: [#368](https://github.com/Microsoft/vscode-cpptools/issues/368), [#410](https://github.com/Microsoft/vscode-cpptools/issues/410), [#1229](https://github.com/Microsoft/vscode-cpptools/issues/1229), [#1270](https://github.com/Microsoft/vscode-cpptools/issues/1270), [#1404](https://github.com/Microsoft/vscode-cpptools/issues/1404)
* Add support for querying system includes/defines from WSL and Cygwin compilers. [#1845](https://github.com/Microsoft/vscode-cpptools/issues/1845), [#1736](https://github.com/Microsoft/vscode-cpptools/issues/1736)
* Fix IntelliSense for WSL projects in Windows builds 17110 and greater. [#1694](https://github.com/Microsoft/vscode-cpptools/issues/1694)
* Add snippets. [PR #1823](https://github.com/Microsoft/vscode-cpptools/pull/1823)
* Add support for vcpkg. [PR #1886](https://github.com/Microsoft/vscode-cpptools/pull/1886)
* Add support for custom variables in `c_cpp_properties.json` via `env`. [#1857](https://github.com/Microsoft/vscode-cpptools/issues/1857), [#368](https://github.com/Microsoft/vscode-cpptools/issues/368)
* Stop automatically adding `/usr/include` to the `includePath`. [#1819](https://github.com/Microsoft/vscode-cpptools/issues/1819)
* Fix wrong configuration being used if there are four or more. [#1599](https://github.com/Microsoft/vscode-cpptools/issues/1599)
* Fix `c_cpp_properties.json` requiring write access. [#1790](https://github.com/Microsoft/vscode-cpptools/issues/1790)
* Change file not found in `compile_commands.json` message from an error to a warning. [#1783](https://github.com/Microsoft/vscode-cpptools/issues/1783)
* Fix an IntelliSense crash during completion requests. [#1782](https://github.com/Microsoft/vscode-cpptools/issues/1782)
* Update the installed clang-format to 6.0.
* Fix bug with `compile_commands.json` when "arguments" have both a switch and a value in the arg. [#1890](https://github.com/Microsoft/vscode-cpptools/issues/1890)
* Fix bug with garbage data appearing in tooltips on Linux/Mac. [#1577](https://github.com/Microsoft/vscode-cpptools/issues/1577)
## Version 0.16.1: March 30, 2018
* Fix random deadlock caused by logging code on Linux/Mac. [#1759](https://github.com/Microsoft/vscode-cpptools/issues/1759)
* Fix compiler from `compileCommands` not being queried for includes/defines if `compilerPath` isn't set on Windows. [#1754](https://github.com/Microsoft/vscode-cpptools/issues/1754)
* Fix OSX `UseShellExecute` I/O bug. [#1756](https://github.com/Microsoft/vscode-cpptools/issues/1756)
* Invalidate partially unzipped files from package manager. [#1757](https://github.com/Microsoft/vscode-cpptools/issues/1757)
## Version 0.16.0: March 28, 2018
* Enable autocomplete for local and global scopes. [#13](https://github.com/Microsoft/vscode-cpptools/issues/13)
* Add a setting to define multiline comment patterns: `C_Cpp.commentContinuationPatterns`. [#1100](https://github.com/Microsoft/vscode-cpptools/issues/1100), [#1539](https://github.com/Microsoft/vscode-cpptools/issues/1539)
* Add a setting to disable inactive region highlighting: `C_Cpp.dimInactiveRegions`. [#1592](https://github.com/Microsoft/vscode-cpptools/issues/1592)
* Add `forcedInclude` configuration setting. [#852](https://github.com/Microsoft/vscode-cpptools/issues/852)
* Add `compilerPath`, `cStandard`, and `cppStandard` configuration settings, and query gcc/clang-based compilers for default defines. [#1293](https://github.com/Microsoft/vscode-cpptools/issues/1293), [#1251](https://github.com/Microsoft/vscode-cpptools/issues/1251), [#1448](https://github.com/Microsoft/vscode-cpptools/issues/1448), [#1465](https://github.com/Microsoft/vscode-cpptools/issues/1465), [#1484](https://github.com/Microsoft/vscode-cpptools/issues/1484)
* Fix text being temporarily gray when an inactive region is deleted. [Microsoft/vscode#44872](https://github.com/Microsoft/vscode/issues/44872)
* Add support for `${workspaceFolder}` variable in **c_cpp_properties.json**. [#1392](https://github.com/Microsoft/vscode-cpptools/issues/1392)
* Fix IntelliSense not updating in source files after dependent header files are changed. [#1501](https://github.com/Microsoft/vscode-cpptools/issues/1501)
* Change database icon to use the `statusBar.foreground` color. [#1638](https://github.com/Microsoft/vscode-cpptools/issues/1638)
* Enable C++/CLI IntelliSense mode via adding the `/clr` arg to the `compilerPath`. [#1596](https://github.com/Microsoft/vscode-cpptools/issues/1596)
* Fix delay in language service activation caused by **cpptools.json** downloading. [#1640](https://github.com/Microsoft/vscode-cpptools/issues/1640)
* Fix debugger failure when a single quote is in the path. [#1554](https://github.com/Microsoft/vscode-cpptools/issues/1554)
* Fix terminal stdout and stderr redirection to not send to VS Code. [#1348](https://github.com/Microsoft/vscode-cpptools/issues/1348)
* Fix blank config and endless "Initializing..." if the file watcher limit is hit when using `compileCommands`. [PR #1709](https://github.com/Microsoft/vscode-cpptools/pull/1709)
* Fix error squiggles re-appearing after editing then closing a file. [#1712](https://github.com/Microsoft/vscode-cpptools/issues/1712)
* Show error output from clang-format. [#1259](https://github.com/Microsoft/vscode-cpptools/issues/1259)
* Fix `add_expression_to_index` crash (most frequent crash in 0.15.0). [#1396](https://github.com/Microsoft/vscode-cpptools/issues/1396)
* Fix incorrect error squiggle `explicitly instantiated more than once`. [#871](https://github.com/Microsoft/vscode-cpptools/issues/871)
## Version 0.15.0: February 15, 2018
* Add colorization for inactive regions. [#1466](https://github.com/Microsoft/vscode-cpptools/issues/1466)
* Fix 3 highest hitting crashes. [#1137](https://github.com/Microsoft/vscode-cpptools/issues/1137), [#1337](https://github.com/Microsoft/vscode-cpptools/issues/1337), [#1497](https://github.com/Microsoft/vscode-cpptools/issues/1497)
* Update IntelliSense compiler (bug fixes and more C++17 support). [#1067](https://github.com/Microsoft/vscode-cpptools/issues/1067), [#1313](https://github.com/Microsoft/vscode-cpptools/issues/1313)
* Fix duplicate `cannot open source file` errors. [#1469](https://github.com/Microsoft/vscode-cpptools/issues/1469)
* Fix `Go to Symbol in File...` being slow for large workspaces. [#1472](https://github.com/Microsoft/vscode-cpptools/issues/1472)
* Fix stuck processes during shutdown. [#1474](https://github.com/Microsoft/vscode-cpptools/issues/1474)
* Fix error popup appearing with non-workspace files when using `compile_commands.json`. [#1475](https://github.com/Microsoft/vscode-cpptools/issues/1475)
* Fix snippet completions being blocked after `#`. [#1531](https://github.com/Microsoft/vscode-cpptools/issues/1531)
* Add more macros to `cpp.hint` (fixing missing symbols).
* Add `__CHAR_BIT__=8` to default defines on Mac. [#1510](https://github.com/Microsoft/vscode-cpptools/issues/1510)
* Added support for config variables to `c_cpp_properties.json`. [#314](https://github.com/Microsoft/vscode-cpptools/issues/314)
* Joshua Cannon (@thejcannon) [PR #1529](https://github.com/Microsoft/vscode-cpptools/pull/1529)
* Define `_UNICODE` by default on Windows platforms. [#1538](https://github.com/Microsoft/vscode-cpptools/issues/1538)
* Charles Milette (@sylveon) [PR #1540](https://github.com/Microsoft/vscode-cpptools/pull/1540)
## Version 0.14.6: January 17, 2018
* Fix tag parser failing (and continuing to fail after edits) when it shouldn't. [#1367](https://github.com/Microsoft/vscode-cpptools/issues/1367)
* Fix tag parser taking too long due to redundant processing. [#1288](https://github.com/Microsoft/vscode-cpptools/issues/1288)
* Fix debugging silently failing the 1st time if a C/C++ file isn't opened. [#1366](https://github.com/Microsoft/vscode-cpptools/issues/1366)
@@ -17,9 +400,9 @@
* Add `C_Cpp.exclusionPolicy` default to `checkFolders` to avoid expensive `files.exclude` checking on every file.
## Version 0.14.5: December 18, 2017
* Fix for stackwalk `NullReferenceException`. [#1339](https://github.com/Microsoft/vscode-cpptools/issues/1339)
* Fix for `-isystem` (or `-I`) not being used in `compile_commands.json` if there's a space after it. [#1343](https://github.com/Microsoft/vscode-cpptools/issues/1343)
* Fix for header switching from `.cc` to `.hpp` files (and other cases). [#1341](https://github.com/Microsoft/vscode-cpptools/issues/1341)
* Fix stackwalk `NullReferenceException`. [#1339](https://github.com/Microsoft/vscode-cpptools/issues/1339)
* Fix `-isystem` (or `-I`) not being used in `compile_commands.json` if there's a space after it. [#1343](https://github.com/Microsoft/vscode-cpptools/issues/1343)
* Fix header switching from `.cc` to `.hpp` files (and other cases). [#1341](https://github.com/Microsoft/vscode-cpptools/issues/1341)
* Fix reload prompts not appearing in debugging scenarios (after the initial installation). [#1344](https://github.com/Microsoft/vscode-cpptools/issues/1344)
* Add a "wait" message when commands are invoked during download/installation. [#1344](https://github.com/Microsoft/vscode-cpptools/issues/1344)
* Prevent blank "C/C++ Configuration" from appearing when debugging is started but the language service is not. [#1353](https://github.com/Microsoft/vscode-cpptools/issues/1353)
@@ -38,9 +421,9 @@
* Improve performance for fetching call stacks with large arguments. [#363](https://github.com/Microsoft/vscode-cpptools/issues/363)
## Version 0.14.3: November 27, 2017
* Fix for disappearing parameter hints tooltip. [#1165](https://github.com/Microsoft/vscode-cpptools/issues/1165)
* Fix for parameter hints only showing up after the opening parenthesis. [#902](https://github.com/Microsoft/vscode-cpptools/issues/902), [#819](https://github.com/Microsoft/vscode-cpptools/issues/819)
* Fix for customer reported crashes in the TypeScript extension code. [#1240](https://github.com/Microsoft/vscode-cpptools/issues/1240), [#1245](https://github.com/Microsoft/vscode-cpptools/issues/1245)
* Fix disappearing parameter hints tooltip. [#1165](https://github.com/Microsoft/vscode-cpptools/issues/1165)
* Fix parameter hints only showing up after the opening parenthesis. [#902](https://github.com/Microsoft/vscode-cpptools/issues/902), [#819](https://github.com/Microsoft/vscode-cpptools/issues/819)
* Fix customer reported crashes in the TypeScript extension code. [#1240](https://github.com/Microsoft/vscode-cpptools/issues/1240), [#1245](https://github.com/Microsoft/vscode-cpptools/issues/1245)
* Fix .browse.VC-#.db files being unnecessarily created when an shm file exists. [#1234](https://github.com/Microsoft/vscode-cpptools/issues/1234)
* Fix language service to only activate after a C/C++ file is opened or a C/Cpp command is used (not onDebug).
* Fix database resetting if shutdown got blocked by an IntelliSense operation. [#1260](https://github.com/Microsoft/vscode-cpptools/issues/1260)
@@ -52,7 +435,7 @@
## Version 0.14.1: November 9, 2017
* Add support for multi-root workspaces. [#1070](https://github.com/Microsoft/vscode-cpptools/issues/1070)
* Fix files temporarly being unsavable after Save As and other scenarios on Windows. [Microsoft/vscode#27329](https://github.com/Microsoft/vscode/issues/27329)
* Fix files temporarily being unsavable after Save As and other scenarios on Windows. [Microsoft/vscode#27329](https://github.com/Microsoft/vscode/issues/27329)
* Fix files "permanently" being unsavable if the IntelliSense process launches during tag parsing of the file. [#1040](https://github.com/Microsoft/vscode-cpptools/issues/1040)
* Show pause and resume parsing commands after clicking the database icon. [#1141](https://github.com/Microsoft/vscode-cpptools/issues/1141)
* Don't show the install output unless an error occurs. [#1160](https://github.com/Microsoft/vscode-cpptools/issues/1160)
@@ -75,7 +458,7 @@
* Fix `limitSymbolsToIncludedHeaders` not working with single files. [#1109](https://github.com/Microsoft/vscode-cpptools/issues/1109)
* Add logging to Output window. Errors will be logged by default. Verbosity is controlled by the `"C_Cpp.loggingLevel"` setting.
* Add new database status bar icon for "Indexing" or "Parsing" with progress numbers, and the previous flame icon is now just for "Updating IntelliSense".
* Stop showing `(Global Scope)` if there's actually an error in identifiying the correct scope.
* Stop showing `(Global Scope)` if there's actually an error in identifying the correct scope.
* Fix crash with the IntelliSense process when parsing certain template code (the most frequently hit crash).
* Fix main thread being blocked while searching for files to remove after changing `files.exclude`.
* Fix incorrect code action include path suggestion when a folder comes after "..".
@@ -94,10 +477,10 @@
## Version 0.13.0: September 25, 2017
* Reference highlighting is now provided by the extension for both IntelliSense engines.
* Parameter help is now provided by both IntelliSense engines.
* Light bulbs (code actions) for #include errors now suggest potential paths to add to the `includePath` based on a recursive search of the `browse.path`. [#846](https://github.com/Microsoft/vscode-cpptools/issues/846)
* Light bulbs (code actions) for `#include` errors now suggest potential paths to add to the `includePath` based on a recursive search of the `browse.path`. [#846](https://github.com/Microsoft/vscode-cpptools/issues/846)
* Browse database now removes old symbols when `browse.path` changes. [#262](https://github.com/Microsoft/vscode-cpptools/issues/262)
* Add `*` on new lines after a multiline comment with `/**` is started. [#579](https://github.com/Microsoft/vscode-cpptools/issues/579)
* Fix Go to Definition, completion, and parameter hints for partially scoped members. [#635](https://github.com/Microsoft/vscode-cpptools/issues/635)
* Fix `Go to Definition`, completion, and parameter hints for partially scoped members. [#635](https://github.com/Microsoft/vscode-cpptools/issues/635)
* Fix bug in `macFrameworkPath` not resolving variables.
## Version 0.12.4: September 12, 2017
@@ -108,7 +491,7 @@
* Support `${env:VAR}` syntax for environment variables in `c_cpp_properties.json`. [#1000](https://github.com/Microsoft/vscode-cpptools/issues/1000)
* Support semicolon delimiters for include paths in `c_cpp_properties.json` to better support environment variables. [#1001](https://github.com/Microsoft/vscode-cpptools/issues/1001)
* Add `__LITTLE_ENDIAN__=1` to default defines so that "endian.h" is not needed on Mac projects. [#1005](https://github.com/Microsoft/vscode-cpptools/issues/1005)
* Fix for source code files on Windows with incorrect casing. [#984](https://github.com/Microsoft/vscode-cpptools/issues/984)
* Fix source code files on Windows with incorrect casing. [#984](https://github.com/Microsoft/vscode-cpptools/issues/984)
## Version 0.12.3: August 17, 2017
* Fix regression for paths containing multibyte characters. [#958](https://github.com/Microsoft/vscode-cpptools/issues/958)
@@ -144,7 +527,7 @@
* Update Microsoft Visual C++ debugger to Visual Studio 2017 released components.
* Fix issue with showing wrong thread. [#550](https://github.com/Microsoft/vscode-cpptools/issues/550)
* Fix issue with binaries compiled with /FASTLINK causing debugger to hang. [#484](https://github.com/Microsoft/vscode-cpptools/issues/484)
* Fix issue in MinGW/Cygwin debugging where stop debugging causes VS Code to hang. [Microsoft/MIEngine#636](https://github.com/Microsoft/MIEngine/pull/636)
* Fix issue in MinGW/Cygwin debugging where stop debugging causes VS Code to hang. [PR Microsoft/MIEngine#636](https://github.com/Microsoft/MIEngine/pull/636)
## Version 0.12.0: June 26, 2017
* The default IntelliSense engine now provides semantic-aware autocomplete suggestions for `.`, `->`, and `::` operators. [#13](https://github.com/Microsoft/vscode-cpptools/issues/13)
@@ -161,8 +544,8 @@
* Fix `Go to Definition` not working until all `browse.path` files are re-scanned. [#788](https://github.com/Microsoft/vscode-cpptools/issues/788)
## Version 0.11.4: June 2, 2017
* Fix for `System.Xml.Serialization.XmlSerializationReader threw an exception` when debugging on Linux. [#792](https://github.com/Microsoft/vscode-cpptools/issues/792)
* Fix for escaping for `${workspaceRoot}` in `launch.json`.
* Fix `System.Xml.Serialization.XmlSerializationReader threw an exception` when debugging on Linux. [#792](https://github.com/Microsoft/vscode-cpptools/issues/792)
* Fix escaping for `${workspaceRoot}` in `launch.json`.
## Version 0.11.3: May 31, 2017
* Fix `x86_64-pc-linux-gnu` and `x86_64-linux-gnu` paths missing from the default `includePath`.
@@ -210,7 +593,7 @@
## Version 0.10.5: March 21, 2017
* Fix a crash that randomly occurred when the size of a document increased. [#430](https://github.com/Microsoft/vscode-cpptools/issues/430)
* Fix for browsing not working for Linux/Mac stdlib.h functions. [#578](https://github.com/Microsoft/vscode-cpptools/issues/578)
* Fix browsing not working for Linux/Mac stdlib.h functions. [#578](https://github.com/Microsoft/vscode-cpptools/issues/578)
* Additional fixes for switch header/source not respecting `files.exclude`. [#485](https://github.com/Microsoft/vscode-cpptools/issues/485)
* Made `editor.quickSuggestions` dependent on `C_Cpp.autocomplete`. [#572](https://github.com/Microsoft/vscode-cpptools/issues/572)
* We recommend you close and reopen your settings.json file anytime you change the `C_Cpp.autocomplete` setting. [More info here](https://github.com/Microsoft/vscode-cpptools/releases).
@@ -266,7 +649,7 @@
* Debugging for Visual C++ applications on Windows (Program Database files) is now available.
* `clang-format` is now automatically installed as a part of the extension and formats code as you type.
* `clang-format` options have been moved from c_cpp_properties.json file to settings.json (File->Preferences->User settings).
* `clang-format` fall-back style is now set to 'Visual Studio'.
* `clang-format` fallback style is now set to 'Visual Studio'.
* Attach now requires a request type of `attach` instead of `launch`.
* Support for additional console logging using the keyword `logging` inside `launch.json`.
* Bug fixes.
@@ -290,7 +673,7 @@
* Switch between header and source.
* Control which files are processed under include path.
## Version 0.6.1: June 03, 2016
## Version 0.6.1: June 3, 2016
* Bug fixes.
## Version 0.6.0: May 24, 2016
@@ -300,7 +683,7 @@
* Support for debugging with GDB on Cygwin.
* Debugging on 32-bit Linux now enabled.
* Format code using clang-format.
* Experimental fuzzy autocompletion.
* Experimental fuzzy auto-completion.
* Bug fixes.
## Version 0.5.0: April 14, 2016
+174 -49
View File
@@ -1,78 +1,203 @@
# License
MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS
MICROSOFT C/C++ EXTENSION FOR VISUAL STUDIO CODE
**MICROSOFT PRE-RELEASE SOFTWARE LICENSE TERMS**
**MICROSOFT C/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 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.
---
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.
---
**IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW.**
1. INSTALLATION AND USE RIGHTS. You may only use the C/C++ Extension
for Visual Studio Code with Visual Studio Code, Visual Studio or
Xamarin Studio software to help you develop and test your
applications.
1. **INSTALLATION AND USE RIGHTS.**
You may only use the C/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.
b. Package Managers. The software may include package managers, like
Nuget, that give you the option to download other Microsoft and third
party software packages to use with your application. Those packages
are under their own licenses, and not this agreement. Microsoft does
not distribute, license or provide any warranties for any of the third
party packages.
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.
**b. Package Managers.** The software may include package managers, like Nuget, that give you the option to download other Microsoft and third party software packages to use with your application. Those packages are under their own licenses, and not this agreement. Microsoft does not distribute, license or provide any warranties for any of the third party packages.
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 Microsofts 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.
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 https://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.
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.
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. You may not
* work around any technical limitations in the software;
* reverse engineer, decompile or disassemble the software, or attempt
to derive the source code for the software, except and 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 solution for others to use.
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 http://www.microsoftvolumelicensing.com/. 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).
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 https://aka.ms/exporting.
8. SUPPORT SERVICES. Because this software is “as is,” we may not
provide support services for it.
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.
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.
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:
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.
**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.
**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.
**c. Germany and Austria.**
12. 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.
**(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.
13. 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.
**(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.
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.
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.
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.
12. **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.**
Please note: As this software is distributed in Quebec, Canada, some
of the clauses in this agreement are provided below in French.
13. **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.**
Remarque : Ce logiciel étant distribué au Québec, Canada, certaines
des clauses dans ce contrat sont fournies ci-dessous en français.
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.
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 naccorde 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, dadéquation à un
usage particulier et dabsence de contrefaçon sont exclues.
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 naccorde 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, dadéquation à un usage particulier et dabsence 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.
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
* 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 dune
autre faute dans la limite autorisée par la loi en vigueur.
* les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou dune autre faute dans la limite autorisée par la loi en vigueur.
Elle sapplique également, même si Microsoft connaissait ou
devrait connaître l’éventualité dun tel dommage. Si votre pays
nautorise pas lexclusion ou la limitation de responsabilité
pour les dommages indirects, accessoires ou de quelque nature que ce
soit, il se peut que la limitation ou lexclusion ci-dessus ne
sappliquera pas à votre égard.
Elle sapplique également, même si Microsoft connaissait ou devrait connaître l’éventualité dun tel dommage. Si votre pays nautorise pas lexclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou lexclusion ci-dessus ne sappliquera pas à votre égard.
**EFFET JURIDIQUE.** Le présent contrat décrit certains droits juridiques. Vous pourriez avoir dautres 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.
EFFET JURIDIQUE. Le présent contrat décrit certains droits
juridiques. Vous pourriez avoir dautres 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.
+10 -3
View File
@@ -2,7 +2,7 @@
This preview release of the extension adds language support for C/C++ to Visual Studio Code including:
* Language service
* Code Formatting (clang-format)
* Auto-Completion (experimental)
* Auto-Completion
* Symbol Searching
* Go to Definition/Declaration
* Peek Definition/Declaration
@@ -11,7 +11,7 @@ This preview release of the extension adds language support for C/C++ to Visual
* Quick Info (Hover)
* Error Squiggles
* Debugging
* Support for debugging Windows (PDB, Mingw/Cygwin), Linux and OS X applications
* Support for debugging Windows (PDB, MinGW/Cygwin), Linux and macOS applications
* Line by line code stepping
* Breakpoints (including conditional and function breakpoints)
* Variable inspection
@@ -23,5 +23,12 @@ This preview release of the extension adds language support for C/C++ to Visual
You can find more detailed information about C/C++ support for Visual Studio Code at our [GitHub page](https://github.com/Microsoft/vscode-cpptools/tree/master/Documentation) and our [VS Code documentation page](https://code.visualstudio.com/docs/languages/cpp).
## Installation
The extension has OS-specific binary dependencies, so installation via the Marketplace requires an Internet connection so that these additional dependencies can be downloaded. If you are working on a computer that does not have access to the Internet or is behind a strict firewall, you may need to use our OS-specific packages and install them by invoking VS Code's `"Install from VSIX..."` command. These "offline' packages are available at: https://github.com/Microsoft/vscode-cpptools/releases.
* `cpptools-linux.vsix` - for 64-bit Linux
* `cpptools-linux32.vsix` - for 32-bit Linux
* `cpptools-osx.vsix` - for macOS
* `cpptools-win32.vsix` - for 64-bit & 32-bit Windows
## Contact Us
If you run into any issues or have suggestions for us, please file [issues and suggestions on GitHub](https://github.com/Microsoft/vscode-cpptools/issues). If you havent already provided us feedback, please take this [quick survey](https://www.research.net/r/VBVV6C6) to help shape this extension for your needs.
If you run into any issues or have suggestions for us, please file [issues and suggestions on GitHub](https://github.com/Microsoft/vscode-cpptools/issues). If you havent already provided us feedback, please take this [quick survey](https://www.research.net/r/VBVV6C6) and let us know what you think!
+20 -8
View File
@@ -205,9 +205,22 @@
<tr>
<td>
<div>
<h2 class="caption">January 2018 Update</h2>
<div>Thank you for installing the C/C++ extension. In the January update, we fixed a performance regression in the code browsing service (aka: Tag Parser). We also added the setting: <code>C_Cpp.workspaceParsingPriority</code> which allows you to control how aggressively the extension should index your workspace.<br />
<br />
<h2 class="caption">May 2019 Update</h2>
<div>Thank you for installing the C/C++ extension! We're excited to announce the following features in the May update:<br/>
<h3 style="font-weight: 600">IntelliSense configuration settings editor UI</h3>
The extension now has a UI editor to edit basic IntelliSense configuration settings defined in the underlying <code>c_cpp_properties.json</code> file.<br/>
<br/>
You can get to the IntelliSense configuration settings editor UI through the command palette (Ctrl+Shift+P) and running the <code>C/C++: Edit configurations (UI)</code> command.
The <code>c_cpp_properties.json</code> file can be opened by running the <code>C/C++: Edit configurations (JSON)</code> command.
<br/>
<br/>
<em style="font-weight: 600">Please Note:</em> When configuring IntelliSense for the first time, VS Code will open the UI editor or JSON file based on your <code>workbench.settings.editor</code> setting.
If <code>workbench.settings.editor</code> is set to “ui”, then the UI editor will open by default, and if it is set to “json”, then the JSON file will open by default. You can view that setting under VS Code preferences → settings → “Workbench Settings Editor”.<br/>
<h3 style="font-weight: 600">Log diagnostics command</h3>
We added the command <code>C/C++: Log Diagnostics</code> to help diagnose IntelliSense issues. Running the command shows IntelliSense information of the current translation unit that is associated with the active file.<br/>
<br/>
<br/>
Additional features and bug fixes are detailed in the <a href="https://github.com/Microsoft/vscode-cpptools/releases">full release notes</a>.</div>
</div>
</td>
@@ -220,7 +233,7 @@
<td>
<div>
<h3 class="caption">Getting Started</h3>
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started.md">Configuring IntelliSense</a></div>
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/Getting%20started%20with%20IntelliSense%20configuration.md">Configuring IntelliSense</a></div>
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md">Configuring Debugging</a></div>
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/MinGW.md">IntelliSense for MinGW projects</a></div>
<div><a href="https://github.com/Microsoft/vscode-cpptools/blob/master/Documentation/LanguageServer/Windows%20Subsystem%20for%20Linux.md">IntelliSense for Windows Subsystem for Linux projects</a></div>
@@ -231,10 +244,9 @@
<td>
<div>
<h3 class="caption">Blog Posts</h3>
<div><a href="https://blogs.msdn.microsoft.com/vcblog/2017/12/11/visual-studio-code-cc-extension-dec-2017-update-support-for-more-linux-distros/">December 2017 Update</a></div>
<div><a href="https://blogs.msdn.microsoft.com/vcblog/2017/11/09/visual-studio-code-cc-extension-nov-2017-update-multi-root-workspaces-support-is-here/">November 2017 Update</a></div>
<div><a href="https://blogs.msdn.microsoft.com/vcblog/2017/10/20/visual-studio-code-cc-extension-october-2017-update/">October 2017 Update</a></div>
<div><a href="https://blogs.msdn.microsoft.com/vcblog/2016/03/31/cc-extension-for-visual-studio-code/">C/C++ Extension anouncement</a></div>
<div><a href="https://devblogs.microsoft.com/cppblog/vscode-cpp-may-2019-update/">May 2019 Update</a></div>
<div><a href="https://devblogs.microsoft.com/cppblog/visual-studio-code-c-c-extension-march-2019-update/">March 2019 Update</a></div>
<div><a href="https://devblogs.microsoft.com/cppblog/vs-code-cpp-extension-january-2019-update/">January 2019 Update</a></div>
</div>
</td>
</tr>
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#F6F6F6"/><path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#424242"/></svg>

After

Width:  |  Height:  |  Size: 986 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.451 5.609l-.579-.939-1.068.812-.076.094c-.335.415-.927 1.341-1.124 2.876l-.021.165.033.163.071.345c0 1.654-1.346 3-3 3-.795 0-1.545-.311-2.107-.868-.563-.567-.873-1.317-.873-2.111 0-1.431 1.007-2.632 2.351-2.929v2.926s2.528-2.087 2.984-2.461h.012l3.061-2.582-4.919-4.1h-1.137v2.404c-3.429.318-6.121 3.211-6.121 6.721 0 1.809.707 3.508 1.986 4.782 1.277 1.282 2.976 1.988 4.784 1.988 3.722 0 6.75-3.028 6.75-6.75 0-1.245-.349-2.468-1.007-3.536z" fill="#2D2D30"/><path d="M12.6 6.134l-.094.071c-.269.333-.746 1.096-.91 2.375.057.277.092.495.092.545 0 2.206-1.794 4-4 4-1.098 0-2.093-.445-2.817-1.164-.718-.724-1.163-1.718-1.163-2.815 0-2.206 1.794-4 4-4l.351.025v1.85s1.626-1.342 1.631-1.339l1.869-1.577-3.5-2.917v2.218l-.371-.03c-3.176 0-5.75 2.574-5.75 5.75 0 1.593.648 3.034 1.695 4.076 1.042 1.046 2.482 1.694 4.076 1.694 3.176 0 5.75-2.574 5.75-5.75-.001-1.106-.318-2.135-.859-3.012z" fill="#C5C5C5"/></svg>

After

Width:  |  Height:  |  Size: 986 B

+3 -3
View File
@@ -4,11 +4,11 @@
"--microsoft",
"--microsoft_bugs",
"--microsoft_version",
"1900",
"1914",
"--pack_alignment",
"8",
"-D_MSC_VER=1900",
"-D_MSC_FULL_VER=190024210",
"-D_MSC_VER=1914",
"-D_MSC_FULL_VER=191426428",
"-D_MSC_BUILD=0",
"-D_M_IX86=600",
"-D_M_IX86_FP=2"
+1 -3
View File
@@ -1,9 +1,7 @@
{
"defaults": [
"--clang",
"--pack_alignment",
"8",
"--framework_include_directory=/System/Library/Frameworks"
"8"
],
"defaults_op" : "merge"
}
+4 -4
View File
@@ -4,15 +4,15 @@
"--microsoft",
"--microsoft_bugs",
"--microsoft_version",
"1900",
"1914",
"--pack_alignment",
"8",
"-D_CPPUNWIND=1",
"-D_MSC_VER=1900",
"-D_MSC_FULL_VER=190024210",
"-D_MSC_VER=1914",
"-D_MSC_FULL_VER=191426428",
"-D_MSC_BUILD=0",
"-D_M_X64=100",
"-D_AMD64=100"
"-D_M_AMD64=100"
],
"defaults_op" : "merge"
}
+1 -3
View File
@@ -1,9 +1,7 @@
{
"defaults": [
"--clang",
"--pack_alignment",
"8",
"-D__CHAR_BIT__=8"
"8"
],
"defaults_op" : "merge"
}
+4 -4
View File
@@ -4,15 +4,15 @@
"--microsoft",
"--microsoft_bugs",
"--microsoft_version",
"1900",
"1914",
"--pack_alignment",
"8",
"-D_CPPUNWIND=1",
"-D_MSC_VER=1900",
"-D_MSC_FULL_VER=190024210",
"-D_MSC_VER=1914",
"-D_MSC_FULL_VER=191426428",
"-D_MSC_BUILD=0",
"-D_M_X64=100",
"-D_AMD64=100"
"-D_M_AMD64=100"
],
"defaults_op" : "merge"
}
+1 -3
View File
@@ -1,9 +1,7 @@
{
"defaults": [
"--clang",
"--pack_alignment",
"8",
"-D__CHAR_BIT__=8"
"8"
],
"defaults_op" : "merge"
}
+4 -4
View File
@@ -4,15 +4,15 @@
"--microsoft",
"--microsoft_bugs",
"--microsoft_version",
"1900",
"1914",
"--pack_alignment",
"8",
"-D_CPPUNWIND=1",
"-D_MSC_VER=1900",
"-D_MSC_FULL_VER=190024210",
"-D_MSC_VER=1914",
"-D_MSC_FULL_VER=191426428",
"-D_MSC_BUILD=0",
"-D_M_X64=100",
"-D_AMD64=100"
"-D_M_AMD64=100"
],
"defaults_op" : "merge"
}
+2 -8
View File
@@ -6,6 +6,8 @@
"--rtti",
"--edge",
"--exceptions",
"--error_limit",
"25000",
"-D_EDG_COMPILER",
"-D_USE_DECLSPECS_FOR_SAL=1"
],
@@ -26,14 +28,6 @@
{
"match": "^/dE--header_only_fallback",
"replace": "--header_only_fallback"
},
{
"match": "^/lang_c_",
"replace": "--c\n--c11"
},
{
"match": "^/lang_cpp_",
"replace": "--c++17"
}
]
}
+94 -13
View File
@@ -11,12 +11,38 @@
],
"properties": {
"name": {
"description": "Platform name. Mac, Linux, or Win32 are the defaults unless a custom platform is added.",
"description": "Configuration identifier. Mac, Linux, and Win32 are special identifiers for configurations that will be auto-selected on those platforms, but the identifier can be anything.",
"type": "string"
},
"compileCommands":{
"description": "path to compile_commands.json file for the workspace",
"type":"string"
"compilerPath": {
"description": "Full path of the compiler being used, e.g. /usr/bin/gcc, to enable more accurate IntelliSense. Args can be added to modify the includes/defines used, e.g. -nostdinc++, -m32, etc., but paths with spaces must be surrounded with \\\" if args are used.",
"type": "string"
},
"cStandard": {
"description": "Version of the C language standard to use for IntelliSense.",
"type": "string",
"enum": [
"c89",
"c99",
"c11",
"${default}"
]
},
"cppStandard": {
"description": "Version of the C++ language standard to use for IntelliSense.",
"type": "string",
"enum": [
"c++98",
"c++03",
"c++11",
"c++14",
"c++17",
"${default}"
]
},
"compileCommands": {
"description": "Full path to compile_commands.json file for the workspace.",
"type": "string"
},
"includePath": {
"description": "A list of paths for the IntelliSense engine to use while searching for included headers. Searching on these paths is not recursive.",
@@ -32,6 +58,11 @@
"type": "string"
}
},
"windowsSdkVersion": {
"description": "Version of the Windows SDK include path to use on Windows, e.g. '10.0.17134.0'.",
"type": "string",
"pattern": "^\\d{2}\\.\\d{1}\\.\\d{5}\\.\\d{1}$|^8\\.1$"
},
"defines": {
"description": "A list of preprocessor definitions for the IntelliSense engine to use while parsing files. Optionally, use = to set a value, e.g. VERSION=1.",
"type": "array",
@@ -40,19 +71,35 @@
}
},
"intelliSenseMode": {
"description": "If set, it overrides the default mode used by the IntelliSense engine. Windows defaults to msvc-x64, Linux defaults to gcc-x64, and Mac default to clang-x64.",
"type": "string",
"enum": [
"msvc-x64",
"clang-x64"
],
"description": "If set, it overrides the default mode used by the IntelliSense engine. Windows defaults to msvc-x64 and Linux/Mac default to clang-x64."
"gcc-x64",
"clang-x64",
"${default}"
]
},
"forcedInclude": {
"description": "A list of files that should be included before any include file in a translation unit.",
"type": "array",
"items": {
"type": "string"
}
},
"configurationProvider": {
"description": "The id of a VS Code extension that can provide IntelliSense configuration information for source files.",
"type": "string"
},
"browse": {
"type": "object",
"properties": {
"limitSymbolsToIncludedHeaders": {
"description": "true to process only those files directly or indirectly included as headers, false to process all files under the specified include paths",
"type": "boolean"
"description": "true to process only those files directly or indirectly included as headers, false to process all files under the specified include paths.",
"type": [
"boolean",
"string"
]
},
"databaseFilename": {
"description": "Path to the generated symbol database. If a relative path is specified, it will be made relative to the workspace's default storage location.",
@@ -65,26 +112,60 @@
"type": "string"
}
}
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
},
"env": {
"type": "object",
"description": "Custom variables that can be reused anywhere in this file using the ${variable} or ${env:variable} syntax.",
"patternProperties": {
"(?!^workspaceFolder$)(?!^workspaceRoot$)(?!^workspaceFolderBasename$)(?!^default$)(^.+$)": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
}
},
"additionalProperties": false
},
"version": {
"type": "integer",
"description": "Version of the configuration file. This property is managed by the extension. Please do not change it."
},
"enableConfigurationSquiggles": {
"type": "boolean",
"default": true,
"description": "Controls whether the extension will report errors detected in c_cpp_properties.json."
}
},
"properties": {
"configurations": {
"$ref": "#/definitions/configurations"
},
"env": {
"$ref": "#/definitions/env"
},
"version": {
"$ref": "#/definitions/version"
},
"enableConfigurationSquiggles": {
"$ref": "#/definitions/enableConfigurationSquiggles"
}
},
"required": [
"configurations",
"version"
]
}
],
"additionalProperties": false
}
+2 -2228
View File
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -1,3 +1,6 @@
{
"intelliSenseEngine_default_percentage": 100
"intelliSenseEngine_default_percentage": 100,
"defaultIntelliSenseEngine": 100,
"recursiveIncludes": 100,
"gotoDefIntelliSense": 100
}
+33 -34
View File
@@ -9,42 +9,24 @@ const gulp = require('gulp');
const env = require('gulp-env')
const tslint = require('gulp-tslint');
const mocha = require('gulp-mocha');
const fs = require('fs');
const optionsSchemaGenerator = require('./out/tools/GenerateOptionsSchema');
gulp.task('allTests', () => {
gulp.start('unitTests');
gulp.start('integrationTests');
});
gulp.task('unitTests', () => {
gulp.src('./out/test/unitTests', {read: false}).pipe(
mocha({
ui: "tdd"
})
).once('error', err => {
process.exit(1);
})
.once('end', () => {
process.exit();
})
});
gulp.task('integrationTests', () => {
gulp.task('unitTests', (done) => {
env.set({
CODE_TESTS_PATH: "./out/test/integrationTests",
CODE_TESTS_WORKSPACE: "./test/integrationTests/testAssets/SimpleCppProject"
}
);
gulp.src('./test/runVsCodeTestsWithAbsolutePaths.js', {read: false}).pipe(
mocha({
ui: "tdd",
delay: true
CODE_TESTS_PATH: "./out/test/unitTests",
});
return gulp.src('./test/runVsCodeTestsWithAbsolutePaths.js', {read: false})
.pipe(mocha({ ui: "tdd" }))
.once('error', err => {
done();
process.exit(1);
})
).once('error', err => {
process.exit(1);
})
.once('end', () => {
process.exit();
})
.once('end', () => {
done();
process.exit();
});
});
/// Misc Tasks
@@ -64,7 +46,7 @@ const lintReporter = (output, file, options) => {
};
gulp.task('tslint', () => {
gulp.src(allTypeScript)
return gulp.src(allTypeScript)
.pipe(tslint({
program: require('tslint').Linter.createProgram("./tsconfig.json"),
configuration: "./tslint.json"
@@ -73,4 +55,21 @@ gulp.task('tslint', () => {
summarizeFailureOutput: false,
emitError: false
}))
});
gulp.task('pr-check', (done) => {
const packageJson = JSON.parse(fs.readFileSync('./package.json').toString());
if (packageJson.activationEvents.length !== 1 && packageJson.activationEvents[0] !== '*') {
console.log('Please make sure to not check in package.json that has been rewritten by the extension activation. If you intended to have changes in package.json, please only check-in your changes. If you did not, please run `git checkout -- package.json`.');
done();
process.exit(1);
}
done();
});
gulp.task('generateOptionsSchema', (done) => {
optionsSchemaGenerator.generateOptionsSchema();
done();
});
+52
View File
@@ -0,0 +1,52 @@
parameters:
name: ''
pool: ''
jobs:
- job: Windows
pool:
vmImage: 'vs2017-win2016'
steps:
- task: NodeTool@0
displayName: 'Use Node 8.x'
inputs:
versionSpec: 8.x
- script: npm install
displayName: "Install Dependencies"
workingDirectory: '$(Build.SourcesDirectory)\Extension'
- script: npm run compile
displayName: "Compile Sources"
workingDirectory: '$(Build.SourcesDirectory)\Extension'
- script: npm run pr-check
displayName: 'Validate Extension/package.json'
workingDirectory: '$(Build.SourcesDirectory)\Extension'
- script: npm run tslint
displayName: 'Run Linter'
workingDirectory: '$(Build.SourcesDirectory)\Extension'
- script: 'npm run unitTests'
displayName: 'Run unit tests'
workingDirectory: '$(Build.SourcesDirectory)\Extension'
continueOnError: true
- script: npm run pretest
displayName: "Compile Test Sources"
workingDirectory: '$(Build.SourcesDirectory)\Extension'
- script: 'node node_modules/vscode/bin/test'
displayName: 'Run languageServer integration tests'
workingDirectory: '$(Build.SourcesDirectory)\Extension'
env:
CODE_TESTS_PATH: '$(Build.SourcesDirectory)\Extension\out\test\integrationTests\languageServer'
CODE_EXTENSIONS_PATH: '$(Build.SourcesDirectory)\Extension'
CODE_TESTS_WORKSPACE: '$(Build.SourcesDirectory)\Extension\test\integrationTests\testAssets\SimpleCppProject'
CODE_DISABLE_EXTENSIONS: 1
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: 'Component Detection'
continueOnError: true
+58
View File
@@ -0,0 +1,58 @@
parameters:
name: ''
pool: ''
jobs:
- job: ${{ parameters.name }}
pool: ${{ parameters.pool }}
steps:
- task: NodeTool@0
displayName: 'Use Node 8.x'
inputs:
versionSpec: 8.x
- script: npm install
displayName: "Install Dependencies"
workingDirectory: '$(Build.SourcesDirectory)/Extension'
- script: npm run compile
displayName: "Compile Sources"
workingDirectory: '$(Build.SourcesDirectory)/Extension'
- script: npm run pr-check
displayName: 'Validate Extension/package.json'
workingDirectory: '$(Build.SourcesDirectory)/Extension'
- script: npm run tslint
displayName: 'Run Linter'
workingDirectory: '$(Build.SourcesDirectory)/Extension'
- script: 'npm run unitTests'
displayName: 'Run unit tests'
workingDirectory: '$(Build.SourcesDirectory)/Extension'
continueOnError: true
- script: |
set -e
/usr/bin/Xvfb :10 -ac >> /tmp/Xvfb.out 2>&1 &
disown -ar
displayName: 'Start xvfb'
- script: npm run pretest
displayName: "Compile Test Sources"
workingDirectory: '$(Build.SourcesDirectory)/Extension'
- script: 'node node_modules/vscode/bin/test'
displayName: 'Run languageServer integration tests'
workingDirectory: '$(Build.SourcesDirectory)/Extension'
env:
DISPLAY: :10
CODE_TESTS_PATH: '$(Build.SourcesDirectory)/Extension/out/test/integrationTests/languageServer'
CODE_EXTENSIONS_PATH: '$(Build.SourcesDirectory)/Extension'
CODE_TESTS_WORKSPACE: '$(Build.SourcesDirectory)/Extension/test/integrationTests/testAssets/SimpleCppProject'
CODE_DISABLE_EXTENSIONS: 1
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
displayName: 'Component Detection'
continueOnError: true
+4662 -2780
View File
File diff suppressed because it is too large Load Diff
+533 -124
View File
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
{
"c_cpp.command.configurationSelect.title": "Scegli una configurazione...",
"c_cpp.command.configurationProviderSelect.title": "Cambia provider configurazioni...",
"c_cpp.command.configurationEditJSON.title": "Modifica configurazioni (JSON)",
"c_cpp.command.configurationEditUI.title": "Modifica configurazioni (UI)",
"c_cpp.command.goToDeclaration.title": "Vai a dichiarazione",
"c_cpp.command.peekDeclaration.title": "Visualizza dichiarazione",
"c_cpp.command.switchHeaderSource.title": "Visualizza Header/Sorgente",
"c_cpp.command.navigate.title": "Naviga...",
"c_cpp.command.enableErrorSquiggles.title": "Attiva sottolineamento errori",
"c_cpp.command.disableErrorSquiggles.title": "Disattiva sottolineamento errori",
"c_cpp.command.toggleIncludeFallback.title": "Attiva/Disattiva motore di fallback IntelliSense negli errori di inclusione",
"c_cpp.command.toggleDimInactiveRegions.title": "Attiva/Disattiva colorazione regioni inattive",
"c_cpp.command.showReleaseNotes.title": "Mostra note di rilascio",
"c_cpp.command.resetDatabase.title": "Reimposta il database di IntelliSense",
"c_cpp.command.pauseParsing.title": "Metti in pausa l'analisi del codice",
"c_cpp.command.resumeParsing.title": "Riprendi l'analisi del codice",
"c_cpp.command.showParsingCommands.title": "Mostra comandi per l'analisi del codice",
"c_cpp.command.takeSurvey.title": "Partecipa al Sondaggio",
"c_cpp.command.buildAndDebugActiveFile.title": "Compila ed Esegui il debug del file attivo",
"c_cpp.command.logDiagnostics.title": "Registra Diagnostica"
}
+22
View File
@@ -0,0 +1,22 @@
{
"c_cpp.command.configurationSelect.title": "Select a configuration...",
"c_cpp.command.configurationProviderSelect.title": "Change configuration provider...",
"c_cpp.command.configurationEditJSON.title": "Edit configurations (JSON)",
"c_cpp.command.configurationEditUI.title": "Edit configurations (UI)",
"c_cpp.command.goToDeclaration.title": "Go to Declaration",
"c_cpp.command.peekDeclaration.title": "Peek Declaration",
"c_cpp.command.switchHeaderSource.title": "Switch Header/Source",
"c_cpp.command.navigate.title": "Navigate...",
"c_cpp.command.enableErrorSquiggles.title": "Enable error squiggles",
"c_cpp.command.disableErrorSquiggles.title": "Disable error squiggles",
"c_cpp.command.toggleIncludeFallback.title": "Toggle IntelliSense engine fallback on include errors",
"c_cpp.command.toggleDimInactiveRegions.title": "Toggle inactive region colorization",
"c_cpp.command.showReleaseNotes.title": "Show release notes",
"c_cpp.command.resetDatabase.title": "Reset IntelliSense database",
"c_cpp.command.pauseParsing.title": "Pause parsing",
"c_cpp.command.resumeParsing.title": "Resume parsing",
"c_cpp.command.showParsingCommands.title": "Show parsing commands",
"c_cpp.command.takeSurvey.title": "Take survey",
"c_cpp.command.buildAndDebugActiveFile.title": "Build and Debug Active File",
"c_cpp.command.logDiagnostics.title": "Log Diagnostics"
}
+22
View File
@@ -0,0 +1,22 @@
{
"c_cpp.command.configurationSelect.title": "选择配置...",
"c_cpp.command.configurationProviderSelect.title": "更换配置提供程序...",
"c_cpp.command.configurationEditJSON.title": "编辑配置 (JSON)",
"c_cpp.command.configurationEditUI.title": "编辑配置 (UI)",
"c_cpp.command.goToDeclaration.title": "跳转到声明",
"c_cpp.command.peekDeclaration.title": "查看声明",
"c_cpp.command.switchHeaderSource.title": "切换头文件/源文件",
"c_cpp.command.navigate.title": "导航...",
"c_cpp.command.enableErrorSquiggles.title": "启用错误下划线",
"c_cpp.command.disableErrorSquiggles.title": "禁用错误下划线",
"c_cpp.command.toggleIncludeFallback.title": "切换IntelliSense引擎头文件包含错误回退",
"c_cpp.command.toggleDimInactiveRegions.title": "切换非活跃区域着色",
"c_cpp.command.showReleaseNotes.title": "查看版本说明",
"c_cpp.command.resetDatabase.title": "重置IntelliSense数据",
"c_cpp.command.pauseParsing.title": "暂停解析",
"c_cpp.command.resumeParsing.title": "继续解析",
"c_cpp.command.showParsingCommands.title": "查看解析命令",
"c_cpp.command.takeSurvey.title": "调查问卷",
"c_cpp.command.buildAndDebugActiveFile.title": "生成和调试当前文件",
"c_cpp.command.logDiagnostics.title": "记录诊断"
}
@@ -0,0 +1,85 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as fs from 'fs';
export interface Environment {
name: string;
value: string;
}
export class ParsedEnvironmentFile {
public Env: Environment[];
public Warning: string | null;
private constructor(env: Environment[], warning: string | null) {
this.Env = env;
this.Warning = warning;
}
public static CreateFromFile(envFile: string, initialEnv: Environment[] | undefined): ParsedEnvironmentFile {
let content: string = fs.readFileSync(envFile, "utf8");
return this.CreateFromContent(content, envFile, initialEnv);
}
public static CreateFromContent(content: string, envFile: string, initialEnv: Environment[] | undefined): ParsedEnvironmentFile {
// Remove UTF-8 BOM if present
if (content.charAt(0) === '\uFEFF') {
content = content.substr(1);
}
let parseErrors: string[] = [];
let env: Map<string, any> = new Map();
if (initialEnv) {
// Convert array to map to prevent duplicate keys being created.
// If a duplicate key is found, replace it.
initialEnv.forEach((e) => {
env.set(e.name, e.value);
});
}
content.split("\n").forEach(line => {
// Split the line between key and value
const r: RegExpMatchArray = line.match(/^\s*([\w\.\-]+)\s*=\s*(.*)?\s*$/);
if (r !== null) {
const key: string = r[1];
let value: string = r[2] || "";
if ((value.length > 0) && (value.charAt(0) === '"') && (value.charAt(value.length - 1) === '"')) {
value = value.replace(/\\n/gm, "\n");
}
value = value.replace(/(^['"]|['"]$)/g, "");
env.set(key, value);
} else {
// Blank lines and lines starting with # are no parse errors
const comments: RegExp = new RegExp(/^\s*(#|$)/);
if (!comments.test(line)) {
parseErrors.push(line);
}
}
});
// show error message if single lines cannot get parsed
let warning: string = null;
if (parseErrors.length !== 0) {
warning = "Ignoring non-parseable lines in envFile " + envFile + ": ";
parseErrors.forEach(function (value, idx, array): void {
warning += "\"" + value + "\"" + ((idx !== array.length - 1) ? ", " : ".");
});
}
// Convert env map back to array.
const arrayEnv: Environment[] = [];
for (let key of env.keys()) {
arrayEnv.push({name: key, value: env.get(key)});
}
return new ParsedEnvironmentFile(arrayEnv, warning);
}
}
+70
View File
@@ -0,0 +1,70 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as util from '../common';
import * as vscode from 'vscode';
class RefreshButton implements vscode.QuickInputButton {
get iconPath(): { dark: vscode.Uri; light: vscode.Uri } {
const refreshImagePathDark: string = util.getExtensionFilePath("assets/Refresh_inverse.svg");
const refreshImagePathLight: string = util.getExtensionFilePath("assets/Refresh.svg");
return {
dark: vscode.Uri.file(refreshImagePathDark),
light: vscode.Uri.file(refreshImagePathLight)
};
}
get tooltip(): string {
return "Refresh process list";
}
}
export interface AttachItem extends vscode.QuickPickItem {
id: string;
}
export function showQuickPick(getAttachItems: () => Promise<AttachItem[]>): Promise<string> {
return getAttachItems().then(processEntries => {
return new Promise<string>((resolve, reject) => {
let quickPick: vscode.QuickPick<AttachItem> = vscode.window.createQuickPick<AttachItem>();
quickPick.title = "Attach to process";
quickPick.canSelectMany = false;
quickPick.matchOnDescription = true;
quickPick.matchOnDetail = true;
quickPick.placeholder = "Select the process to attach to";
quickPick.items = processEntries;
quickPick.buttons = [new RefreshButton()];
let disposables: vscode.Disposable[] = [];
quickPick.onDidTriggerButton(button => {
getAttachItems().then(processEntries => quickPick.items = processEntries);
}, undefined, disposables);
quickPick.onDidAccept(() => {
if (quickPick.selectedItems.length !== 1) {
reject(new Error("Process not selected"));
}
let selectedId: string = quickPick.selectedItems[0].id;
disposables.forEach(item => item.dispose());
quickPick.dispose();
resolve(selectedId);
}, undefined, disposables);
quickPick.onDidHide(() => {
disposables.forEach(item => item.dispose());
quickPick.dispose();
reject(new Error("Process not selected."));
}, undefined, disposables);
quickPick.show();
});
});
}
+49 -31
View File
@@ -3,14 +3,16 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import { execChildProcess } from '../common';
import { PsProcessParser } from './nativeAttach';
import * as util from '../common';
import { AttachItem, showQuickPick } from './attachQuickPick';
export interface AttachItem extends vscode.QuickPickItem {
id: string;
}
import * as debugUtils from './utils';
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import * as util from '../common';
import * as vscode from 'vscode';
export interface AttachItemsProvider {
getAttachItems(): Promise<AttachItem[]>;
@@ -24,19 +26,7 @@ export class AttachPicker {
if (!ready) {
util.displayExtensionNotReadyPrompt();
} else {
return this.attachItemsProvider.getAttachItems()
.then(processEntries => {
let attachPickOptions: vscode.QuickPickOptions = {
matchOnDescription: true,
matchOnDetail: true,
placeHolder: "Select the process to attach to"
};
return vscode.window.showQuickPick(processEntries, attachPickOptions)
.then(chosenProcess => {
return chosenProcess ? chosenProcess.id : Promise.reject<string>(new Error("Process not selected."));
});
});
return showQuickPick(() => this.attachItemsProvider.getAttachItems());
}
});
}
@@ -49,20 +39,47 @@ export class RemoteAttachPicker {
private _channel: vscode.OutputChannel = null;
public ShowAttachEntries(args: any): Promise<string> {
public ShowAttachEntries(config: any): Promise<string> {
return util.isExtensionReady().then(ready => {
if (!ready) {
util.displayExtensionNotReadyPrompt();
} else {
this._channel.clear();
let pipeTransport: any = args ? args.pipeTransport : null;
let pipeTransport: any = config ? config.pipeTransport : null;
if (pipeTransport === null) {
return Promise.reject<string>(new Error("Chosen debug configuration does not contain pipeTransport"));
}
let pipeProgram: string = pipeTransport.pipeProgram;
let pipeProgram: string = null;
if (os.platform() === 'win32' &&
pipeTransport.pipeProgram &&
!fs.existsSync(pipeTransport.pipeProgram)) {
const pipeProgramStr: string = pipeTransport.pipeProgram.toLowerCase().trim();
const expectedArch: debugUtils.ArchType = debugUtils.ArchType[process.arch];
// Check for pipeProgram
if (!fs.existsSync(config.pipeTransport.pipeProgram)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(pipeProgramStr, expectedArch);
}
// If pipeProgram does not get replaced and there is a pipeCwd, concatenate with pipeProgramStr and attempt to replace.
if (!pipeProgram && config.pipeTransport.pipeCwd) {
const pipeCwdStr: string = config.pipeTransport.pipeCwd.toLowerCase().trim();
const newPipeProgramStr: string = path.join(pipeCwdStr, pipeProgramStr);
if (!fs.existsSync(newPipeProgramStr)) {
pipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(newPipeProgramStr, expectedArch);
}
}
}
if (!pipeProgram) {
pipeProgram = pipeTransport.pipeProgram;
}
let pipeArgs: string[] = pipeTransport.pipeArgs;
let argList: string = RemoteAttachPicker.createArgumentList(pipeArgs);
@@ -88,42 +105,43 @@ export class RemoteAttachPicker {
private getRemoteOSAndProcesses(pipeCmd: string): Promise<AttachItem[]> {
// Commands to get OS and processes
const command: string = `bash -c 'uname && if [ $(uname) == "Linux" ] ; then ${PsProcessParser.psLinuxCommand} ; elif [ $(uname) == "Darwin" ] ; ` +
`then ${PsProcessParser.psDarwinCommand}; fi'`;
const command: string = `sh -c "uname && if [ $(uname) = \\\"Linux\\\" ] ; then ${PsProcessParser.psLinuxCommand} ; elif [ $(uname) = \\\"Darwin\\\" ] ; ` +
`then ${PsProcessParser.psDarwinCommand}; fi"`;
return execChildProcess(`${pipeCmd} "${command}"`, null, this._channel).then(output => {
// Must use single quotes around ${command}. Linux systems evaluate $() within double-quotes.
return execChildProcess(`${pipeCmd} '${command}'`, null, this._channel).then(output => {
// OS will be on first line
// Processess will follow if listed
let lines: string[] = output.split(/\r?\n/);
if (lines.length == 0) {
if (lines.length === 0) {
return Promise.reject<AttachItem[]>(new Error("Pipe transport failed to get OS and processes."));
} else {
let remoteOS: string = lines[0].replace(/[\r\n]+/g, '');
if (remoteOS != "Linux" && remoteOS != "Darwin") {
if (remoteOS !== "Linux" && remoteOS !== "Darwin") {
return Promise.reject<AttachItem[]>(new Error(`Operating system "${remoteOS}" not supported.`));
}
// Only got OS from uname
if (lines.length == 1) {
if (lines.length === 1) {
return Promise.reject<AttachItem[]>(new Error("Transport attach could not obtain processes list."));
} else {
let processes: string[] = lines.slice(1);
return PsProcessParser.ParseProcessFromPsArray(processes)
.sort((a, b) => {
if (a.name == undefined) {
if (b.name == undefined) {
if (a.name === undefined) {
if (b.name === undefined) {
return 0;
}
return 1;
}
if (b.name == undefined) {
if (b.name === undefined) {
return -1;
}
let aLower: string = a.name.toLowerCase();
let bLower: string = b.name.toLowerCase();
if (aLower == bLower) {
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
+237 -19
View File
@@ -3,12 +3,86 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as debugUtils from './utils';
import * as os from 'os';
import * as path from 'path';
import * as vscode from 'vscode';
import { getBuildTasks, BuildTaskDefinition } from '../LanguageServer/extension';
import * as util from '../common';
import * as fs from 'fs';
import * as Telemetry from '../telemetry';
import { buildAndDebugActiveFileStr } from './extension';
import { IConfiguration, IConfigurationSnippet, DebuggerType, MIConfigurations, WindowsConfigurations, WSLConfigurations, PipeTransportConfigurations } from './configurations';
import { parse } from 'jsonc-parser';
import { PlatformInformation } from '../platform';
import { Environment, ParsedEnvironmentFile } from './ParsedEnvironmentFile';
abstract class CppConfigurationProvider implements vscode.DebugConfigurationProvider {
function isDebugLaunchStr(str: string): boolean {
return str === "(gdb) Launch" || str === "(lldb) Launch" || str === "(Windows) Launch";
}
/*
* Retrieves configurations from a provider and displays them in a quickpick menu to be selected.
* Ensures that the selected configuration's preLaunchTask (if existent) is populated in the user's task.json.
* Automatically starts debugging for "Build and Debug" configurations.
*/
export class QuickPickConfigurationProvider implements vscode.DebugConfigurationProvider {
private underlyingProvider: vscode.DebugConfigurationProvider;
public constructor(provider: CppConfigurationProvider) {
this.underlyingProvider = provider;
}
async provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): Promise<vscode.DebugConfiguration[]> {
const configs: vscode.DebugConfiguration[] = await this.underlyingProvider.provideDebugConfigurations(folder, token);
const defaultConfig: vscode.DebugConfiguration = configs.find(config => { return isDebugLaunchStr(config.name); });
console.assert(defaultConfig);
const editor: vscode.TextEditor = vscode.window.activeTextEditor;
if (!editor || !util.fileIsCOrCppSource(editor.document.fileName) || configs.length <= 1) {
return [defaultConfig];
}
interface MenuItem extends vscode.QuickPickItem {
configuration: vscode.DebugConfiguration;
}
const items: MenuItem[] = configs.map<MenuItem>(config => {
let menuItem: MenuItem = {label: config.name, configuration: config};
// Rename the menu item for the default configuration as its name is non-descriptive.
if (isDebugLaunchStr(menuItem.label)) {
menuItem.label = "Default Configuration";
}
return menuItem;
});
const selection: MenuItem = await vscode.window.showQuickPick(items, {placeHolder: "Select a configuration"});
if (!selection) {
throw new Error(); // User canceled it.
}
if (selection.label.startsWith("cl.exe")) {
if (!process.env.DevEnvDir || process.env.DevEnvDir.length === 0) {
vscode.window.showErrorMessage('cl.exe build and debug is only usable when VS Code is run from the Developer Command Prompt for VS.');
throw new Error();
}
}
if (selection.label.indexOf(buildAndDebugActiveFileStr()) !== -1 && selection.configuration.preLaunchTask) {
try {
await util.ensureBuildTaskExists(selection.configuration.preLaunchTask);
await vscode.debug.startDebugging(folder, selection.configuration);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
}
return [selection.configuration];
}
resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult<vscode.DebugConfiguration> {
return this.underlyingProvider.resolveDebugConfiguration(folder, config, token);
}
}
class CppConfigurationProvider implements vscode.DebugConfigurationProvider {
private type: DebuggerType;
private provider: IConfigurationAssetProvider;
@@ -20,22 +94,166 @@ abstract class CppConfigurationProvider implements vscode.DebugConfigurationProv
/**
* Returns a list of initial debug configurations based on contextual information, e.g. package.json or folder.
*/
provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): vscode.ProviderResult<vscode.DebugConfiguration[]> {
return this.provider.getInitialConfigurations(this.type);
async provideDebugConfigurations(folder: vscode.WorkspaceFolder | undefined, token?: vscode.CancellationToken): Promise<vscode.DebugConfiguration[]> {
let buildTasks: vscode.Task[] = await getBuildTasks(true);
if (buildTasks.length === 0) {
return Promise.resolve(this.provider.getInitialConfigurations(this.type));
}
const defaultConfig: vscode.DebugConfiguration = this.provider.getInitialConfigurations(this.type).find(config => {
return isDebugLaunchStr(config.name);
});
console.assert(defaultConfig, "Could not find default debug configuration.");
const platformInfo: PlatformInformation = await PlatformInformation.GetPlatformInformation();
const platform: string = platformInfo.platform;
// Filter out build tasks that don't match the currently selectede debug configuration type.
buildTasks = buildTasks.filter((task: vscode.Task) => {
if (defaultConfig.name === "(Windows) Launch") {
if (task.name.startsWith("cl.exe")) {
return true;
}
} else {
if (!task.name.startsWith("cl.exe")) {
return true;
}
}
return false;
});
// Generate new configurations for each build task.
// Generating a task is async, therefore we must *await* *all* map(task => config) Promises to resolve.
let configs: vscode.DebugConfiguration[] = await Promise.all(buildTasks.map<Promise<vscode.DebugConfiguration>>(async task => {
const definition: BuildTaskDefinition = task.definition as BuildTaskDefinition;
const compilerName: string = path.basename(definition.compilerPath);
let newConfig: vscode.DebugConfiguration = Object.assign({}, defaultConfig); // Copy enumerables and properties
newConfig.name = compilerName + buildAndDebugActiveFileStr();
newConfig.preLaunchTask = task.name;
newConfig.externalConsole = false;
const exeName: string = path.join("${fileDirname}", "${fileBasenameNoExtension}");
newConfig.program = platform === "win32" ? exeName + ".exe" : exeName;
return new Promise<vscode.DebugConfiguration>(resolve => {
if (platform === "darwin") {
return resolve(newConfig);
} else {
let debuggerName: string;
if (compilerName.startsWith("clang")) {
newConfig.MIMode = "lldb";
const suffixIndex: number = compilerName.indexOf("-");
const suffix: string = suffixIndex === -1 ? "" : compilerName.substr(suffixIndex);
debuggerName = "lldb-mi" + suffix;
} else if (compilerName === "cl.exe") {
newConfig.miDebuggerPath = undefined;
newConfig.type = "cppvsdbg";
return resolve(newConfig);
} else {
debuggerName = "gdb";
}
if (platform === "win32") {
debuggerName += ".exe";
}
const compilerDirname: string = path.dirname(definition.compilerPath);
const debuggerPath: string = path.join(compilerDirname, debuggerName);
fs.stat(debuggerPath, (err, stats: fs.Stats) => {
if (!err && stats && stats.isFile) {
newConfig.miDebuggerPath = debuggerPath;
} else {
// TODO should probably resolve a missing debugger in a more graceful fashion for win32.
newConfig.miDebuggerPath = path.join("/usr", "bin", debuggerName);
}
return resolve(newConfig);
});
}
});
}));
configs.push(defaultConfig);
return configs;
}
/**
* Try to add all missing attributes to the debug configuration being launched.
*/
resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult<vscode.DebugConfiguration> {
// Fail if cppvsdbg type is running on non-Windows
if (config.type === 'cppvsdbg' && os.platform() !== 'win32') {
vscode.window.showErrorMessage("Debugger of type: 'cppvsdbg' is only available on Windows. Use type: 'cppdbg' on the current OS platform.");
return undefined;
}
if (config) {
if (config.type === 'cppvsdbg') {
// Fail if cppvsdbg type is running on non-Windows
if (os.platform() !== 'win32') {
vscode.window.showErrorMessage("Debugger of type: 'cppvsdbg' is only available on Windows. Use type: 'cppdbg' on the current OS platform.");
return undefined;
}
return config;
}
// Disable debug heap by default, enable if 'enableDebugHeap' is set.
if (!config.enableDebugHeap) {
const disableDebugHeapEnvSetting : Environment = {"name" : "_NO_DEBUG_HEAP", "value" : "1"};
if (config.environment && util.isArray(config.environment)) {
config.environment.push(disableDebugHeapEnvSetting);
} else {
config.environment = [disableDebugHeapEnvSetting];
}
}
// Add environment variables from .env file
if (config.envFile) {
try {
const parsedFile: ParsedEnvironmentFile = ParsedEnvironmentFile.CreateFromFile(config.envFile.replace(/\${workspaceFolder}/g, folder.uri.path), config["environment"]);
// show error message if single lines cannot get parsed
if (parsedFile.Warning) {
CppConfigurationProvider.showFileWarningAsync(parsedFile.Warning, config.envFile);
}
config.environment = parsedFile.Env;
delete config.envFile;
} catch (e) {
throw new Error("Can't parse envFile " + config.envFile);
}
}
}
// Modify WSL config for OpenDebugAD7
if (os.platform() === 'win32' &&
config.pipeTransport &&
config.pipeTransport.pipeProgram) {
let replacedPipeProgram: string = null;
const pipeProgramStr: string = config.pipeTransport.pipeProgram.toLowerCase().trim();
// OpenDebugAD7 is a 32-bit process. Make sure the WSL pipe transport is using the correct program.
replacedPipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(pipeProgramStr, debugUtils.ArchType.ia32);
// If pipeProgram does not get replaced and there is a pipeCwd, concatenate with pipeProgramStr and attempt to replace.
if (!replacedPipeProgram && !path.isAbsolute(pipeProgramStr) && config.pipeTransport.pipeCwd) {
const pipeCwdStr: string = config.pipeTransport.pipeCwd.toLowerCase().trim();
const newPipeProgramStr: string = path.join(pipeCwdStr, pipeProgramStr);
replacedPipeProgram = debugUtils.ArchitectureReplacer.checkAndReplaceWSLPipeProgram(newPipeProgramStr, debugUtils.ArchType.ia32);
}
if (replacedPipeProgram) {
config.pipeTransport.pipeProgram = replacedPipeProgram;
}
}
}
// if config or type is not specified, return null to trigger VS Code to open a configuration file https://github.com/Microsoft/vscode/issues/54213
return config && config.type ? config : null;
}
private static async showFileWarningAsync(message: string, fileName: string) : Promise<void> {
const openItem: vscode.MessageItem = { title: 'Open envFile' };
let result: vscode.MessageItem = await vscode.window.showWarningMessage(message, openItem);
if (result && result.title === openItem.title) {
let doc: vscode.TextDocument = await vscode.workspace.openTextDocument(fileName);
if (doc) {
vscode.window.showTextDocument(doc);
}
}
}
}
export class CppVsDbgConfigurationProvider extends CppConfigurationProvider {
@@ -45,7 +263,7 @@ export class CppVsDbgConfigurationProvider extends CppConfigurationProvider {
}
export class CppDbgConfigurationProvider extends CppConfigurationProvider {
public constructor(provider: IConfigurationAssetProvider) {
public constructor(provider: IConfigurationAssetProvider) {
super(provider, DebuggerType.cppdbg);
}
}
@@ -75,13 +293,13 @@ abstract class DefaultConfigurationProvider implements IConfigurationAssetProvid
public getInitialConfigurations(debuggerType: DebuggerType): any {
let configurationSnippet: IConfigurationSnippet[] = [];
// Only launch configurations are initial configurations
this.configurations.forEach(configuration => {
configurationSnippet.push(configuration.GetLaunchConfiguration());
configurationSnippet.push(configuration.GetLaunchConfiguration());
});
let initialConfigurations: any = configurationSnippet.filter(snippet => snippet.debuggerType == debuggerType && snippet.isInitialConfiguration)
let initialConfigurations: any = configurationSnippet.filter(snippet => snippet.debuggerType === debuggerType && snippet.isInitialConfiguration)
.map(snippet => JSON.parse(snippet.bodyText));
// If configurations is empty, then it will only have an empty configurations array in launch.json. Users can still add snippets.
@@ -115,7 +333,7 @@ class WindowsConfigurationProvider extends DefaultConfigurationProvider {
constructor() {
super();
this.configurations = [
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new PipeTransportConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new WindowsConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new WSLConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
@@ -131,7 +349,7 @@ class OSXConfigurationProvider extends DefaultConfigurationProvider {
constructor() {
super();
this.configurations = [
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram),
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram),
];
}
}
@@ -151,7 +369,7 @@ class LinuxConfigurationProvider extends DefaultConfigurationProvider {
constructor() {
super();
this.configurations = [
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new MIConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock),
new PipeTransportConfigurations(this.MIMode, this.executable, this.pipeProgram, this.setupCommandsBlock)
];
}
@@ -194,7 +412,7 @@ export class ConfigurationSnippetProvider implements vscode.CompletionItemProvid
items.map((item) => {
item.insertText = item.insertText + ','; // Add comma
});
});
}
return Promise.resolve(new vscode.CompletionList(items, true));
+27 -25
View File
@@ -31,7 +31,7 @@ function formatString(format: string, args: string[]): string {
return format;
}
function CreateLaunchString(name: string, type: string, executable: string): string {
function createLaunchString(name: string, type: string, executable: string): string {
return `"name": "${name}",
"type": "${type}",
"request": "launch",
@@ -44,7 +44,7 @@ function CreateLaunchString(name: string, type: string, executable: string): str
`;
}
function CreateAttachString(name: string, type: string, executable: string): string {
function createAttachString(name: string, type: string, executable: string): string {
return formatString(`
"name": "${name}",
"type": "${type}",
@@ -53,7 +53,7 @@ function CreateAttachString(name: string, type: string, executable: string): str
`, [type === "cppdbg" ? `${os.EOL}"program": "${"enter program name, for example $\{workspaceFolder\}/" + executable}",` : ""]);
}
function CreateRemoteAttachString(name: string, type: string, executable: string): string {
function createRemoteAttachString(name: string, type: string, executable: string): string {
return `
"name": "${name}",
"type": "${type}",
@@ -63,12 +63,12 @@ function CreateRemoteAttachString(name: string, type: string, executable: string
`;
}
function CreatePipeTransportString(pipeProgram: string, debuggerProgram: string): string {
function createPipeTransportString(pipeProgram: string, debuggerProgram: string, pipeArgs: string[] = []): string {
return `
"pipeTransport": {
\t"debuggerPath": "/usr/bin/${debuggerProgram}",
\t"pipeProgram": "${pipeProgram}",
\t"pipeArgs": [],
\t"pipeArgs": ${JSON.stringify(pipeArgs)},
\t"pipeCwd": ""
}`;
}
@@ -106,7 +106,7 @@ export class MIConfigurations extends Configuration {
let name: string = `(${this.MIMode}) Launch`;
let body: string = formatString(`{
\t${indentJsonString(CreateLaunchString(name, this.miDebugger, this.executable))},
\t${indentJsonString(createLaunchString(name, this.miDebugger, this.executable))},
\t"MIMode": "${this.MIMode}"{0}{1}
}`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : "",
this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
@@ -124,9 +124,10 @@ this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalPrope
let name: string = `(${this.MIMode}) Attach`;
let body: string = formatString(`{
\t${indentJsonString(CreateAttachString(name, this.miDebugger, this.executable))},
\t"MIMode": "${this.MIMode}"{0}
}`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : ""]);
\t${indentJsonString(createAttachString(name, this.miDebugger, this.executable))},
\t"MIMode": "${this.MIMode}"{0}{1}
}`, [this.miDebugger === "cppdbg" && os.platform() === "win32" ? `,${os.EOL}\t"miDebuggerPath": "/path/to/gdb"` : "",
this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
return {
"label": this.snippetPrefix + name,
@@ -145,8 +146,8 @@ export class PipeTransportConfigurations extends Configuration {
let body: string = formatString(`
{
\t${indentJsonString(CreateLaunchString(name, this.miDebugger, this.executable))},
\t${indentJsonString(CreatePipeTransportString(this.pipeProgram, this.MIMode))},
\t${indentJsonString(createLaunchString(name, this.miDebugger, this.executable))},
\t${indentJsonString(createPipeTransportString(this.pipeProgram, this.MIMode))},
\t"MIMode": "${this.MIMode}"{0}
}`, [this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
@@ -162,12 +163,12 @@ export class PipeTransportConfigurations extends Configuration {
public GetAttachConfiguration(): IConfigurationSnippet {
let name: string = `(${this.MIMode}) Pipe Attach`;
let body: string = `
let body: string = formatString(`
{
\t${indentJsonString(CreateRemoteAttachString(name, this.miDebugger, this.executable))},
\t${indentJsonString(CreatePipeTransportString(this.pipeProgram, this.MIMode))},
\t"MIMode": "${this.MIMode}"
}`;
\t${indentJsonString(createRemoteAttachString(name, this.miDebugger, this.executable))},
\t${indentJsonString(createPipeTransportString(this.pipeProgram, this.MIMode))},
\t"MIMode": "${this.MIMode}"{0}
}`, [this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
return {
"label": this.snippetPrefix + name,
"description": `Pipe Attach with ${this.MIMode}.`,
@@ -185,7 +186,7 @@ export class WindowsConfigurations extends Configuration {
let body: string = `
{
\t${indentJsonString(CreateLaunchString(name, this.windowsDebugger, this.executable))}
\t${indentJsonString(createLaunchString(name, this.windowsDebugger, this.executable))}
}`;
return {
@@ -203,7 +204,7 @@ export class WindowsConfigurations extends Configuration {
let body: string = `
{
\t${indentJsonString(CreateAttachString(name, this.windowsDebugger, this.executable))}
\t${indentJsonString(createAttachString(name, this.windowsDebugger, this.executable))}
}`;
return {
@@ -217,15 +218,16 @@ export class WindowsConfigurations extends Configuration {
}
export class WSLConfigurations extends Configuration {
public bashPipeProgram = "C:\\\\Windows\\\\sysnative\\\\bash.exe";
// Detects if the current VSCode is 32-bit and uses the correct bash.exe
public bashPipeProgram = process.arch === 'ia32' ? "${env:windir}\\\\sysnative\\\\bash.exe" : "${env:windir}\\\\system32\\\\bash.exe";
public GetLaunchConfiguration(): IConfigurationSnippet {
let name: string = `(${this.MIMode}) Bash on Windows Launch`;
let body: string = formatString(`
{
\t${indentJsonString(CreateLaunchString(name, this.miDebugger, this.executable))},
\t${indentJsonString(CreatePipeTransportString(this.bashPipeProgram, this.MIMode))}{0}
\t${indentJsonString(createLaunchString(name, this.miDebugger, this.executable))},
\t${indentJsonString(createPipeTransportString(this.bashPipeProgram, this.MIMode, ["-c"]))}{0}
}`, [this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
return {
@@ -239,11 +241,11 @@ export class WSLConfigurations extends Configuration {
public GetAttachConfiguration(): IConfigurationSnippet {
let name: string = `(${this.MIMode}) Bash on Windows Attach`;
let body: string = `
let body: string = formatString(`
{
\t${indentJsonString(CreateAttachString(name, this.miDebugger, this.executable))},
\t${indentJsonString(CreatePipeTransportString(this.bashPipeProgram, this.MIMode))}
}`;
\t${indentJsonString(createRemoteAttachString(name, this.miDebugger, this.executable))},
\t${indentJsonString(createPipeTransportString(this.bashPipeProgram, this.MIMode, ["-c"]))}{0}
}`, [this.additionalProperties ? `,${os.EOL}\t${indentJsonString(this.additionalProperties)}` : ""]);
return {
"label": this.snippetPrefix + name,
@@ -0,0 +1,74 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from "vscode";
import * as util from '../common';
import * as path from 'path';
import * as os from 'os';
// Registers DebugAdapterDescriptorFactory for `cppdbg` and `cppvsdbg`. If it is not ready, it will prompt a wait for the download dialog.
// NOTE: This file is not automatically tested.
abstract class AbstractDebugAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactory {
protected readonly context: vscode.ExtensionContext;
// This is important for the Mock Debugger since it can not use src/common
constructor(context: vscode.ExtensionContext) {
this.context = context;
}
abstract createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult<vscode.DebugAdapterDescriptor>;
}
export class CppdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory {
public static DEBUG_TYPE : string = "cppdbg";
constructor(context: vscode.ExtensionContext) {
super(context);
}
createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
return util.isExtensionReady().then(ready => {
if (ready) {
let command: string = path.join(this.context.extensionPath, './debugAdapters/OpenDebugAD7');
// Windows has the exe in debugAdapters/bin.
if (os.platform() === 'win32') {
command = path.join(this.context.extensionPath, "./debugAdapters/bin/OpenDebugAD7.exe");
}
return new vscode.DebugAdapterExecutable(command, []);
} else {
throw new Error(util.extensionNotReadyString);
}
});
}
}
export class CppvsdbgDebugAdapterDescriptorFactory extends AbstractDebugAdapterDescriptorFactory {
public static DEBUG_TYPE : string = "cppvsdbg";
constructor(context: vscode.ExtensionContext) {
super(context);
}
createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult<vscode.DebugAdapterDescriptor> {
if (os.platform() !== 'win32') {
vscode.window.showErrorMessage("Debugger type 'cppvsdbg' is not avaliable for non-Windows machines.");
return null;
} else {
return util.isExtensionReady().then(ready => {
if (ready) {
return new vscode.DebugAdapterExecutable(
path.join(this.context.extensionPath, './debugAdapters/vsdbg/bin/vsdbg.exe'),
['--interpreter=vscode']
);
} else {
throw new Error(util.extensionNotReadyString);
}
});
}
}
}
+100 -50
View File
@@ -7,14 +7,19 @@ import * as vscode from 'vscode';
import * as os from 'os';
import { AttachPicker, RemoteAttachPicker, AttachItemsProvider } from './attachToProcess';
import { NativeAttachItemsProviderFactory } from './nativeAttach';
import { ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider';
import { QuickPickConfigurationProvider, ConfigurationAssetProviderFactory, CppVsDbgConfigurationProvider, CppDbgConfigurationProvider, ConfigurationSnippetProvider, IConfigurationAssetProvider } from './configurationProvider';
import { CppdbgDebugAdapterDescriptorFactory, CppvsdbgDebugAdapterDescriptorFactory } from './debugAdapterDescriptorFactory';
import * as util from '../common';
import * as path from 'path';
import * as Telemetry from '../telemetry';
// The extension deactivate method is asynchronous, so we handle the disposables ourselves instead of using extensonContext.subscriptions.
let disposables: vscode.Disposable[] = [];
export function initialize(): void {
export function buildAndDebugActiveFileStr(): string {
return " build and debug active file";
}
export function initialize(context: vscode.ExtensionContext): void {
// Activate Process Picker Commands
let attachItemsProvider: AttachItemsProvider = NativeAttachItemsProviderFactory.Get();
let attacher: AttachPicker = new AttachPicker(attachItemsProvider);
@@ -26,68 +31,113 @@ export function initialize(): void {
let configurationProvider: IConfigurationAssetProvider = ConfigurationAssetProviderFactory.getConfigurationProvider();
// On non-windows platforms, the cppvsdbg debugger will not be registered for initial configurations.
// This will cause it to not show up on the dropdown list.
let vsdbgProvider: CppVsDbgConfigurationProvider = null;
if (os.platform() === 'win32') {
disposables.push(vscode.debug.registerDebugConfigurationProvider('cppvsdbg', new CppVsDbgConfigurationProvider(configurationProvider)));
vsdbgProvider = new CppVsDbgConfigurationProvider(configurationProvider);
disposables.push(vscode.debug.registerDebugConfigurationProvider('cppvsdbg', new QuickPickConfigurationProvider(vsdbgProvider)));
}
disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new CppDbgConfigurationProvider(configurationProvider)));
const provider: CppDbgConfigurationProvider = new CppDbgConfigurationProvider(configurationProvider);
disposables.push(vscode.debug.registerDebugConfigurationProvider('cppdbg', new QuickPickConfigurationProvider(provider)));
disposables.push(vscode.commands.registerTextEditorCommand("C_Cpp.BuildAndDebugActiveFile", async (textEditor: vscode.TextEditor, edit: vscode.TextEditorEdit, ...args: any[]) => {
const folder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(textEditor.document.uri);
if (!folder) {
// Not enabled because we do not react to single-file mode correctly yet.
// We get an ENOENT when the user's c_cpp_properties.json is attempted to be parsed.
// The DefaultClient will also have its configuration accessed, but since it doesn't exist it errors out.
vscode.window.showErrorMessage('This command is not yet available for single-file mode.');
return Promise.resolve();
}
if (!util.fileIsCOrCppSource(textEditor.document.uri.fsPath)) {
vscode.window.showErrorMessage('Cannot build and debug because the active file is not a C or C++ source file.');
return Promise.resolve();
}
let configs: vscode.DebugConfiguration[] = (await provider.provideDebugConfigurations(folder)).filter(config => {
return config.name.indexOf(buildAndDebugActiveFileStr()) !== -1;
});
if (vsdbgProvider) {
let vsdbgConfigs: vscode.DebugConfiguration[] = (await vsdbgProvider.provideDebugConfigurations(folder)).filter(config => {
return config.name.indexOf(buildAndDebugActiveFileStr()) !== -1;
});
if (vsdbgConfigs) {
configs.push(...vsdbgConfigs);
}
}
interface MenuItem extends vscode.QuickPickItem {
configuration: vscode.DebugConfiguration;
}
const items: MenuItem[] = configs.map<MenuItem>(config => {
return {label: config.name, configuration: config};
});
vscode.window.showQuickPick(items, {placeHolder: (items.length === 0 ? "No compiler found" : "Select a compiler" )}).then(async selection => {
if (!selection) {
return; // User canceled it.
}
if (selection.label.startsWith("cl.exe")) {
if (!process.env.DevEnvDir || process.env.DevEnvDir.length === 0) {
vscode.window.showErrorMessage('cl.exe build and debug is only usable when VS Code is run from the Developer Command Prompt for VS.');
return;
}
}
if (selection.configuration.preLaunchTask) {
if (folder) {
try {
await util.ensureBuildTaskExists(selection.configuration.preLaunchTask);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
} catch (e) {
if (e && e.message === util.failedToParseTasksJson) {
vscode.window.showErrorMessage(util.failedToParseTasksJson);
}
return Promise.resolve();
}
} else {
return Promise.resolve();
// TODO uncomment this when single file mode works correctly.
// const buildTasks: vscode.Task[] = await getBuildTasks(true);
// const task: vscode.Task = buildTasks.find(task => task.name === selection.configuration.preLaunchTask);
// await vscode.tasks.executeTask(task);
// delete selection.configuration.preLaunchTask;
}
}
// Attempt to use the user's (possibly) modified configuration before using the generated one.
try {
await vscode.debug.startDebugging(folder, selection.configuration.name);
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "true" });
} catch (e) {
try {
vscode.debug.startDebugging(folder, selection.configuration);
} catch (e) {
Telemetry.logDebuggerEvent("buildAndDebug", { "success": "false" });
}
}
});
}));
configurationProvider.getConfigurationSnippets();
const launchJsonDocumentSelector: vscode.DocumentSelector = [{
scheme: 'file',
language: 'jsonc',
pattern: '**/launch.json'
}];
// ConfigurationSnippetProvider needs to be initiallized after configurationProvider calls getConfigurationSnippets.
disposables.push(vscode.languages.registerCompletionItemProvider(launchJsonDocumentSelector, new ConfigurationSnippetProvider(configurationProvider)));
// Activate Adapter Commands
registerAdapterExecutableCommands();
// Register Debug Adapters
disposables.push(vscode.debug.registerDebugAdapterDescriptorFactory(CppvsdbgDebugAdapterDescriptorFactory.DEBUG_TYPE, new CppvsdbgDebugAdapterDescriptorFactory(context)));
disposables.push(vscode.debug.registerDebugAdapterDescriptorFactory(CppdbgDebugAdapterDescriptorFactory.DEBUG_TYPE, new CppdbgDebugAdapterDescriptorFactory(context)));
vscode.Disposable.from(...disposables);
}
export function dispose(): void {
disposables.forEach(d => d.dispose());
}
// Registers adapterExecutableCommands for cppdbg and cppvsdbg. If it is not ready, it will prompt waiting for the download.
//
// Note: util.extensionContext.extensionPath is needed for the commands because VsCode does not support relative paths for adapterExecutableComand
function registerAdapterExecutableCommands(): void {
disposables.push(vscode.commands.registerCommand('extension.cppdbgAdapterExecutableCommand', () => {
return util.isExtensionReady().then(ready => {
if (ready) {
let command: string = path.join(util.extensionContext.extensionPath, './debugAdapters/OpenDebugAD7');
// Windows has the exe in debugAdapters/bin.
if (os.platform() === 'win32') {
command = path.join(util.extensionContext.extensionPath, "./debugAdapters/bin/OpenDebugAD7.exe");
}
return {
command: command
};
} else {
throw new Error(util.extensionNotReadyString);
}
});
}));
disposables.push(vscode.commands.registerCommand('extension.cppvsdbgAdapterExecutableCommand', () => {
if (os.platform() != 'win32') {
vscode.window.showErrorMessage("Debugger type 'cppvsdbg' is not avaliable for non-Windows machines.");
return null;
} else {
return util.isExtensionReady().then(ready => {
if (ready) {
return {
command: path.join(util.extensionContext.extensionPath, './debugAdapters/vsdbg/bin/vsdbg.exe'),
args: ['--interpreter=vscode']
};
} else {
throw new Error(util.extensionNotReadyString);
}
});
}
}));
}
}
+8 -7
View File
@@ -5,7 +5,8 @@
import * as child_process from 'child_process';
import * as os from 'os';
import { AttachItem, AttachItemsProvider } from './attachToProcess';
import { AttachItemsProvider } from './attachToProcess';
import { AttachItem } from './attachQuickPick';
class Process {
constructor(public name: string, public pid: string, public commandLine: string) { }
@@ -38,18 +39,18 @@ abstract class NativeAttachItemsProvider implements AttachItemsProvider {
// localeCompare is significantly slower than < and > (2000 ms vs 80 ms for 10,000 elements)
// We can change to localeCompare if this becomes an issue
processEntries.sort((a, b) => {
if (a.name == undefined) {
if (b.name == undefined) {
if (a.name === undefined) {
if (b.name === undefined) {
return 0;
}
return 1;
}
if (b.name == undefined) {
if (b.name === undefined) {
return -1;
}
let aLower: string = a.name.toLowerCase();
let bLower: string = b.name.toLowerCase();
if (aLower == bLower) {
if (aLower === bLower) {
return 0;
}
return aLower < bLower ? -1 : 1;
@@ -111,8 +112,8 @@ export class PsProcessParser {
// Note that comm on Linux systems is truncated to 16 characters:
// https://bugzilla.redhat.com/show_bug.cgi?id=429565
// Since 'args' contains the full path to the executable, even if truncated, searching will work as desired.
public static get psLinuxCommand(): string { return `ps -axww -o pid=,comm=${PsProcessParser.commColumnTitle},args=`; }
public static get psDarwinCommand(): string { return `ps -axww -o pid=,comm=${PsProcessParser.commColumnTitle},args= -c`; }
public static get psLinuxCommand(): string { return `ps axww -o pid=,comm=${PsProcessParser.commColumnTitle},args=`; }
public static get psDarwinCommand(): string { return `ps axww -o pid=,comm=${PsProcessParser.commColumnTitle},args= -c`; }
// Only public for tests.
public static ParseProcessFromPs(processes: string): Process[] {
+49
View File
@@ -0,0 +1,49 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
export enum ArchType {
ia32,
x64
}
export class ArchitectureReplacer {
public static checkAndReplaceWSLPipeProgram(pipeProgramStr: string, expectedArch: ArchType): string {
let replacedPipeProgram: string = null;
const winDir: string = process.env.WINDIR ? process.env.WINDIR.toLowerCase() : null;
const winDirAltDirSep: string = process.env.WINDIR ? process.env.WINDIR.replace('\\', '/').toLowerCase() : null;
const winDirEnv: string = "${env:windir}";
if (winDir && winDirAltDirSep && (pipeProgramStr.indexOf(winDir) === 0 || pipeProgramStr.indexOf(winDirAltDirSep) === 0 || pipeProgramStr.indexOf(winDirEnv) === 0)) {
if (expectedArch === ArchType.x64) {
const pathSep: string = ArchitectureReplacer.checkForFolderInPath(pipeProgramStr, "sysnative");
if (pathSep) {
// User has sysnative but we expect 64 bit. Should be using System32 since sysnative is a 32bit concept.
replacedPipeProgram = pipeProgramStr.replace(`${pathSep}sysnative${pathSep}`, `${pathSep}system32${pathSep}`);
}
} else if (expectedArch === ArchType.ia32) {
const pathSep: string = ArchitectureReplacer.checkForFolderInPath(pipeProgramStr, "system32");
if (pathSep) {
// User has System32 but we expect 32 bit. Should be using sysnative
replacedPipeProgram = pipeProgramStr.replace(`${pathSep}system32${pathSep}`, `${pathSep}sysnative${pathSep}`);
}
}
}
return replacedPipeProgram;
}
// Checks to see if the folder name is in the path using both win and unix style path seperators.
// Returns the path seperator it detected if the folder is in the path.
// Or else it returns empty string to indicate it did not find it in the path.
public static checkForFolderInPath(path: string, folder: string): string {
if (path.indexOf(`/${folder}/`) >= 0) {
return '/';
} else if (path.indexOf(`\\${folder}\\`) >= 0) {
return '\\';
}
return "";
}
}
File diff suppressed because it is too large Load Diff
@@ -8,6 +8,8 @@ import * as vscode from 'vscode';
import * as util from '../common';
import * as telemetry from '../telemetry';
import * as cpptools from './client';
import * as path from 'path';
import { getCustomConfigProviders } from './customProviders';
const defaultClientKey: string = "@@default@@";
export interface ClientKey {
@@ -82,7 +84,7 @@ export class ClientCollection {
public checkOwnership(client: cpptools.Client, document: vscode.TextDocument): boolean {
let owners: cpptools.Client[] = [];
this.languageClients.forEach(languageClient => {
if (document.uri.fsPath.startsWith(languageClient.RootPath)) {
if (document.uri.fsPath.startsWith(languageClient.RootPath + path.sep)) {
owners.push(languageClient);
}
});
@@ -117,7 +119,7 @@ export class ClientCollection {
this.languageClients.set(key, cpptools.createNullClient());
}
if (this.activeClient === client) {
if (this.activeClient === client && this.activeDocument) {
this.activeClient = this.getClientFor(this.activeDocument.uri);
this.activeClient.activeDocumentChanged(this.activeDocument);
}
@@ -152,12 +154,12 @@ export class ClientCollection {
client.TrackedDocuments.forEach(document => this.transferOwnership(document, client));
client.TrackedDocuments.clear();
if (this.activeClient === client) {
if (this.activeClient === client && this.activeDocument) {
// Need to make a different client the active client.
this.activeClient = this.getClientFor(this.activeDocument.uri);
this.activeClient.activeDocumentChanged(this.activeDocument);
// may not need this, the navigation UI should not have changed.
// this.activeClient.selectionChanged(vscode.window.activeTextEditor.selection.start);
// this.activeClient.selectionChanged(Range.create(vscode.window.activeTextEditor.selection.start, vscode.window.activeTextEditor.selection.end);
}
client.dispose();
@@ -173,7 +175,8 @@ export class ClientCollection {
}
private onDidOpenTextDocument(document: vscode.TextDocument): void {
if (document.languageId === "c" || document.languageId === "cpp") {
if (document.languageId === "c" || document.languageId === "cpp"
|| document.languageId === "json" && document.uri.fsPath.endsWith("c_cpp_properties.json")) {
// Make sure a client exists for this document's workspace.
this.getClientFor(document.uri);
}
@@ -186,7 +189,9 @@ export class ClientCollection {
} else {
let key: string = util.asFolder(folder.uri);
if (!this.languageClients.has(key)) {
this.languageClients.set(key, cpptools.createClient(this, folder));
let newClient: cpptools.Client = cpptools.createClient(this, folder);
this.languageClients.set(key, newClient);
getCustomConfigProviders().forEach(provider => newClient.onRegisterCustomConfigurationProvider(provider));
}
return this.languageClients.get(key);
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,215 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as vscode from 'vscode';
import { CustomConfigurationProvider, Version, SourceFileConfigurationItem, WorkspaceBrowseConfiguration } from 'vscode-cpptools';
import { CppSettings } from './settings';
/**
* An interface that is guaranteed to be backward compatible with version 0
*/
export interface CustomConfigurationProvider1 extends CustomConfigurationProvider {
isReady: boolean;
readonly isValid: boolean;
readonly version: Version;
}
/**
* Wraps the incoming CustomConfigurationProvider so that we can treat all of them as if they were the same version (e.g. latest)
*/
class CustomProviderWrapper implements CustomConfigurationProvider1 {
private provider: CustomConfigurationProvider;
private _isReady: boolean;
private _version: Version;
constructor(provider: CustomConfigurationProvider, version: Version) {
this._isReady = version < Version.v2;
this.provider = provider;
if (provider.extensionId && version === Version.v0) {
version = Version.v1; // provider implemented the new API but is interfacing with the extension using the old API version.
}
this._version = version;
}
public get isReady(): boolean {
return this._isReady;
}
public set isReady(ready: boolean) {
this._isReady = ready;
}
public get isValid(): boolean {
let valid: boolean = !!(this.provider.name && this.provider.canProvideConfiguration && this.provider.provideConfigurations);
if (valid && this._version > Version.v0) {
valid = !!(this.provider.extensionId && this.provider.dispose);
}
if (valid && this._version > Version.v1) {
valid = !!(this.provider.canProvideBrowseConfiguration && this.provider.provideBrowseConfiguration);
}
return valid;
}
public get version(): Version {
return this._version;
}
public get name(): string {
return this.provider.name;
}
public get extensionId(): string {
return this._version === Version.v0 ? this.provider.name : this.provider.extensionId;
}
public canProvideConfiguration(uri: vscode.Uri, token?: vscode.CancellationToken): Thenable<boolean> {
return this.provider.canProvideConfiguration(uri, token);
}
public provideConfigurations(uris: vscode.Uri[], token?: vscode.CancellationToken): Thenable<SourceFileConfigurationItem[]> {
return this.provider.provideConfigurations(uris, token);
}
public canProvideBrowseConfiguration(token?: vscode.CancellationToken): Thenable<boolean> {
return this._version < Version.v2 ? Promise.resolve(false) : this.provider.canProvideBrowseConfiguration(token);
}
public provideBrowseConfiguration(token?: vscode.CancellationToken): Thenable<WorkspaceBrowseConfiguration> {
console.assert(this._version >= Version.v2);
return this._version < Version.v2 ? Promise.resolve({browsePath: []}) : this.provider.provideBrowseConfiguration(token);
}
public dispose(): void {
if (this._version !== Version.v0) {
this.provider.dispose();
}
}
}
export class CustomConfigurationProviderCollection {
private providers: Map<string, CustomProviderWrapper> = new Map<string, CustomProviderWrapper>();
private logProblems(provider: CustomConfigurationProvider, version: Version): void {
let missing: string[] = [];
if (!provider.name) {
missing.push("'name'");
}
if (version !== Version.v0 && !provider.extensionId) {
missing.push("'extensionId'");
}
if (!provider.canProvideConfiguration) {
missing.push("'canProvideConfiguration'");
}
if (!provider.provideConfigurations) {
missing.push("'canProvideConfiguration'");
}
if (version !== Version.v0 && !provider.dispose) {
missing.push("'dispose'");
}
if (version >= Version.v2 && !provider.canProvideBrowseConfiguration) {
missing.push("'canProvideBrowseConfiguration'");
}
if (version >= Version.v2 && !provider.provideBrowseConfiguration) {
missing.push("'provideBrowseConfiguration'");
}
console.error(`CustomConfigurationProvider was not registered. The following properties are missing from the implementation: ${missing.join(", ")}.`);
}
private getId(provider: string|CustomConfigurationProvider): string {
if (typeof provider === "string") {
return provider;
} else if (provider.extensionId) {
return provider.extensionId;
} else if (provider.name) {
return provider.name;
} else {
console.error(`invalid provider: ${provider}`);
return "";
}
}
public get size(): number {
return this.providers.size;
}
public add(provider: CustomConfigurationProvider, version: Version): boolean {
if (new CppSettings().intelliSenseEngine === "Disabled") {
console.warn("IntelliSense is disabled. Provider will not be registered.");
return false;
}
let wrapper: CustomProviderWrapper = new CustomProviderWrapper(provider, version);
if (!wrapper.isValid) {
this.logProblems(provider, version);
return false;
}
let exists: boolean = this.providers.has(wrapper.extensionId);
if (exists) {
let existing: CustomProviderWrapper = this.providers.get(wrapper.extensionId);
exists = (existing.version === Version.v0 && wrapper.version === Version.v0);
}
if (!exists) {
this.providers.set(wrapper.extensionId, wrapper);
} else {
console.error(`CustomConfigurationProvider '${wrapper.extensionId}' has already been registered.`);
}
return !exists;
}
public get(provider: string|CustomConfigurationProvider): CustomConfigurationProvider1|null {
let id: string = this.getId(provider);
if (this.providers.has(id)) {
return this.providers.get(id);
}
return null;
}
public forEach(func: (provider: CustomConfigurationProvider1) => void): void {
this.providers.forEach(provider => func(provider));
}
public remove(provider: CustomConfigurationProvider): void {
let id: string = this.getId(provider);
if (this.providers.has(id)) {
this.providers.delete(id);
} else {
console.warn(`${id} is not registered`);
}
}
public checkId(providerId?: string): string {
if (!providerId) {
return providerId;
}
let found: CustomConfigurationProvider1[] = [];
let noUpdate: boolean = false;
this.forEach(provider => {
if (provider.extensionId === providerId) {
noUpdate = true;
} else if (provider.name === providerId && provider.version !== Version.v0) {
found.push(provider);
}
});
if (noUpdate) {
return providerId;
}
if (found.length === 1) {
return found[0].extensionId;
} else if (found.length > 1) {
console.warn("duplicate provider name found. Not upgrading.");
}
return providerId;
}
}
let providerCollection: CustomConfigurationProviderCollection = new CustomConfigurationProviderCollection();
export function getCustomConfigProviders(): CustomConfigurationProviderCollection {
return providerCollection;
}
+686 -98
View File
@@ -6,6 +6,7 @@
import * as path from 'path';
import * as vscode from 'vscode';
import * as os from 'os';
import * as fs from 'fs';
import * as util from '../common';
import * as telemetry from '../telemetry';
@@ -13,54 +14,42 @@ import { UI, getUI } from './ui';
import { Client } from './client';
import { ClientCollection } from './clientCollection';
import { CppSettings } from './settings';
import { PersistentWorkspaceState } from './persistentState';
import * as os from 'os';
import { PersistentWorkspaceState, PersistentState } from './persistentState';
import { getLanguageConfig } from './languageConfig';
import { getCustomConfigProviders } from './customProviders';
import { PlatformInformation } from '../platform';
import { Range } from 'vscode-languageclient';
import { ChildProcess, spawn, execSync } from 'child_process';
import * as tmp from 'tmp';
import { getTargetBuildInfo, BuildInfo } from '../githubAPI';
import * as configs from './configurations';
import { PackageVersion } from '../packageVersion';
import { getTemporaryCommandRegistrarInstance } from '../commands';
let prevCrashFile: string;
let clients: ClientCollection;
let activeDocument: string;
let ui: UI;
let disposables: vscode.Disposable[] = [];
let languageConfigurations: vscode.Disposable[] = [];
let intervalTimer: NodeJS.Timer;
let insiderUpdateTimer: NodeJS.Timer;
let realActivationOccurred: boolean = false;
let tempCommands: vscode.Disposable[] = [];
let activatedPreviously: PersistentWorkspaceState<boolean>;
// Add ' * ' on new lines after multiline comment with '/**' started
// Copied from vscode/extensions/typescript/src/typescriptMain.ts
const multilineCommentRules: any = {
onEnterRules: [
{
// e.g. /** | */
beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
afterText: /^\s*\*\/$/,
action: { indentAction: vscode.IndentAction.IndentOutdent, appendText: ' * ' }
}, {
// e.g. /** ...|
beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,
action: { indentAction: vscode.IndentAction.None, appendText: ' * ' }
}, {
// e.g. * ...|
beforeText: /^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,
action: { indentAction: vscode.IndentAction.None, appendText: '* ' }
}, {
// e.g. */|
beforeText: /^(\t|(\ \ ))*\ \*\/\s*$/,
action: { indentAction: vscode.IndentAction.None, removeText: 1 }
},
{
// e.g. *-----*/|
beforeText: /^(\t|(\ \ ))*\ \*[^/]*\*\/\s*$/,
action: { indentAction: vscode.IndentAction.None, removeText: 1 }
}
]
};
const insiderUpdateTimerInterval: number = 1000 * 60 * 60;
let buildInfoCache: BuildInfo | null = null;
const taskSourceStr: string = "C/C++";
const cppInstallVsixStr: string = 'C/C++: Install vsix -- ';
let taskProvider: vscode.Disposable;
/**
* activate: set up the extension for language services
*/
export function activate(activationEventOccurred: boolean): void {
console.log("activating extension");
if (realActivationOccurred) {
return; // Occurs if multiple delayed commands occur before the real commands are registered.
}
// Activate immediately if an activation event occurred in the previous workspace session.
// If onActivationEvent doesn't occur, it won't auto-activate next time.
@@ -69,23 +58,202 @@ export function activate(activationEventOccurred: boolean): void {
activatedPreviously.Value = false;
realActivation();
}
registerCommands();
tempCommands.push(vscode.workspace.onDidOpenTextDocument(d => onDidOpenTextDocument(d)));
if (tempCommands.length === 0) { // Only needs to be added once.
tempCommands.push(vscode.workspace.onDidOpenTextDocument(d => onDidOpenTextDocument(d)));
}
// Check if an activation event has already occurred.
if (activationEventOccurred) {
return onActivationEvent();
onActivationEvent();
return;
}
if (vscode.workspace.textDocuments !== undefined && vscode.workspace.textDocuments.length > 0) {
for (let i: number = 0; i < vscode.workspace.textDocuments.length; ++i) {
let document: vscode.TextDocument = vscode.workspace.textDocuments[i];
if (document.languageId == "cpp" || document.languageId == "c") {
return onActivationEvent();
taskProvider = vscode.tasks.registerTaskProvider(taskSourceStr, {
provideTasks: () => {
return getBuildTasks(false);
},
resolveTask(task: vscode.Task): vscode.Task {
// Currently cannot implement because VS Code does not call this. Can implement custom output file directory when enabled.
return undefined;
}
});
vscode.tasks.onDidStartTask(event => {
if (event.execution.task.source === taskSourceStr) {
telemetry.logLanguageServerEvent('buildTaskStarted');
}
});
// handle "workspaceContains:/.vscode/c_cpp_properties.json" activation event.
if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) {
for (let i: number = 0; i < vscode.workspace.workspaceFolders.length; ++i) {
let config: string = path.join(vscode.workspace.workspaceFolders[i].uri.fsPath, ".vscode/c_cpp_properties.json");
if (fs.existsSync(config)) {
onActivationEvent();
return;
}
}
}
// handle "onLanguage:cpp" and "onLanguage:c" activation events.
if (vscode.workspace.textDocuments !== undefined && vscode.workspace.textDocuments.length > 0) {
for (let i: number = 0; i < vscode.workspace.textDocuments.length; ++i) {
let document: vscode.TextDocument = vscode.workspace.textDocuments[i];
if (document.languageId === "cpp" || document.languageId === "c") {
onActivationEvent();
return;
}
}
}
}
export interface BuildTaskDefinition extends vscode.TaskDefinition {
compilerPath: string;
}
/**
* Generate tasks to build the current file based on the user's detected compilers, the user's compilerPath setting, and the current file's extension.
*/
export async function getBuildTasks(returnComplerPath: boolean): Promise<vscode.Task[]> {
const editor: vscode.TextEditor = vscode.window.activeTextEditor;
if (!editor) {
return [];
}
const fileExt: string = path.extname(editor.document.fileName);
if (!fileExt) {
return;
}
// Don't offer tasks for header files.
const fileExtLower: string = fileExt.toLowerCase();
const isHeader: boolean = !fileExt || [".hpp", ".hh", ".hxx", ".h", ".inl", ""].some(ext => fileExtLower === ext);
if (isHeader) {
return [];
}
// Don't offer tasks if the active file's extension is not a recognized C/C++ extension.
let fileIsCpp: boolean;
let fileIsC: boolean;
if (fileExt === ".C") { // ".C" file extensions are both C and C++.
fileIsCpp = true;
fileIsC = true;
} else {
fileIsCpp = [".cpp", ".cc", ".cxx", ".mm", ".ino"].some(ext => fileExtLower === ext);
fileIsC = fileExtLower === ".c";
}
if (!(fileIsCpp || fileIsC)) {
return [];
}
// Get a list of compilers found from the C++ side, then filter them based on the file type to get a reduced list appropriate
// for the active file, remove duplicate compiler names, then finally add the user's compilerPath setting.
let compilerPaths: string[];
const isWindows: boolean = os.platform() === 'win32';
const activeClient: Client = getActiveClient();
let userCompilerPath: string = await activeClient.getCompilerPath();
if (userCompilerPath) {
userCompilerPath = userCompilerPath.trim();
if (isWindows && userCompilerPath.startsWith("/")) { // TODO: Add WSL compiler support.
userCompilerPath = null;
} else {
userCompilerPath = userCompilerPath.replace(/\\\\/g, "\\");
}
}
let knownCompilers: configs.KnownCompiler[] = await activeClient.getKnownCompilers();
if (knownCompilers) {
knownCompilers = knownCompilers.filter(info => {
return ((fileIsCpp && !info.isC) || (fileIsC && info.isC)) &&
(!isWindows || !info.path.startsWith("/")); // TODO: Add WSL compiler support.
});
compilerPaths = knownCompilers.map<string>(info => { return info.path; });
let map: Map<string, string> = new Map<string, string>();
const insertOrAssignEntry: (compilerPath: string) => void = (compilerPath: string): void => {
let basename: string = compilerPath;
if (compilerPath === userCompilerPath) {
// Make sure the compiler args are not part of the basename.
const compilerPathAndArgs: util.CompilerPathAndArgs = util.extractCompilerPathAndArgs(compilerPath);
basename = compilerPathAndArgs.compilerPath;
}
basename = path.basename(basename);
map.set(basename, compilerPath);
};
compilerPaths.forEach(insertOrAssignEntry);
// Ensure that the user's compilerPath setting is used by inserting/assigning last.
if (userCompilerPath) {
insertOrAssignEntry(userCompilerPath);
}
compilerPaths = [...map.values()];
} else if (userCompilerPath) {
compilerPaths = [userCompilerPath];
}
if (!compilerPaths) {
// Don't prompt a message yet until we can make a data-based decision.
telemetry.logLanguageServerEvent('noCompilerFound');
// Display a message prompting the user to install compilers if none were found.
// const dontShowAgain: string = "Don't Show Again";
// const learnMore: string = "Learn More";
// const message: string = "No C/C++ compiler found on the system. Please install a C/C++ compiler to use the C/C++: build active file tasks.";
// let showNoCompilerFoundMessage: PersistentState<boolean> = new PersistentState<boolean>("CPP.showNoCompilerFoundMessage", true);
// if (showNoCompilerFoundMessage) {
// vscode.window.showInformationMessage(message, learnMore, dontShowAgain).then(selection => {
// switch (selection) {
// case learnMore:
// const uri: vscode.Uri = vscode.Uri.parse(`https://go.microsoft.com/fwlink/?linkid=864631`);
// vscode.commands.executeCommand('vscode.open', uri);
// break;
// case dontShowAgain:
// showNoCompilerFoundMessage.Value = false;
// break;
// default:
// break;
// }
// });
// }
return [];
}
// Generate tasks.
return compilerPaths.map<vscode.Task>(compilerPath => {
// Handle compiler args in compilerPath.
let compilerPathAndArgs: util.CompilerPathAndArgs = util.extractCompilerPathAndArgs(compilerPath);
compilerPath = compilerPathAndArgs.compilerPath;
const filePath: string = path.join('${fileDirname}', '${fileBasenameNoExtension}');
const compilerPathBase: string = path.basename(compilerPath);
const taskName: string = compilerPathBase + " build active file";
const isCl: boolean = taskName.startsWith("cl.exe");
let args: string[] = isCl ? [ '/Zi', '/EHsc', '/Fe:', filePath + '.exe', '${file}' ] : ['-g', '${file}', '-o', filePath + (isWindows ? '.exe' : '')];
if (compilerPathAndArgs.additionalArgs) {
args = args.concat(compilerPathAndArgs.additionalArgs);
}
const cwd: string = isCl ? "" : path.dirname(compilerPath);
const kind: BuildTaskDefinition = {
type: 'shell',
label: taskName,
command: isCl ? compilerPathBase : compilerPath,
args: args,
options: isCl ? undefined : {"cwd": cwd},
compilerPath: isCl ? compilerPathBase : compilerPath
};
const command: vscode.ShellExecution = new vscode.ShellExecution(compilerPath, [...args], { cwd: cwd });
const target: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(clients.ActiveClient.RootUri);
let task: vscode.Task = new vscode.Task(kind, target, taskName, taskSourceStr, command, '$gcc');
task.definition = kind; // The constructor for vscode.Task will eat the definition. Reset it by reassigning.
task.group = vscode.TaskGroup.Build;
if (!returnComplerPath) {
delete task.definition.compilerPath;
}
return task;
});
}
function onDidOpenTextDocument(document: vscode.TextDocument): void {
@@ -95,7 +263,7 @@ function onDidOpenTextDocument(document: vscode.TextDocument): void {
}
function onActivationEvent(): void {
if (tempCommands.length == 0) {
if (tempCommands.length === 0) {
return;
}
@@ -111,6 +279,22 @@ function onActivationEvent(): void {
}
function realActivation(): void {
if (new CppSettings().intelliSenseEngine === "Disabled") {
throw new Error("Do not activate the extension when IntelliSense is disabled.");
} else {
console.log("activating extension");
let checkForConflictingExtensions: PersistentState<boolean> = new PersistentState<boolean>("CPP." + util.packageJson.version + ".checkForConflictingExtensions", true);
if (checkForConflictingExtensions.Value) {
checkForConflictingExtensions.Value = false;
let clangCommandAdapterActive: boolean = vscode.extensions.all.some((extension: vscode.Extension<any>, index: number, array: vscode.Extension<any>[]): boolean => {
return extension.isActive && extension.id === "mitaki28.vscode-clang";
});
if (clangCommandAdapterActive) {
telemetry.logLanguageServerEvent("conflictingExtension");
}
}
}
realActivationOccurred = true;
console.log("starting language server");
clients = new ClientCollection();
@@ -122,25 +306,60 @@ function realActivation(): void {
onDidChangeActiveTextEditor(vscode.window.activeTextEditor);
}
// There may have already been registered CustomConfigurationProviders.
// Request for configurations from those providers.
clients.forEach(client => {
getCustomConfigProviders().forEach(provider => client.onRegisterCustomConfigurationProvider(provider));
});
disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings));
disposables.push(vscode.workspace.onDidSaveTextDocument(onDidSaveTextDocument));
disposables.push(vscode.window.onDidChangeActiveTextEditor(onDidChangeActiveTextEditor));
disposables.push(vscode.window.onDidChangeTextEditorSelection(onDidChangeTextEditorSelection));
disposables.push(vscode.window.onDidChangeVisibleTextEditors(onDidChangeVisibleTextEditors));
disposables.push(vscode.languages.setLanguageConfiguration('c', multilineCommentRules));
disposables.push(vscode.languages.setLanguageConfiguration('cpp', multilineCommentRules));
updateLanguageConfigurations();
reportMacCrashes();
const settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri);
if (settings.updateChannel === 'Default') {
suggestInsidersChannel();
} else if (settings.updateChannel === 'Insiders') {
insiderUpdateTimer = setInterval(checkAndApplyUpdate, insiderUpdateTimerInterval, settings.updateChannel);
checkAndApplyUpdate(settings.updateChannel);
}
intervalTimer = setInterval(onInterval, 2500);
}
export function updateLanguageConfigurations(): void {
languageConfigurations.forEach(d => d.dispose());
languageConfigurations = [];
languageConfigurations.push(vscode.languages.setLanguageConfiguration('c', getLanguageConfig('c', clients.ActiveClient.RootUri)));
languageConfigurations.push(vscode.languages.setLanguageConfiguration('cpp', getLanguageConfig('cpp', clients.ActiveClient.RootUri)));
}
/*********************************************
* workspace events
*********************************************/
function onDidChangeSettings(): void {
const changedActiveClientSettings: { [key: string] : string } = clients.ActiveClient.onDidChangeSettings();
clients.forEach(client => client.onDidChangeSettings());
const newUpdateChannel: string = changedActiveClientSettings['updateChannel'];
if (newUpdateChannel) {
if (newUpdateChannel === 'Default') {
clearInterval(insiderUpdateTimer);
} else if (newUpdateChannel === 'Insiders') {
insiderUpdateTimer = setInterval(checkAndApplyUpdate, insiderUpdateTimerInterval);
}
checkAndApplyUpdate(newUpdateChannel);
}
}
let saveMessageShown: boolean = false;
@@ -163,12 +382,12 @@ function onDidChangeActiveTextEditor(editor: vscode.TextEditor): void {
}
let activeEditor: vscode.TextEditor = vscode.window.activeTextEditor;
if (!activeEditor || (activeEditor.document.languageId != "cpp" && activeEditor.document.languageId != "c")) {
if (!activeEditor || (activeEditor.document.languageId !== "cpp" && activeEditor.document.languageId !== "c")) {
activeDocument = "";
} else {
activeDocument = editor.document.uri.toString();
clients.activeDocumentChanged(editor.document);
clients.ActiveClient.selectionChanged(editor.selection.start);
clients.ActiveClient.selectionChanged(Range.create(editor.selection.start, editor.selection.end));
}
ui.activeDocumentChanged();
}
@@ -178,15 +397,19 @@ function onDidChangeTextEditorSelection(event: vscode.TextEditorSelectionChangeE
if (!event.textEditor || !vscode.window.activeTextEditor || event.textEditor.document.uri !== vscode.window.activeTextEditor.document.uri ||
(event.textEditor.document.languageId !== "cpp" && event.textEditor.document.languageId !== "c")) {
return;
}
}
if (activeDocument != event.textEditor.document.uri.toString()) {
if (activeDocument !== event.textEditor.document.uri.toString()) {
// For some strange (buggy?) reason we don't reliably get onDidChangeActiveTextEditor callbacks.
activeDocument = event.textEditor.document.uri.toString();
clients.activeDocumentChanged(event.textEditor.document);
ui.activeDocumentChanged();
}
clients.ActiveClient.selectionChanged(event.selections[0].start);
clients.ActiveClient.selectionChanged(Range.create(event.selections[0].start, event.selections[0].end));
}
function onDidChangeVisibleTextEditors(editors: vscode.TextEditor[]): void {
clients.forEach(client => client.onDidChangeVisibleTextEditors(editors));
}
function onInterval(): void {
@@ -194,26 +417,276 @@ function onInterval(): void {
clients.ActiveClient.onInterval();
}
/**
* Install a VSIX package. This helper function will exist until VSCode offers a command to do so.
* @param updateChannel The user's updateChannel setting.
*/
function installVsix(vsixLocation: string): Thenable<void> {
let userVersion: PackageVersion = new PackageVersion(vscode.version);
// 1.33.0 introduces workbench.extensions.installExtension. 1.32.3 was immediately prior.
let lastVersionWithoutInstallExtensionCommand: PackageVersion = new PackageVersion('1.32.3');
if (userVersion.isGreaterThan(lastVersionWithoutInstallExtensionCommand)) {
return vscode.commands.executeCommand('workbench.extensions.installExtension', vscode.Uri.file(vsixLocation));
}
// Get the path to the VSCode command -- replace logic later when VSCode allows calling of
// workbench.extensions.action.installVSIX from TypeScript w/o instead popping up a file dialog
return PlatformInformation.GetPlatformInformation().then((platformInfo) => {
const vsCodeScriptPath: string = function(platformInfo): string {
if (platformInfo.platform === 'win32') {
const vsCodeBinName: string = path.basename(process.execPath);
let cmdFile: string; // Windows VS Code Insiders/Exploration breaks VS Code naming conventions
if (vsCodeBinName === 'Code - Insiders.exe') {
cmdFile = 'code-insiders.cmd';
} else if (vsCodeBinName === 'Code - Exploration.exe') {
cmdFile = 'code-exploration.cmd';
} else {
cmdFile = 'code.cmd';
}
const vsCodeExeDir: string = path.dirname(process.execPath);
return path.join(vsCodeExeDir, 'bin', cmdFile);
} else if (platformInfo.platform === 'darwin') {
return path.join(process.execPath, '..', '..', '..', '..', '..',
'Resources', 'app', 'bin', 'code');
} else {
const vsCodeBinName: string = path.basename(process.execPath);
try {
const stdout: Buffer = execSync('which ' + vsCodeBinName);
return stdout.toString().trim();
} catch (error) {
return undefined;
}
}
}(platformInfo);
if (!vsCodeScriptPath) {
return Promise.reject(new Error('Failed to find VS Code script'));
}
// 1.28.0 changes the CLI for making installations. 1.27.2 was immediately prior.
let oldVersion: PackageVersion = new PackageVersion('1.27.2');
if (userVersion.isGreaterThan(oldVersion)) {
return new Promise<void>((resolve, reject) => {
let process: ChildProcess;
try {
process = spawn(vsCodeScriptPath, ['--install-extension', vsixLocation, '--force']);
// Timeout the process if no response is sent back. Ensures this Promise resolves/rejects
const timer: NodeJS.Timer = setTimeout(() => {
process.kill();
reject(new Error('Failed to receive response from VS Code script process for installation within 30s.'));
}, 30000);
process.on('exit', (code: number) => {
clearInterval(timer);
if (code !== 0) {
reject(new Error(`VS Code script exited with error code ${code}`));
} else {
resolve();
}
});
if (process.pid === undefined) {
throw new Error();
}
} catch (error) {
reject(new Error('Failed to launch VS Code script process for installation'));
return;
}
});
}
return new Promise<void>((resolve, reject) => {
let process: ChildProcess;
try {
process = spawn(vsCodeScriptPath, ['--install-extension', vsixLocation]);
if (process.pid === undefined) {
throw new Error();
}
} catch (error) {
reject(new Error('Failed to launch VS Code script process for installation'));
return;
}
// Timeout the process if no response is sent back. Ensures this Promise resolves/rejects
const timer: NodeJS.Timer = setTimeout(() => {
process.kill();
reject(new Error('Failed to receive response from VS Code script process for installation within 30s.'));
}, 30000);
// If downgrading, the VS Code CLI will prompt whether the user is sure they would like to downgrade.
// Respond to this by writing 0 to stdin (the option to override and install the VSIX package)
let sentOverride: boolean = false;
process.stdout.on('data', () => {
if (sentOverride) {
return;
}
process.stdin.write('0\n');
sentOverride = true;
clearInterval(timer);
resolve();
});
});
});
}
async function suggestInsidersChannel(): Promise<void> {
let suggestInsiders: PersistentState<boolean> = new PersistentState<boolean>("CPP.suggestInsiders", true);
if (!suggestInsiders.Value) {
return;
}
let buildInfo: BuildInfo;
try {
buildInfo = await getTargetBuildInfo("Insiders");
} catch (error) {
console.log(`${cppInstallVsixStr}${error.message}`);
if (error.message.indexOf('/') !== -1 || error.message.indexOf('\\') !== -1) {
error.message = "Potential PII hidden";
}
telemetry.logLanguageServerEvent('suggestInsiders', { 'error': error.message, 'success': 'false' });
}
if (!buildInfo) {
return; // No need to update.
}
const message: string = `Insiders version ${buildInfo.name} is available. Would you like to switch to the Insiders channel and install this update?`;
const yes: string = "Yes";
const askLater: string = "Ask Me Later";
const dontShowAgain: string = "Don't Show Again";
let selection: string = await vscode.window.showInformationMessage(message, yes, askLater, dontShowAgain);
switch (selection) {
case yes:
// Cache buildInfo.
buildInfoCache = buildInfo;
// It will call onDidChangeSettings.
vscode.workspace.getConfiguration("C_Cpp").update("updateChannel", "Insiders", vscode.ConfigurationTarget.Global);
break;
case dontShowAgain:
suggestInsiders.Value = false;
break;
case askLater:
break;
default:
break;
}
}
function applyUpdate(buildInfo: BuildInfo): Promise<void> {
return new Promise<void>((resolve, reject) => {
tmp.file({postfix: '.vsix'}, async (err, vsixPath, fd, cleanupCallback) => {
if (err) {
reject(new Error('Failed to create vsix file'));
return;
}
// Place in try/catch as the .catch call catches a rejection in downloadFileToDestination
// then the .catch call will return a resolved promise
// Thusly, the .catch call must also throw, as a return would simply return an unused promise
// instead of returning early from this function scope
let config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration();
let originalProxySupport: string = config.inspect<string>('http.proxySupport').globalValue;
while (true) { // Might need to try again with a different http.proxySupport setting.
try {
await util.downloadFileToDestination(buildInfo.downloadUrl, vsixPath);
} catch {
// Try again with the proxySupport to "off".
if (originalProxySupport !== config.inspect<string>('http.proxySupport').globalValue) {
config.update('http.proxySupport', originalProxySupport, true); // Reset the http.proxySupport.
reject(new Error('Failed to download VSIX package with proxySupport off')); // Changing the proxySupport didn't help.
return;
}
if (config.get('http.proxySupport') !== "off" && originalProxySupport !== "off") {
config.update('http.proxySupport', "off", true);
continue;
}
reject(new Error('Failed to download VSIX package'));
return;
}
if (originalProxySupport !== config.inspect<string>('http.proxySupport').globalValue) {
config.update('http.proxySupport', originalProxySupport, true); // Reset the http.proxySupport.
telemetry.logLanguageServerEvent('installVsix', { 'error': "Success with proxySupport off", 'success': 'true' });
}
break;
}
try {
await installVsix(vsixPath);
} catch (error) {
reject(error);
return;
}
clearInterval(insiderUpdateTimer);
const message: string =
`The C/C++ Extension has been updated to version ${buildInfo.name}. Please reload the window for the changes to take effect.`;
util.promptReloadWindow(message);
telemetry.logLanguageServerEvent('installVsix', { 'success': 'true' });
resolve();
});
}).catch(error => {
console.error(`${cppInstallVsixStr}${error.message}`);
if (error.message.indexOf('/') !== -1 || error.message.indexOf('\\') !== -1) {
error.message = "Potential PII hidden";
}
telemetry.logLanguageServerEvent('installVsix', { 'error': error.message, 'success': 'false' });
});
}
/**
* Query package.json and the GitHub API to determine whether the user should update, if so then install the update.
* The update can be an upgrade or downgrade depending on the the updateChannel setting.
* @param updateChannel The user's updateChannel setting.
*/
async function checkAndApplyUpdate(updateChannel: string): Promise<void> {
// If we have buildInfo cache, we should use it.
let buildInfo: BuildInfo | null = buildInfoCache;
// clear buildInfo cache.
buildInfoCache = null;
if (!buildInfo) {
try {
buildInfo = await getTargetBuildInfo(updateChannel);
} catch (error) {
telemetry.logLanguageServerEvent('installVsix', { 'error': error.message, 'success': 'false' });
}
}
if (!buildInfo) {
return; // No need to update.
}
await applyUpdate(buildInfo);
}
/*********************************************
* registered commands
*********************************************/
let commandsRegistered: boolean = false;
function registerCommands(): void {
export function registerCommands(): void {
if (commandsRegistered) {
return;
}
commandsRegistered = true;
getTemporaryCommandRegistrarInstance().clearTempCommands();
disposables.push(vscode.commands.registerCommand('C_Cpp.Navigate', onNavigate));
disposables.push(vscode.commands.registerCommand('C_Cpp.GoToDeclaration', onGoToDeclaration));
disposables.push(vscode.commands.registerCommand('C_Cpp.PeekDeclaration', onPeekDeclaration));
disposables.push(vscode.commands.registerCommand('C_Cpp.SwitchHeaderSource', onSwitchHeaderSource));
disposables.push(vscode.commands.registerCommand('C_Cpp.ResetDatabase', onResetDatabase));
disposables.push(vscode.commands.registerCommand('C_Cpp.ConfigurationSelect', onSelectConfiguration));
disposables.push(vscode.commands.registerCommand('C_Cpp.ConfigurationProviderSelect', onSelectConfigurationProvider));
disposables.push(vscode.commands.registerCommand('C_Cpp.ConfigurationEditJSON', onEditConfigurationJSON));
disposables.push(vscode.commands.registerCommand('C_Cpp.ConfigurationEditUI', onEditConfigurationUI));
disposables.push(vscode.commands.registerCommand('C_Cpp.ConfigurationEdit', onEditConfiguration));
disposables.push(vscode.commands.registerCommand('C_Cpp.AddToIncludePath', onAddToIncludePath));
disposables.push(vscode.commands.registerCommand('C_Cpp.ToggleErrorSquiggles', onToggleSquiggles));
disposables.push(vscode.commands.registerCommand('C_Cpp.EnableErrorSquiggles', onEnableSquiggles));
disposables.push(vscode.commands.registerCommand('C_Cpp.DisableErrorSquiggles', onDisableSquiggles));
disposables.push(vscode.commands.registerCommand('C_Cpp.ToggleIncludeFallback', onToggleIncludeFallback));
disposables.push(vscode.commands.registerCommand('C_Cpp.ToggleDimInactiveRegions', onToggleDimInactiveRegions));
disposables.push(vscode.commands.registerCommand('C_Cpp.ShowReleaseNotes', onShowReleaseNotes));
disposables.push(vscode.commands.registerCommand('C_Cpp.PauseParsing', onPauseParsing));
disposables.push(vscode.commands.registerCommand('C_Cpp.ResumeParsing', onResumeParsing));
disposables.push(vscode.commands.registerCommand('C_Cpp.ShowParsingCommands', onShowParsingCommands));
disposables.push(vscode.commands.registerCommand('C_Cpp.TakeSurvey', onTakeSurvey));
disposables.push(vscode.commands.registerCommand('C_Cpp.LogDiagnostics', onLogDiagnostics));
disposables.push(vscode.commands.registerCommand('cpptools.activeConfigName', onGetActiveConfigName));
getTemporaryCommandRegistrarInstance().executeDelayedCommands();
}
function onNavigate(): void {
@@ -245,7 +718,7 @@ function onSwitchHeaderSource(): void {
return;
}
if (activeEditor.document.languageId != "cpp" && activeEditor.document.languageId != "c") {
if (activeEditor.document.languageId !== "cpp" && activeEditor.document.languageId !== "c") {
return;
}
@@ -318,6 +791,35 @@ function onSelectConfiguration(): void {
}
}
function onSelectConfigurationProvider(): void {
onActivationEvent();
if (!isFolderOpen()) {
vscode.window.showInformationMessage('Open a folder first to select a configuration provider');
} else {
selectClient().then(client => client.handleConfigurationProviderSelectCommand(), rejected => {});
}
}
function onEditConfigurationJSON(): void {
onActivationEvent();
telemetry.logLanguageServerEvent("SettingsCommand", { "palette": "json" }, null);
if (!isFolderOpen()) {
vscode.window.showInformationMessage('Open a folder first to edit configurations');
} else {
selectClient().then(client => client.handleConfigurationEditJSONCommand(), rejected => {});
}
}
function onEditConfigurationUI(): void {
onActivationEvent();
telemetry.logLanguageServerEvent("SettingsCommand", { "palette": "ui" }, null);
if (!isFolderOpen()) {
vscode.window.showInformationMessage('Open a folder first to edit configurations');
} else {
selectClient().then(client => client.handleConfigurationEditUICommand(), rejected => {});
}
}
function onEditConfiguration(): void {
onActivationEvent();
if (!isFolderOpen()) {
@@ -337,11 +839,18 @@ function onAddToIncludePath(path: string): void {
}
}
function onToggleSquiggles(): void {
function onEnableSquiggles(): void {
onActivationEvent();
// This only applies to the active client.
let settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri);
settings.toggleSetting("errorSquiggles", "Enabled", "Disabled");
settings.update<string>("errorSquiggles", "Enabled");
}
function onDisableSquiggles(): void {
onActivationEvent();
// This only applies to the active client.
let settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri);
settings.update<string>("errorSquiggles", "Disabled");
}
function onToggleIncludeFallback(): void {
@@ -351,6 +860,13 @@ function onToggleIncludeFallback(): void {
settings.toggleSetting("intelliSenseEngineFallback", "Enabled", "Disabled");
}
function onToggleDimInactiveRegions(): void {
onActivationEvent();
// This only applies to the active client.
let settings: CppSettings = new CppSettings(clients.ActiveClient.RootUri);
settings.update<boolean>("dimInactiveRegions", !settings.dimInactiveRegions);
}
function onShowReleaseNotes(): void {
onActivationEvent();
util.showReleaseNotes();
@@ -378,8 +894,17 @@ function onTakeSurvey(): void {
vscode.commands.executeCommand('vscode.open', uri);
}
function onGetActiveConfigName(): Thenable<string> {
return clients.ActiveClient.getCurrentConfigName();
}
function onLogDiagnostics(): void {
onActivationEvent();
clients.ActiveClient.logDiagnostics();
}
function reportMacCrashes(): void {
if (process.platform == "darwin") {
if (process.platform === "darwin") {
prevCrashFile = "";
let crashFolder: string = path.resolve(process.env.HOME, "Library/Logs/DiagnosticReports");
fs.stat(crashFolder, (err, stats) => {
@@ -392,65 +917,128 @@ function reportMacCrashes(): void {
}
// vscode.workspace.createFileSystemWatcher only works in workspace folders.
fs.watch(crashFolder, (event, filename) => {
if (event !== "rename") {
return;
}
if (filename === prevCrashFile) {
return;
}
prevCrashFile = filename;
if (!filename.startsWith("Microsoft.VSCode.CPP.")) {
return;
}
// Wait 5 seconds to allow time for the crash log to finish being written.
setTimeout(() => {
fs.readFile(path.resolve(crashFolder, filename), 'utf8', (err, data) => {
if (err) {
// Try again?
fs.readFile(path.resolve(crashFolder, filename), 'utf8', handleCrashFileRead);
return;
}
handleCrashFileRead(err, data);
});
}, 5000);
});
try {
fs.watch(crashFolder, (event, filename) => {
if (event !== "rename") {
return;
}
if (filename === prevCrashFile) {
return;
}
prevCrashFile = filename;
if (!filename.startsWith("Microsoft.VSCode.CPP.")) {
return;
}
// Wait 5 seconds to allow time for the crash log to finish being written.
setTimeout(() => {
fs.readFile(path.resolve(crashFolder, filename), 'utf8', (err, data) => {
if (err) {
// Try again?
fs.readFile(path.resolve(crashFolder, filename), 'utf8', handleCrashFileRead);
return;
}
handleCrashFileRead(err, data);
});
}, 5000);
});
} catch (e) {
// The file watcher limit is hit (may not be possible on Mac, but just in case).
}
});
}
}
function handleCrashFileRead(err: NodeJS.ErrnoException, data: string): void {
function logCrashTelemetry(data: string): void {
let crashObject: { [key: string]: string } = {};
if (err) {
crashObject["readFile: err.code"] = err.code;
telemetry.logLanguageServerEvent("MacCrash", crashObject, null);
return;
}
let startCrash: number = data.indexOf(" Crashed:");
if (startCrash < 0) {
startCrash = 0;
}
let endCrash: number = data.indexOf("Thread ", startCrash);
if (endCrash < startCrash) {
endCrash = data.length - 1;
}
data = data.substr(startCrash, endCrash - startCrash);
if (data.length > 16384) {
data = data.substr(0, 16384) + "...";
}
crashObject["CrashingThreadCallStack"] = data;
telemetry.logLanguageServerEvent("MacCrash", crashObject, null);
}
function handleCrashFileRead(err: NodeJS.ErrnoException, data: string): void {
if (err) {
return logCrashTelemetry("readFile: " + err.code);
}
// Extract the crashing thread's call stack.
const crashStart: string = " Crashed:";
let startCrash: number = data.indexOf(crashStart);
if (startCrash < 0) {
return logCrashTelemetry("No crash start");
}
startCrash += crashStart.length + 1; // Skip past crashStart.
let endCrash: number = data.indexOf("Thread ", startCrash);
if (endCrash < 0) {
endCrash = data.length - 1; // Not expected, but just in case.
}
if (endCrash <= startCrash) {
return logCrashTelemetry("No crash end");
}
data = data.substr(startCrash, endCrash - startCrash);
// Get rid of the memory addresses (which breaks being able get a hit count for each crash call stack).
data = data.replace(/0x................ /g, "");
data = data.replace(/0x1........ \+ 0/g, "");
// Get rid of the process names on each line and just add it to the start.
const process1: string = "Microsoft.VSCode.CPP.IntelliSense.Msvc.darwin\t";
const process2: string = "Microsoft.VSCode.CPP.Extension.darwin\t";
if (data.includes(process1)) {
data = data.replace(new RegExp(process1, "g"), "");
data = process1 + "\n" + data;
} else if (data.includes(process2)) {
data = data.replace(new RegExp(process2, "g"), "");
data = process2 + "\n" + data;
} else {
return logCrashTelemetry("No process"); // Not expected, but just in case.
}
// Remove runtime lines because they can be different on different machines.
let lines: string[] = data.split("\n");
data = "";
lines.forEach((line: string) => {
if (!line.includes(".dylib") && !line.includes("???")) {
line = line.replace(/^\d+\s+/, ""); // Remove <numbers><spaces> from the start of the line.
line = line.replace(/std::__1::/g, "std::"); // __1:: is not helpful.
data += (line + "\n");
}
});
data = data.trimRight();
if (data.length > 8192) { // The API has an 8k limit.
data = data.substr(0, 8189) + "...";
}
logCrashTelemetry(data);
}
export function deactivate(): Thenable<void> {
console.log("deactivating extension");
telemetry.logLanguageServerEvent("LanguageServerShutdown");
clearInterval(intervalTimer);
clearInterval(insiderUpdateTimer);
disposables.forEach(d => d.dispose());
languageConfigurations.forEach(d => d.dispose());
ui.dispose();
if (taskProvider) {
taskProvider.dispose();
}
return clients.dispose();
}
export function isFolderOpen(): boolean {
return vscode.workspace.workspaceFolders !== undefined && vscode.workspace.workspaceFolders.length > 0;
}
export function getClients(): ClientCollection {
if (!realActivationOccurred) {
realActivation();
}
return clients;
}
export function getActiveClient(): Client {
if (!realActivationOccurred) {
realActivation();
}
return clients.ActiveClient;
}
@@ -0,0 +1,321 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as vscode from 'vscode';
import { CppSettings } from './settings';
import { getOutputChannel } from '../logger';
export interface CommentPattern {
begin: string;
continue: string;
}
const escapeChars: RegExp = /[\\\^\$\*\+\?\{\}\(\)\.\!\=\|\[\]\ \/]/; // characters that should be escaped.
// Insert '\\' in front of regexp escape chars.
function escape(chars: string): string {
let result: string = "";
for (let char of chars) {
if (char.match(escapeChars)) {
result += `\\${char}`;
} else {
result += char;
}
}
return result;
}
// BEWARE: below are string representations of regular expressions, so the backslashes must all be escaped.
function getMLBeginPattern(insert: string): string | undefined {
if (insert && insert.startsWith("/*")) {
let match: string = escape(insert.substr(2)); // trim the leading '/*' and escape any troublesome characters.
return `^\\s*\\/\\*${match}(?!\\/)([^\\*]|\\*(?!\\/))*$`;
}
return undefined;
}
function getMLSplitAfterPattern(): string {
return "^\\s*\\*\\/$";
}
function getMLContinuePattern(insert: string): string | undefined {
if (insert) {
let match: string = escape(insert.trimRight());
if (match) {
let right: string = escape(insert.substr(insert.trimRight().length));
return `^\\s*${match}(${right}([^\\*]|\\*(?!\\/))*)?$`;
}
// else: if the continuation is just whitespace, vscode already does indentation preservation.
}
return undefined;
}
function getMLEndPattern(insert: string): string | undefined {
if (insert) {
let match: string = escape(insert.trimRight().trimLeft());
if (match) {
return `^\\s*${match}[^/]*\\*\\/\\s*$`;
}
// else: if the continuation is just whitespace, don't mess with indentation
// since we don't know if this is a continuation line or not.
}
return undefined;
}
function getMLEmptyEndPattern(insert: string): string | undefined {
if (insert) {
insert = insert.trimRight();
if (insert) {
if (insert.endsWith('*')) {
insert = insert.substr(0, insert.length - 1);
}
let match: string = escape(insert.trimRight());
return `^\\s*${match}\\*\\/\\s*$`;
}
// else: if the continuation is just whitespace, don't mess with indentation
// since we don't know if this is a continuation line or not.
}
return undefined;
}
function getSLBeginPattern(insert: string): string | undefined {
if (insert) {
let match: string = escape(insert.trimRight());
return `^\\s*${match}.*$`;
}
return undefined;
}
function getSLContinuePattern(insert: string): string | undefined {
if (insert) {
let match: string = escape(insert.trimRight());
return `^\\s*${match}.+$`;
}
return undefined;
}
function getSLEndPattern(insert: string): string | undefined {
if (insert) {
let match: string = escape(insert);
let trimmed: string = escape(insert.trimRight());
if (match !== trimmed) {
match = `(${match}|${trimmed})`;
}
return `^\\s*${match}$`;
}
return undefined;
}
// When Enter is pressed while the cursor is between '/**' and '*/' on the same line.
function getMLSplitRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let beforePattern: string | undefined = getMLBeginPattern(comment.begin);
if (beforePattern) {
return {
beforeText: new RegExp(beforePattern),
afterText: new RegExp(getMLSplitAfterPattern()),
action: {
indentAction: vscode.IndentAction.IndentOutdent,
appendText: comment.continue ? comment.continue : ''
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is after '/**' and there is no '*/' on the same line after the cursor
function getMLFirstLineRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let beforePattern: string | undefined = getMLBeginPattern(comment.begin);
if (beforePattern) {
return {
beforeText: new RegExp(beforePattern),
action: {
indentAction: vscode.IndentAction.None,
appendText: comment.continue ? comment.continue : ''
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is after the continuation pattern
function getMLContinuationRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let continuePattern: string = getMLContinuePattern(comment.continue);
if (continuePattern) {
return {
beforeText: new RegExp(continuePattern),
action: {
indentAction: vscode.IndentAction.None,
appendText: comment.continue.trimLeft()
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is after '*/' (and '*/' plus leading whitespace is all that is on the line)
function getMLEndRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let endPattern: string = getMLEndPattern(comment.continue);
if (endPattern) {
return {
beforeText: new RegExp(endPattern),
action: {
indentAction: vscode.IndentAction.None,
removeText: comment.continue.length - comment.continue.trimLeft().length
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is after the continuation pattern and '*/'
function getMLEmptyEndRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let endPattern: string = getMLEmptyEndPattern(comment.continue);
if (endPattern) {
return {
beforeText: new RegExp(endPattern),
action: {
indentAction: vscode.IndentAction.None,
removeText: comment.continue.length - comment.continue.trimLeft().length
}
};
}
}
return undefined;
}
// When the continue rule is different than the begin rule for single line comments
function getSLFirstLineRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let continuePattern: string = getSLBeginPattern(comment.begin);
if (continuePattern) {
return {
beforeText: new RegExp(continuePattern),
action: {
indentAction: vscode.IndentAction.None,
appendText: comment.continue.trimLeft()
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is after the continuation pattern plus at least one other character.
function getSLContinuationRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let continuePattern: string = getSLContinuePattern(comment.continue);
if (continuePattern) {
return {
beforeText: new RegExp(continuePattern),
action: {
indentAction: vscode.IndentAction.None,
appendText: comment.continue.trimLeft()
}
};
}
}
return undefined;
}
// When Enter is pressed while the cursor is immediately after the continuation pattern
function getSLEndRule(comment: CommentPattern): vscode.OnEnterRule | undefined {
if (comment) {
let endPattern: string = getSLEndPattern(comment.continue);
if (endPattern) {
return {
beforeText: new RegExp(endPattern),
action: {
indentAction: vscode.IndentAction.None,
removeText: comment.continue.length - comment.continue.trimLeft().length
}
};
}
}
return undefined;
}
interface Rules {
begin: vscode.OnEnterRule[];
continue: vscode.OnEnterRule[];
end: vscode.OnEnterRule[];
}
export function getLanguageConfig(languageId: string, resource?: vscode.Uri): vscode.LanguageConfiguration {
let settings: CppSettings = new CppSettings(resource);
let patterns: (string | CommentPattern)[] = settings.commentContinuationPatterns;
return getLanguageConfigFromPatterns(languageId, patterns);
}
export function getLanguageConfigFromPatterns(languageId: string, patterns: (string | CommentPattern)[]): vscode.LanguageConfiguration {
let beginPatterns: string[] = []; // avoid duplicate rules
let continuePatterns: string[] = []; // avoid duplicate rules
let duplicates: boolean = false;
let beginRules: vscode.OnEnterRule[] = [];
let continueRules: vscode.OnEnterRule[] = [];
let endRules: vscode.OnEnterRule[] = [];
patterns.forEach(pattern => {
let c: CommentPattern = (typeof pattern === "string") ? { begin: pattern, continue: pattern.startsWith('/*') ? " * " : pattern } : <CommentPattern>pattern;
let r: Rules = constructCommentRules(c, languageId);
if (beginPatterns.indexOf(c.begin) < 0) {
if (r.begin && r.begin.length > 0) {
beginRules = beginRules.concat(r.begin);
}
beginPatterns.push(c.begin);
} else {
duplicates = true;
}
if (continuePatterns.indexOf(c.continue) < 0) {
if (r.continue && r.continue.length > 0) {
continueRules = continueRules.concat(r.continue);
}
if (r.end && r.end.length > 0) {
endRules = endRules.concat(r.end);
}
continuePatterns.push(c.continue);
}
});
if (duplicates) {
getOutputChannel().appendLine("Duplicate multiline comment patterns detected.");
}
return { onEnterRules: beginRules.concat(continueRules).concat(endRules).filter(e => (e)) }; // Remove any 'undefined' entries
}
function constructCommentRules(comment: CommentPattern, languageId: string): Rules {
if (comment && comment.begin && comment.begin.startsWith('/*') && (languageId === 'c' || languageId === 'cpp')) {
return {
begin: [
getMLSplitRule(comment),
getMLFirstLineRule(comment)
],
continue: [ getMLContinuationRule(comment) ],
end: [
getMLEmptyEndRule(comment),
getMLEndRule(comment)
]
};
} else if (comment && comment.begin && comment.begin.startsWith('//') && languageId === 'cpp') {
return {
begin: (comment.begin === comment.continue) ? [] : [ getSLFirstLineRule(comment) ],
continue: [ getSLContinuationRule(comment) ],
end: [ getSLEndRule(comment) ]
};
}
return {
begin: [],
continue: [],
end: []
};
}
@@ -12,32 +12,41 @@ class PersistentStateBase<T> {
private key: string;
private defaultvalue: T;
private state: vscode.Memento;
private curvalue: T;
constructor(key: string, defaultValue: T, state: vscode.Memento) {
this.key = key;
this.defaultvalue = defaultValue;
this.state = state;
this.curvalue = defaultValue;
}
public get Value(): T {
return this.state.get<T>(this.key, this.defaultvalue);
return this.state ? this.state.get<T>(this.key, this.defaultvalue) : this.curvalue;
}
public set Value(newValue: T) {
this.state.update(this.key, newValue);
if (this.state) {
this.state.update(this.key, newValue);
}
this.curvalue = newValue;
}
public get DefaultValue(): T {
return this.defaultvalue;
}
}
// Abstraction for global state that persists across activations but is not present in a settings file
export class PersistentState<T> extends PersistentStateBase<T> {
constructor(key: string, defaultValue: T) {
super(key, defaultValue, util.extensionContext.globalState);
super(key, defaultValue, util.extensionContext ? util.extensionContext.globalState : null);
}
}
export class PersistentWorkspaceState<T> extends PersistentStateBase<T> {
constructor(key: string, defaultValue: T) {
super(key, defaultValue, util.extensionContext.workspaceState);
super(key, defaultValue, util.extensionContext ? util.extensionContext.workspaceState : null);
}
}
+29 -11
View File
@@ -4,6 +4,7 @@
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as path from 'path';
import { Middleware } from 'vscode-languageclient';
import { ClientCollection } from './clientCollection';
import { Client } from './client';
@@ -11,26 +12,38 @@ import { Client } from './client';
export function createProtocolFilter(me: Client, clients: ClientCollection): Middleware {
// Disabling lint for invoke handlers
/* tslint:disable */
let defaultHandler: (data: any, callback: (data: any) => void) => void = (data, callback: (data) => void) => { if (clients.ActiveClient === me) { callback(data); } };
let invoke1 = (a, callback: (a) => any) => { if (clients.ActiveClient === me) { return callback(a); } return null; };
let invoke2 = (a, b, callback: (a, b) => any) => { if (clients.ActiveClient === me) { return callback(a, b); } return null; };
let invoke3 = (a, b, c, callback: (a, b, c) => any) => { if (clients.ActiveClient === me) { return callback(a, b, c); } return null; };
let invoke4 = (a, b, c, d, callback: (a, b, c, d) => any) => { if (clients.ActiveClient === me) { return callback(a, b, c, d); } return null; };
let invoke5 = (a, b, c, d, e, callback: (a, b, c, d, e) => any) => { if (clients.ActiveClient === me) { return callback(a, b, c, d, e); } return null; };
let defaultHandler: (data: any, callback: (data: any) => void) => void = (data, callback: (data) => void) => { if (clients.ActiveClient === me) {me.notifyWhenReady(() => callback(data));}};
let invoke1 = (a, callback: (a) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a)); } return null; };
let invoke2 = (a, b, callback: (a, b) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a, b)); } return null; };
let invoke3 = (a, b, c, callback: (a, b, c) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a, b, c)); } return null; };
let invoke4 = (a, b, c, d, callback: (a, b, c, d) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a, b, c, d)); } return null; };
let invoke5 = (a, b, c, d, e, callback: (a, b, c, d, e) => any) => { if (clients.ActiveClient === me) { return me.requestWhenReady(() => callback(a, b, c, d, e)); } return null; };
/* tslint:enable */
return {
didOpen: (document, sendMessage) => {
if (clients.checkOwnership(me, document)) {
me.TrackedDocuments.add(document);
sendMessage(document);
// Work around vscode treating ".C" as c, by adding this file name to file associations as cpp
if (document.uri.path.endsWith(".C")) {
let fileName: string = path.basename(document.uri.fsPath);
let mappingString: string = fileName + "@" + document.uri.fsPath;
me.addFileAssociations(mappingString, false);
}
me.provideCustomConfiguration(document).then(() => {
sendMessage(document);
}, () => {
sendMessage(document);
});
}
},
didChange: defaultHandler,
willSave: defaultHandler,
willSaveWaitUntil: (event, sendMessage) => {
if (clients.ActiveClient === me) {
return sendMessage(event);
return me.requestWhenReady(() => sendMessage(event));
}
return Promise.resolve([]);
},
@@ -39,13 +52,18 @@ export function createProtocolFilter(me: Client, clients: ClientCollection): Mid
if (clients.ActiveClient === me) {
console.assert(me.TrackedDocuments.has(document));
me.TrackedDocuments.delete(document);
sendMessage(document);
me.notifyWhenReady(() => sendMessage(document));
}
},
provideCompletionItem: invoke3,
provideCompletionItem: invoke4,
resolveCompletionItem: invoke2,
provideHover: invoke3,
provideHover: (document, position, token, next: (document, position, token) => any) => {
if (clients.checkOwnership(me, document)) {
return me.requestWhenReady(() => next(document, position, token));
}
return null;
},
provideSignatureHelp: invoke3,
provideDefinition: invoke3,
provideReferences: invoke4,
+34 -1
View File
@@ -5,6 +5,7 @@
'use strict';
import * as vscode from 'vscode';
import { CommentPattern } from './languageConfig';
function getTarget(): vscode.ConfigurationTarget {
return (vscode.workspace.workspaceFolders) ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Global;
@@ -35,20 +36,51 @@ export class CppSettings extends Settings {
public get clangFormatSortIncludes(): string { return super.Section.get<string>("clang_format_sortIncludes"); }
public get clangFormatOnSave(): string { return super.Section.get<string>("clang_format_formatOnSave"); }
public get formatting(): string { return super.Section.get<string>("formatting"); }
public get suggestSnippets(): boolean { return super.Section.get<boolean>("suggestSnippets"); }
public get intelliSenseEngine(): string { return super.Section.get<string>("intelliSenseEngine"); }
public get intelliSenseEngineFallback(): string { return super.Section.get<string>("intelliSenseEngineFallback"); }
public get intelliSenseCachePath(): string { return super.Section.get<string>("intelliSenseCachePath"); }
public get intelliSenseCacheSize(): number { return super.Section.get<number>("intelliSenseCacheSize"); }
public get errorSquiggles(): string { return super.Section.get<string>("errorSquiggles"); }
public get dimInactiveRegions(): boolean { return super.Section.get<boolean>("dimInactiveRegions"); }
public get inactiveRegionOpacity(): number { return super.Section.get<number>("inactiveRegionOpacity"); }
public get inactiveRegionForegroundColor(): string { return super.Section.get<string>("inactiveRegionForegroundColor"); }
public get inactiveRegionBackgroundColor(): string { return super.Section.get<string>("inactiveRegionBackgroundColor"); }
public get autoComplete(): string { return super.Section.get<string>("autocomplete"); }
public get loggingLevel(): string { return super.Section.get<string>("loggingLevel"); }
public get navigationLength(): number { return super.Section.get<number>("navigation.length", 60); }
public get autoAddFileAssociations(): boolean { return super.Section.get<boolean>("autoAddFileAssociations"); }
public get workspaceParsingPriority(): boolean { return super.Section.get<boolean>("workspaceParsingPriority"); }
public get workspaceSymbols(): string { return super.Section.get<string>("workspaceSymbols"); }
public get exclusionPolicy(): boolean { return super.Section.get<boolean>("exclusionPolicy"); }
public get commentContinuationPatterns(): (string | CommentPattern)[] { return super.Section.get<(string | CommentPattern)[]>("commentContinuationPatterns"); }
public get configurationWarnings(): string { return super.Section.get<string>("configurationWarnings"); }
public get preferredPathSeparator(): string { return super.Section.get<string>("preferredPathSeparator"); }
public get updateChannel(): string { return super.Section.get<string>("updateChannel"); }
public get defaultIncludePath(): string[] { return super.Section.get<string[]>("default.includePath"); }
public get defaultDefines(): string[] { return super.Section.get<string[]>("default.defines"); }
public get defaultMacFrameworkPath(): string[] { return super.Section.get<string[]>("default.macFrameworkPath"); }
public get defaultWindowsSdkVersion(): string { return super.Section.get<string>("default.windowsSdkVersion"); }
public get defaultCompileCommands(): string { return super.Section.get<string>("default.compileCommands"); }
public get defaultForcedInclude(): string[] { return super.Section.get<string[]>("default.forcedInclude"); }
public get defaultIntelliSenseMode(): string { return super.Section.get<string>("default.intelliSenseMode"); }
public get defaultCompilerPath(): string { return super.Section.get<string>("default.compilerPath"); }
public get defaultCStandard(): string { return super.Section.get<string>("default.cStandard"); }
public get defaultCppStandard(): string { return super.Section.get<string>("default.cppStandard"); }
public get defaultConfigurationProvider(): string { return super.Section.get<string>("default.configurationProvider"); }
public get defaultBrowsePath(): string[] { return super.Section.get<string[]>("default.browse.path"); }
public get defaultDatabaseFilename(): string { return super.Section.get<string>("default.browse.databaseFilename"); }
public get defaultLimitSymbolsToIncludedHeaders(): boolean { return super.Section.get<boolean>("default.browse.limitSymbolsToIncludedHeaders"); }
public get defaultSystemIncludePath(): string[] { return super.Section.get<string[]>("default.systemIncludePath"); }
public get defaultEnableConfigurationSquiggles(): boolean { return super.Section.get<boolean>("default.enableConfigurationSquiggles"); }
public toggleSetting(name: string, value1: string, value2: string): void {
let value: string = super.Section.get<string>(name);
super.Section.update(name, value === value1 ? value2 : value1, getTarget());
}
public update<T>(name: string, value: T): void {
super.Section.update(name, value);
}
}
export class OtherSettings {
@@ -61,10 +93,11 @@ export class OtherSettings {
this.resource = resource;
}
public get editorTabSize(): vscode.WorkspaceConfiguration { return vscode.workspace.getConfiguration("editor", this.resource).get("tabSize"); }
public get editorTabSize(): number { return vscode.workspace.getConfiguration("editor", this.resource).get<number>("tabSize"); }
public get filesAssociations(): any { return vscode.workspace.getConfiguration("files", null).get("associations"); }
public get filesExclude(): vscode.WorkspaceConfiguration { return vscode.workspace.getConfiguration("files", this.resource).get("exclude"); }
public get searchExclude(): vscode.WorkspaceConfiguration { return vscode.workspace.getConfiguration("search", this.resource).get("exclude"); }
public get settingsEditor(): string { return vscode.workspace.getConfiguration("workbench.settings").get<string>("editor"); }
public set filesAssociations(value: any) {
vscode.workspace.getConfiguration("files", null).update("associations", value, vscode.ConfigurationTarget.Workspace);
@@ -0,0 +1,223 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as path from 'path';
import * as fs from 'fs';
import * as vscode from 'vscode';
import * as util from '../common';
import * as config from './configurations';
// TODO: share ElementId between SettingsPanel and SettingsApp. Investigate why SettingsApp cannot import/export
const elementId: { [key: string]: string } = {
activeConfig: "activeConfig",
compilerPath: "compilerPath",
intelliSenseMode: "intelliSenseMode",
includePath: "includePath",
defines: "defines",
cStandard: "cStandard",
cppStandard: "cppStandard"
};
export class SettingsPanel {
private configValues: config.Configuration;
private isIntelliSenseModeDefined: boolean = false;
private settingsPanelActivated = new vscode.EventEmitter<void>();
private configValuesChanged = new vscode.EventEmitter<void>();
private panel: vscode.WebviewPanel;
private disposable: vscode.Disposable = undefined;
private disposablesPanel: vscode.Disposable = undefined;
private static readonly viewType: string = 'settingsPanel';
private static readonly title: string = 'C/C++ Configurations';
constructor() {
this.configValues = { name: undefined };
this.disposable = vscode.Disposable.from(
this.settingsPanelActivated,
this.configValuesChanged
);
}
public createOrShow(activeConfiguration: config.Configuration, errors: config.ConfigurationErrors): void {
const column: vscode.ViewColumn = vscode.window.activeTextEditor
? vscode.window.activeTextEditor.viewColumn
: undefined;
// Show existing panel
if (this.panel) {
this.panel.reveal(column, false);
return;
}
// Create new panel
this.panel = vscode.window.createWebviewPanel(
SettingsPanel.viewType,
SettingsPanel.title,
column || vscode.ViewColumn.One,
{
enableCommandUris: true,
enableScripts: true,
// Restrict the webview to only loading content from these directories
localResourceRoots: [
vscode.Uri.file(util.extensionPath),
vscode.Uri.file(path.join(util.extensionPath, 'ui')),
vscode.Uri.file(path.join(util.extensionPath, 'out', 'ui'))]
}
);
this.panel.iconPath = vscode.Uri.file(util.getExtensionFilePath("LanguageCCPP_color_128x.png"));
this.disposablesPanel = vscode.Disposable.from(
this.panel,
this.panel.onDidDispose(this.onPanelDisposed, this),
this.panel.onDidChangeViewState(this.onViewStateChanged, this),
this.panel.webview.onDidReceiveMessage(this.onMessageReceived, this),
vscode.window.onDidChangeWindowState(this.onWindowStateChanged, this)
);
this.panel.webview.html = this.getHtml();
this.updateWebview(activeConfiguration, errors);
}
public get SettingsPanelActivated(): vscode.Event<void> {
return this.settingsPanelActivated.event;
}
public get ConfigValuesChanged(): vscode.Event<void> {
return this.configValuesChanged.event;
}
public getLastValuesFromConfigUI(): config.Configuration {
return this.configValues;
}
public updateConfigUI(configuration: config.Configuration, errors: config.ConfigurationErrors): void {
if (this.panel) {
this.updateWebview(configuration, errors);
}
}
public updateErrors(errors: config.ConfigurationErrors): void {
if (this.panel) {
this.panel.webview.postMessage({ command: 'updateErrors', errors: errors});
}
}
public dispose(): void {
// Clean up resources
this.panel.dispose();
if (this.disposable) {
this.disposable.dispose();
}
if (this.disposablesPanel) {
this.disposablesPanel.dispose();
}
}
private onPanelDisposed(): void {
if (this.disposablesPanel) {
this.disposablesPanel.dispose();
this.panel = undefined;
}
}
private updateWebview(configuration: config.Configuration, errors: config.ConfigurationErrors): void {
this.configValues = Object.assign({}, configuration); // Copy configuration values
this.isIntelliSenseModeDefined = (this.configValues.intelliSenseMode !== undefined);
if (this.panel) {
// Send a message to the webview to update the values and errors
this.panel.webview.postMessage({ command: 'updateConfig', config: this.configValues});
this.panel.webview.postMessage({ command: 'updateErrors', errors: errors});
}
}
private onViewStateChanged(e: vscode.WebviewPanelOnDidChangeViewStateEvent): void {
if (e.webviewPanel.active) {
this.settingsPanelActivated.fire();
}
}
private onWindowStateChanged(e: vscode.WindowState): void {
if (e.focused) {
this.settingsPanelActivated.fire();
}
}
private onMessageReceived(message: any): void {
if (message === null) {
return;
}
switch (message.command) {
case 'change':
this.updateConfig(message);
}
}
private updateConfig(message: any): void {
let entries: string[];
switch (message.key) {
case elementId.activeConfig:
this.configValues.name = message.value;
break;
case elementId.compilerPath:
this.configValues.compilerPath = message.value;
break;
case elementId.includePath:
entries = message.value.split("\n");
this.configValues.includePath = entries.filter(e => e);
break;
case elementId.defines:
entries = message.value.split("\n");
this.configValues.defines = entries.filter(e => e);
break;
case elementId.intelliSenseMode:
if (message.value !== "${default}" || this.isIntelliSenseModeDefined) {
this.configValues.intelliSenseMode = message.value;
} else {
this.configValues.intelliSenseMode = undefined;
}
break;
case elementId.cStandard:
this.configValues.cStandard = message.value;
break;
case elementId.cppStandard:
this.configValues.cppStandard = message.value;
break;
}
this.configValuesChanged.fire();
}
private getHtml(): string {
let content: string | undefined;
content = fs.readFileSync(util.getExtensionFilePath("ui/settings.html")).toString();
content = content.replace(
/{{root}}/g,
vscode.Uri.file(util.extensionPath)
.with({ scheme: 'vscode-resource' })
.toString());
content = content.replace(
/{{nonce}}/g,
this.getNonce());
return content;
}
private getNonce(): string {
let nonce: string;
const possible: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (let i: number = 0; i < 32; i++) {
nonce += possible.charAt(Math.floor(Math.random() * possible.length));
}
return nonce;
}
}
@@ -0,0 +1,190 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as vscode from 'vscode';
import * as util from '../common';
/**
* track settings changes for telemetry
*/
type FilterFunction = (key: string, val: string, settings: vscode.WorkspaceConfiguration) => boolean;
type KeyValuePair = { key: string; value: string };
const maxSettingLengthForTelemetry: number = 50;
let cache: SettingsTracker = undefined;
export class SettingsTracker {
private previousCppSettings: { [key: string]: any } = {};
private resource: vscode.Uri;
constructor(resource: vscode.Uri) {
this.resource = resource;
this.collectSettings(() => true);
}
public getUserModifiedSettings(): { [key: string]: string } {
let filter: FilterFunction = (key: string, val: string, settings: vscode.WorkspaceConfiguration) => {
return !this.areEqual(val, settings.inspect(key).defaultValue);
};
return this.collectSettings(filter);
}
public getChangedSettings(): { [key: string]: string } {
let filter: FilterFunction = (key: string, val: string) => {
return !(key in this.previousCppSettings) || !this.areEqual(val, this.previousCppSettings[key]);
};
return this.collectSettings(filter);
}
private collectSettings(filter: FilterFunction): { [key: string]: string } {
let settings: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("C_Cpp", this.resource);
let result: { [key: string]: string } = {};
for (let key in settings) {
let val: any = this.getSetting(settings, key);
if (val === undefined) {
continue;
}
if (val instanceof Object && !(val instanceof Array)) {
for (let subKey in val) {
let newKey: string = key + "." + subKey;
let subVal: any = this.getSetting(settings, newKey);
if (subVal === undefined) {
continue;
}
let entry: KeyValuePair = this.filterAndSanitize(newKey, subVal, settings, filter);
if (entry && entry.key && entry.value) {
result[entry.key] = entry.value;
}
}
continue;
}
let entry: KeyValuePair = this.filterAndSanitize(key, val, settings, filter);
if (entry && entry.key && entry.value) {
result[entry.key] = entry.value;
}
}
return result;
}
private getSetting(settings: vscode.WorkspaceConfiguration, key: string): any {
// Ignore methods and settings that don't exist
if (settings.inspect(key).defaultValue !== undefined) {
let val: any = settings.get(key);
if (val instanceof Object) {
return val; // It's a sub-section.
}
// Only return values that match the setting's type and enum (if applicable).
let curSetting: any = util.packageJson.contributes.configuration.properties["C_Cpp." + key];
if (curSetting) {
let type: string = this.typeMatch(val, curSetting["type"]);
if (type) {
if (type !== "string") {
return val;
}
let curEnum: any[] = curSetting["enum"];
if (curEnum && curEnum.indexOf(val) === -1) {
return "<invalid>";
}
return val;
}
}
}
return undefined;
}
private typeMatch(value: any, type?: string | string[]): string {
if (type) {
if (type instanceof Array) {
for (let i: number = 0; i < type.length; i++) {
let t: string = type[i];
if (t) {
if (typeof value === t) {
return t;
}
if (t === "array" && value instanceof Array) {
return t;
}
if (t === "null" && value === null) {
return t;
}
}
}
} else if (typeof type === "string" && typeof value === type) {
return type;
}
}
return undefined;
}
private filterAndSanitize(key: string, val: any, settings: vscode.WorkspaceConfiguration, filter: FilterFunction): KeyValuePair {
if (filter(key, val, settings)) {
let value: string;
this.previousCppSettings[key] = val;
switch (key) {
case "clang_format_style":
case "clang_format_fallbackStyle": {
let newKey: string = key + "2";
if (val) {
switch (String(val).toLowerCase()) {
case "visual studio":
case "llvm":
case "google":
case "chromium":
case "mozilla":
case "webkit":
case "file":
case "none": {
value = String(this.previousCppSettings[key]);
break;
}
default: {
value = "...";
break;
}
}
} else {
value = "null";
}
key = newKey;
break;
}
case "commentContinuationPatterns": {
value = this.areEqual(val, settings.inspect(key).defaultValue) ? "<default>" : "..."; // Track whether it's being used, but nothing specific about it.
break;
}
default: {
if (key === "clang_format_path" || key === "intelliSenseCachePath" || key.startsWith("default.")) {
value = this.areEqual(val, settings.inspect(key).defaultValue) ? "<default>" : "..."; // Track whether it's being used, but nothing specific about it.
} else {
value = String(this.previousCppSettings[key]);
}
}
}
if (value && value.length > maxSettingLengthForTelemetry) {
value = value.substr(0, maxSettingLengthForTelemetry) + "...";
}
return {key: key, value: value};
}
}
private areEqual(value1: any, value2: any): boolean {
if (value1 instanceof Object && value2 instanceof Object) {
return JSON.stringify(value1) === JSON.stringify(value2);
}
return value1 === value2;
}
}
export function getTracker(resource: vscode.Uri): SettingsTracker {
if (!cache) {
cache = new SettingsTracker(resource);
}
return cache;
}
+104 -26
View File
@@ -6,6 +6,7 @@
import * as vscode from 'vscode';
import { Client } from './client';
import { getCustomConfigProviders, CustomConfigurationProviderCollection } from './customProviders';
let ui: UI;
@@ -16,11 +17,24 @@ interface KeyedQuickPickItem extends vscode.QuickPickItem {
key: string;
}
// Higher numbers mean greater priority.
enum ConfigurationPriority {
IncludePath = 1,
CompileCommands = 2,
CustomProvider = 3,
}
interface ConfigurationResult {
configured: boolean;
priority: ConfigurationPriority;
}
export class UI {
private navigationStatusBarItem: vscode.StatusBarItem;
private configStatusBarItem: vscode.StatusBarItem;
private browseEngineStatusBarItem: vscode.StatusBarItem;
private intelliSenseStatusBarItem: vscode.StatusBarItem;
private configurationUIPromise: Thenable<ConfigurationResult>;
constructor() {
// 1000 = priority, it needs to be high enough to be on the left of the Ln/Col.
@@ -43,7 +57,7 @@ export class UI {
this.browseEngineStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0);
this.browseEngineStatusBarItem.text = "";
this.browseEngineStatusBarItem.tooltip = "Discovering files...";
this.browseEngineStatusBarItem.color = "White";
this.browseEngineStatusBarItem.color = new vscode.ThemeColor("statusBar.foreground");
this.browseEngineStatusBarItem.command = "C_Cpp.ShowParsingCommands";
this.ShowDBIcon = true;
}
@@ -110,12 +124,15 @@ export class UI {
public activeDocumentChanged(): void {
let activeEditor: vscode.TextEditor = vscode.window.activeTextEditor;
let show: boolean = (activeEditor && (activeEditor.document.languageId === "cpp" || activeEditor.document.languageId === "c"));
let isCpp: boolean = (activeEditor && (activeEditor.document.languageId === "cpp" || activeEditor.document.languageId === "c"));
this.ShowConfiguration = show;
this.ShowDBIcon = show;
this.ShowFlameIcon = show;
this.ShowNavigation = show;
// It's sometimes desirable to see the config and icons when making settings changes.
let isSettingsJson: boolean = (activeEditor && (activeEditor.document.fileName.endsWith("c_cpp_properties.json") || activeEditor.document.fileName.endsWith("settings.json")));
this.ShowConfiguration = isCpp || isSettingsJson;
this.ShowDBIcon = isCpp || isSettingsJson;
this.ShowFlameIcon = isCpp || isSettingsJson;
this.ShowNavigation = isCpp;
}
public bind(client: Client): void {
@@ -154,18 +171,46 @@ export class UI {
for (let i: number = 0; i < configurationNames.length; i++) {
items.push({ label: configurationNames[i], description: "", index: i });
}
items.push({ label: "Edit Configurations...", description: "", index: configurationNames.length });
items.push({ label: "Edit Configurations (UI)", description: "", index: configurationNames.length });
items.push({ label: "Edit Configurations (JSON)", description: "", index: configurationNames.length + 1 });
return vscode.window.showQuickPick(items, options)
.then(selection => {
if (!selection) {
return -1;
}
return selection.index;
});
.then(selection => (selection) ? selection.index : -1);
}
public showWorkspaces(workspaceNames: { name: string, key: string }[]): Thenable<string> {
public showConfigurationProviders(currentProvider: string|null): Thenable<string|undefined> {
let options: vscode.QuickPickOptions = {};
options.placeHolder = "Select a Configuration Provider...";
let providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
let items: KeyedQuickPickItem[] = [];
providers.forEach(provider => {
let label: string = provider.name;
if (provider.extensionId === currentProvider) {
label += " (active)";
}
items.push({ label: label, description: "", key: provider.extensionId });
});
items.push({ label: "(none)", description: "Disable the active configuration provider, if applicable.", key: "" });
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.key : undefined);
}
public showCompileCommands(paths: string[]): Thenable<number> {
let options: vscode.QuickPickOptions = {};
options.placeHolder = "Select a compile_commands.json...";
let items: IndexableQuickPickItem[] = [];
for (let i: number = 0; i < paths.length; i++) {
items.push({label: paths[i], description: "", index: i});
}
return vscode.window.showQuickPick(items, options)
.then(selection => (selection) ? selection.index : -1);
}
public showWorkspaces(workspaceNames: { name: string; key: string }[]): Thenable<string> {
let options: vscode.QuickPickOptions = {};
options.placeHolder = "Select a Workspace...";
@@ -173,12 +218,7 @@ export class UI {
workspaceNames.forEach(name => items.push({ label: name.name, description: "", key: name.key }));
return vscode.window.showQuickPick(items, options)
.then(selection => {
if (!selection) {
return "";
}
return selection.key;
});
.then(selection => (selection) ? selection.key : "");
}
public showParsingCommands(): Thenable<number> {
@@ -187,19 +227,57 @@ export class UI {
let items: IndexableQuickPickItem[];
items = [];
if (this.browseEngineStatusBarItem.tooltip == "Parsing paused") {
if (this.browseEngineStatusBarItem.tooltip === "Parsing paused") {
items.push({ label: "Resume Parsing", description: "", index: 1 });
} else {
items.push({ label: "Pause Parsing", description: "", index: 0 });
}
return vscode.window.showQuickPick(items, options)
.then(selection => {
if (!selection) {
return -1;
}
return selection.index;
.then(selection => (selection) ? selection.index : -1);
}
public showConfigureIncludePathMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
setTimeout(() => {
this.showConfigurationPrompt(ConfigurationPriority.IncludePath, prompt, onSkip);
}, 10000);
}
public showConfigureCompileCommandsMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
setTimeout(() => {
this.showConfigurationPrompt(ConfigurationPriority.CompileCommands, prompt, onSkip);
}, 5000);
}
public showConfigureCustomProviderMessage(prompt: () => Thenable<boolean>, onSkip: () => void): void {
this.showConfigurationPrompt(ConfigurationPriority.CustomProvider, prompt, onSkip);
}
private showConfigurationPrompt(priority: ConfigurationPriority, prompt: () => Thenable<boolean>, onSkip: () => void): void {
let showPrompt: () => Thenable<ConfigurationResult> = async () => {
let configured: boolean = await prompt();
return Promise.resolve({
priority: priority,
configured: configured
});
};
if (this.configurationUIPromise) {
this.configurationUIPromise = this.configurationUIPromise.then(result => {
if (priority > result.priority) {
return showPrompt();
} else if (!result.configured) {
return showPrompt();
}
onSkip();
return Promise.resolve({
priority: result.priority,
configured: true
});
});
} else {
this.configurationUIPromise = showPrompt();
}
}
public dispose(): void {
+92 -77
View File
@@ -4,92 +4,107 @@
* ------------------------------------------------------------------------------------------ */
'use strict';
import * as url from 'url';
import * as https from 'https';
import { ClientRequest } from 'http';
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as util from './common';
import * as Telemetry from './telemetry';
import { PersistentState } from './LanguageServer/persistentState';
import * as fs from 'fs';
const userBucketMax: number = 100;
const userBucketString: string = "CPP.UserBucket";
const localConfigFile: string = "cpptools.json";
export function activate(context: vscode.ExtensionContext): void {
if (context.globalState.get<number>(userBucketString, -1) == -1) {
let bucket: number = Math.floor(Math.random() * userBucketMax) + 1; // Range is [1, userBucketMax].
context.globalState.update(userBucketString, bucket);
}
interface Settings {
defaultIntelliSenseEngine?: number;
recursiveIncludes?: number;
gotoDefIntelliSense?: number;
}
export class ABTestSettings {
private settings: Settings;
private intelliSenseEngineDefault: PersistentState<number>;
private recursiveIncludesDefault: PersistentState<number>;
private gotoDefIntelliSenseDefault: PersistentState<number>;
private bucket: PersistentState<number>;
constructor() {
this.intelliSenseEngineDefault = new PersistentState<number>("ABTest.1", 100);
this.recursiveIncludesDefault = new PersistentState<number>("ABTest.2", 100);
this.gotoDefIntelliSenseDefault = new PersistentState<number>("ABTest.3", 100);
this.settings = {
defaultIntelliSenseEngine: this.intelliSenseEngineDefault.Value,
recursiveIncludes: this.recursiveIncludesDefault.Value,
gotoDefIntelliSense: this.gotoDefIntelliSenseDefault.Value
};
this.bucket = new PersistentState<number>(userBucketString, -1);
if (this.bucket.Value === -1) {
this.bucket.Value = Math.floor(Math.random() * userBucketMax) + 1; // Range is [1, userBucketMax].
}
this.updateSettings();
// Redownload cpptools.json after initialization so it's not blocked.
// It'll be used the next time the extension reloads.
this.downloadCpptoolsJsonPkgAsync();
setInterval(() => {
// Redownload occasionally to prevent an extra reload during long sessions.
downloadCpptoolsJsonPkg();
}, 30 * 60 * 1000); // 30 minutes.
}
setInterval(() => { this.downloadCpptoolsJsonPkgAsync(); }, 30 * 60 * 1000); // 30 minutes.
}
// NOTE: Code is copied from DownloadPackage in packageManager.ts, but with ~75% fewer lines.
function downloadCpptoolsJson(urlString): Promise<void> {
return new Promise<void>((resolve, reject) => {
let parsedUrl: url.Url = url.parse(urlString);
let request: ClientRequest = https.request({
host: parsedUrl.host,
path: parsedUrl.path,
agent: util.GetHttpsProxyAgent(),
rejectUnauthorized: vscode.workspace.getConfiguration().get("http.proxyStrictSSL", true)
}, (response) => {
if (response.statusCode == 301 || response.statusCode == 302) {
let redirectUrl: string | string[];
if (typeof response.headers.location === "string") {
redirectUrl = response.headers.location;
} else {
redirectUrl = response.headers.location[0];
}
return resolve(downloadCpptoolsJson(redirectUrl)); // Redirect - download from new location
public get UseDefaultIntelliSenseEngine(): boolean {
return util.isNumber(this.settings.defaultIntelliSenseEngine) ? this.settings.defaultIntelliSenseEngine >= this.bucket.Value : true;
}
public get UseRecursiveIncludes(): boolean {
return util.isNumber(this.settings.recursiveIncludes) ? this.settings.recursiveIncludes >= this.bucket.Value : true;
}
public get UseGoToDefIntelliSense(): boolean {
return util.isNumber(this.settings.gotoDefIntelliSense) ? this.settings.gotoDefIntelliSense >= this.bucket.Value : true;
}
private updateSettings(): void {
const cpptoolsJsonFile: string = util.getExtensionFilePath(localConfigFile);
try {
const exists: boolean = fs.existsSync(cpptoolsJsonFile);
if (exists) {
const fileContent: string = fs.readFileSync(cpptoolsJsonFile).toString();
let newSettings: Settings = <Settings>JSON.parse(fileContent);
this.intelliSenseEngineDefault.Value = util.isNumber(newSettings.defaultIntelliSenseEngine) ? newSettings.defaultIntelliSenseEngine : this.intelliSenseEngineDefault.DefaultValue;
this.recursiveIncludesDefault.Value = util.isNumber(newSettings.recursiveIncludes) ? newSettings.recursiveIncludes : this.recursiveIncludesDefault.DefaultValue;
this.gotoDefIntelliSenseDefault.Value = util.isNumber(newSettings.gotoDefIntelliSense) ? newSettings.gotoDefIntelliSense : this.gotoDefIntelliSenseDefault.DefaultValue;
this.settings = {
defaultIntelliSenseEngine: this.intelliSenseEngineDefault.Value,
recursiveIncludes: this.recursiveIncludesDefault.Value,
gotoDefIntelliSense: this.gotoDefIntelliSenseDefault.Value
};
}
if (response.statusCode != 200) {
return reject();
}
let downloadedBytes = 0; // tslint:disable-line
let cppToolsJsonFile: fs.WriteStream = fs.createWriteStream(util.getExtensionFilePath("cpptools.json"));
response.on('data', (data) => { downloadedBytes += data.length; });
response.on('end', () => { cppToolsJsonFile.close(); });
cppToolsJsonFile.on('close', () => { resolve(); });
response.on('error', (error) => { reject(); });
response.pipe(cppToolsJsonFile, { end: false });
});
request.on('error', (error) => { reject(); });
request.end();
});
}
export function downloadCpptoolsJsonPkg(): Promise<void> {
let hasError: boolean = false;
let telemetryProperties: { [key: string]: string } = {};
return downloadCpptoolsJson("https://go.microsoft.com/fwlink/?linkid=852750")
.catch((error) => {
// More specific error info is not likely to be helpful, and we get detailed download data from the initial install.
hasError = true;
})
.then(() => {
telemetryProperties['success'] = (!hasError).toString();
Telemetry.logDebuggerEvent("cpptoolsJsonDownload", telemetryProperties);
});
}
export function processCpptoolsJson(cpptoolsString: string): Promise<void> {
let cpptoolsObject: any = JSON.parse(cpptoolsString);
let intelliSenseEnginePercentage: number = cpptoolsObject.intelliSenseEngine_default_percentage;
if (!util.packageJson.extensionFolderPath.includes(".vscode-insiders")) {
let prevIntelliSenseEngineDefault: any = util.packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default;
if (util.extensionContext.globalState.get<number>(userBucketString, userBucketMax + 1) <= intelliSenseEnginePercentage) {
util.packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default = "Default";
} else {
util.packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default = "Tag Parser";
}
if (prevIntelliSenseEngineDefault != util.packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default) {
return util.writeFileText(util.getPackageJsonPath(), util.getPackageJsonString());
} catch (error) {
// Ignore any cpptoolsJsonFile errors
}
}
}
private downloadCpptoolsJsonPkgAsync(): Promise<void> {
let hasError: boolean = false;
let telemetryProperties: { [key: string]: string } = {};
const localConfigPath: string = util.getExtensionFilePath(localConfigFile);
return util.downloadFileToDestination("https://go.microsoft.com/fwlink/?linkid=2026205", localConfigPath)
.catch((error) => {
// More specific error info is not likely to be helpful, and we get detailed download data from the initial install.
hasError = true;
})
.then(() => {
this.updateSettings();
telemetryProperties['success'] = (!hasError).toString();
Telemetry.logDebuggerEvent("cpptoolsJsonDownload", telemetryProperties);
});
}
}
let settings: ABTestSettings;
export function getABTestSettings(): ABTestSettings {
if (!settings) {
settings = new ABTestSettings();
}
return settings;
}
+34 -8
View File
@@ -6,27 +6,35 @@
import * as vscode from 'vscode';
import * as LanguageServer from './LanguageServer/extension';
import * as util from './common';
class TemporaryCommandRegistrar {
// Used to save/re-execute commands used before the extension has activated (e.g. delayed by dependency downloading).
private delayedCommandsToExecute: Set<string>;
private tempCommands: vscode.Disposable[]; // Need to save this to unregister/dispose the temporary commands.
private isLanguageServerDisabled: boolean = false;
private isActivationReady: boolean = false;
private commandsToRegister: string[] = [
"C_Cpp.ConfigurationEdit",
"C_Cpp.ConfigurationEditJSON",
"C_Cpp.ConfigurationEditUI",
"C_Cpp.ConfigurationSelect",
"C_Cpp.ConfigurationProviderSelect",
"C_Cpp.SwitchHeaderSource",
"C_Cpp.Navigate",
"C_Cpp.GoToDeclaration",
"C_Cpp.PeekDeclaration",
"C_Cpp.ToggleErrorSquiggles",
"C_Cpp.EnableErrorSquiggles",
"C_Cpp.DisableErrorSquiggles",
"C_Cpp.ToggleIncludeFallback",
"C_Cpp.ToggleDimInactiveRegions",
"C_Cpp.ShowReleaseNotes",
"C_Cpp.ResetDatabase",
"C_Cpp.PauseParsing",
"C_Cpp.ResumeParsing",
"C_Cpp.ShowParsingCommands",
"C_Cpp.TakeSurvey"
"C_Cpp.TakeSurvey",
"C_Cpp.LogDiagnostics"
];
constructor() {
@@ -34,26 +42,44 @@ class TemporaryCommandRegistrar {
this.delayedCommandsToExecute = new Set<string>();
// Add temp commands that invoke the real commands after download/install is complete (preventing an error message)
this.commandsToRegister.forEach(command => {
this.registerTempCommand(command);
});
if (util.extensionContext) {
this.commandsToRegister.forEach(command => {
this.registerTempCommand(command);
});
}
}
public registerTempCommand(command: string): void {
this.tempCommands.push(vscode.commands.registerCommand(command, () => {
if (this.isLanguageServerDisabled) {
vscode.window.showInformationMessage("The command is disabled because \"C_Cpp.intelliSenseEngine\" is set to \"Disabled\".");
return;
}
this.delayedCommandsToExecute.add(command);
if (this.isActivationReady) {
LanguageServer.activate(true);
}
}));
}
public disableLanguageServer(): void {
this.isLanguageServerDisabled = true;
}
public activateLanguageServer(): void {
// Main activation code.
LanguageServer.activate(this.delayedCommandsToExecute.size > 0);
this.isActivationReady = true;
}
public clearTempCommands(): void {
this.tempCommands.forEach((command) => {
command.dispose();
});
this.tempCommands = [];
}
LanguageServer.activate(this.delayedCommandsToExecute.size > 0);
public executeDelayedCommands(): void {
this.delayedCommandsToExecute.forEach((command) => {
vscode.commands.executeCommand(command);
});
+484 -39
View File
@@ -13,23 +13,152 @@ import HttpsProxyAgent = require('https-proxy-agent');
import * as url from 'url';
import { PlatformInformation } from './platform';
import { getOutputChannelLogger, showOutputChannel } from './logger';
import * as assert from 'assert';
import * as https from 'https';
import { ClientRequest, OutgoingHttpHeaders } from 'http';
import { getBuildTasks } from './LanguageServer/extension';
import { OtherSettings } from './LanguageServer/settings';
export let extensionPath: string;
export let extensionContext: vscode.ExtensionContext;
export function setExtensionContext(context: vscode.ExtensionContext): void {
extensionContext = context;
extensionPath = extensionContext.extensionPath;
}
export function setExtensionPath(path: string): void {
extensionPath = path;
}
export let packageJson: any = vscode.extensions.getExtension("ms-vscode.cpptools").packageJSON;
export const failedToParseTasksJson: string = "Failed to parse tasks.json, possibly due to comments or trailing commas.";
// Use this package.json to read values
export const packageJson: any = vscode.extensions.getExtension("ms-vscode.cpptools").packageJSON;
// Use getRawPackageJson to read and write back to package.json
// This prevents obtaining any of VSCode's expanded variables.
let rawPackageJson: any = null;
export function getRawPackageJson(): any {
if (rawPackageJson === null) {
const fileContents: Buffer = fs.readFileSync(getPackageJsonPath());
rawPackageJson = JSON.parse(fileContents.toString());
}
return rawPackageJson;
}
export function getRawTasksJson(): Promise<any> {
const path: string = getTasksJsonPath();
if (!path) {
return undefined;
}
return new Promise<any>((resolve, reject) => {
fs.exists(path, exists => {
if (!exists) {
return resolve({});
}
let fileContents: string = fs.readFileSync(path).toString();
fileContents = fileContents.replace(/^\s*\/\/.*$/gm, ""); // Remove start of line // comments.
let rawTasks: any = {};
try {
rawTasks = JSON.parse(fileContents);
} catch (error) {
return reject(new Error(failedToParseTasksJson));
}
resolve(rawTasks);
});
});
}
export async function ensureBuildTaskExists(taskName: string): Promise<void> {
let rawTasksJson: any = await getRawTasksJson();
// Ensure that the task exists in the user's task.json. Task will not be found otherwise.
if (!rawTasksJson.tasks) {
rawTasksJson.tasks = new Array();
}
// Find or create the task which should be created based on the selected "debug configuration".
let selectedTask: vscode.Task = rawTasksJson.tasks.find(task => {
return task.label && task.label === task;
});
if (selectedTask) {
return;
}
const buildTasks: vscode.Task[] = await getBuildTasks(false);
selectedTask = buildTasks.find(task => task.name === taskName);
console.assert(selectedTask);
rawTasksJson.version = "2.0.0";
if (!rawTasksJson.tasks.find(task => { return task.label === selectedTask.definition.label; })) {
rawTasksJson.tasks.push(selectedTask.definition);
}
// TODO: It's dangerous to overwrite this file. We could be wiping out comments.
let settings: OtherSettings = new OtherSettings();
await writeFileText(getTasksJsonPath(), JSON.stringify(rawTasksJson, null, settings.editorTabSize));
}
export function fileIsCOrCppSource(file: string): boolean {
const fileExtLower: string = path.extname(file).toLowerCase();
return [".C", ".c", ".cpp", ".cc", ".cxx", ".mm", ".ino", ".inl"].some(ext => fileExtLower === ext);
}
// This function is used to stringify the rawPackageJson.
// Do not use with util.packageJson or else the expanded
// package.json will be written back.
export function stringifyPackageJson(packageJson: string): string {
return JSON.stringify(packageJson, null, 2);
}
export function getExtensionFilePath(extensionfile: string): string {
return path.resolve(extensionContext.extensionPath, extensionfile);
return path.resolve(extensionPath, extensionfile);
}
export function getPackageJsonPath(): string {
return getExtensionFilePath("package.json");
}
export function getPackageJsonString(): string {
packageJson.main = "./out/src/main"; // Needs to be reset, because the relative path is removed by VS Code.
return JSON.stringify(packageJson, null, 2);
export function getTasksJsonPath(): string {
const editor: vscode.TextEditor = vscode.window.activeTextEditor;
const folder: vscode.WorkspaceFolder = vscode.workspace.getWorkspaceFolder(editor.document.uri);
if (!folder) {
return undefined;
}
return path.join(folder.uri.fsPath, ".vscode", "tasks.json");
}
export function getVcpkgPathDescriptorFile(): string {
if (process.platform === 'win32') {
return path.join(process.env.LOCALAPPDATA, "vcpkg/vcpkg.path.txt");
} else {
return path.join(process.env.HOME, ".vcpkg/vcpkg.path.txt");
}
}
let vcpkgRoot: string;
export function getVcpkgRoot(): string {
if (!vcpkgRoot && vcpkgRoot !== "") {
vcpkgRoot = "";
// Check for vcpkg instance.
if (fs.existsSync(getVcpkgPathDescriptorFile())) {
let vcpkgRootTemp: string = fs.readFileSync(getVcpkgPathDescriptorFile()).toString();
vcpkgRootTemp = vcpkgRootTemp.trim();
if (fs.existsSync(vcpkgRootTemp)) {
vcpkgRoot = path.join(vcpkgRootTemp, "/installed").replace(/\\/g, "/");
}
}
}
return vcpkgRoot;
}
/**
* This is a fuzzy determination of whether a uri represents a header file.
* For the purposes of this function, a header file has no extension, or an extension that begins with the letter 'h'.
* @param document The document to check.
*/
export function isHeader(uri: vscode.Uri): boolean {
let ext: string = path.extname(uri.fsPath);
return !ext || ext.startsWith(".h") || ext.startsWith(".H");
}
// Extension is ready if install.lock exists and debugAdapters folder exist.
@@ -45,7 +174,7 @@ export const extensionNotReadyString: string = 'The C/C++ extension is still ins
export function displayExtensionNotReadyPrompt(): void {
if (!isExtensionNotReadyPromptDisplayed) {
isExtensionNotReadyPromptDisplayed = true;
isExtensionNotReadyPromptDisplayed = true;
showOutputChannel();
getOutputChannelLogger().showInformationMessage(extensionNotReadyString).then(
@@ -71,15 +200,15 @@ let installProgressStr: string = "CPP." + packageJson.version + ".Progress";
let intelliSenseProgressStr: string = "CPP." + packageJson.version + ".IntelliSenseProgress";
export function getProgress(): number {
return extensionContext.globalState.get<number>(installProgressStr, -1);
return extensionContext ? extensionContext.globalState.get<number>(installProgressStr, -1) : -1;
}
export function getIntelliSenseProgress(): number {
return extensionContext.globalState.get<number>(intelliSenseProgressStr, -1);
return extensionContext ? extensionContext.globalState.get<number>(intelliSenseProgressStr, -1) : -1;
}
export function setProgress(progress: number): void {
if (getProgress() < progress) {
if (extensionContext && getProgress() < progress) {
extensionContext.globalState.update(installProgressStr, progress);
let telemetryProperties: { [key: string]: string } = {};
let progressName: string;
@@ -96,7 +225,7 @@ export function setProgress(progress: number): void {
}
export function setIntelliSenseProgress(progress: number): void {
if (getIntelliSenseProgress() < progress) {
if (extensionContext && getIntelliSenseProgress() < progress) {
extensionContext.globalState.update(intelliSenseProgressStr, progress);
let telemetryProperties: { [key: string]: string } = {};
let progressName: string;
@@ -114,27 +243,114 @@ export function getProgressExecutableSuccess(): number { return progressExecutab
export function getProgressParseRootSuccess(): number { return progressParseRootSuccess; } // Parse root was successful (i.e. not blocked by processing taking too long).
export function getProgressIntelliSenseNoSquiggles(): number { return progressIntelliSenseNoSquiggles; } // IntelliSense was successful and the user got no squiggles.
export function showReleaseNotes(): void {
vscode.commands.executeCommand('vscode.previewHtml', vscode.Uri.file(getExtensionFilePath("ReleaseNotes.html")), vscode.ViewColumn.One, "C/C++ Extension Release Notes");
let releaseNotesPanel: vscode.WebviewPanel = undefined;
export async function showReleaseNotes(): Promise<void> {
if (releaseNotesPanel) {
releaseNotesPanel.reveal();
} else {
releaseNotesPanel = vscode.window.createWebviewPanel('releaseNotes', "C/C++ Extension Release Notes", vscode.ViewColumn.One);
releaseNotesPanel.webview.html = await readFileText(getExtensionFilePath("ReleaseNotes.html"));
releaseNotesPanel.onDidDispose(() => releaseNotesPanel = undefined, null, extensionContext.subscriptions);
}
}
export function resolveVariables(input: string): string {
if (input === null) {
export function isUri(input: any): input is vscode.Uri {
return input && input instanceof vscode.Uri;
}
export function isString(input: any): input is string {
return typeof(input) === "string";
}
export function isNumber(input: any): input is number {
return typeof(input) === "number";
}
export function isBoolean(input: any): input is boolean {
return typeof(input) === "boolean";
}
export function isArray(input: any): input is any[] {
return input instanceof Array;
}
export function isOptionalString(input: any): input is string|undefined {
return input === undefined || isString(input);
}
export function isArrayOfString(input: any): input is string[] {
return isArray(input) && input.every(item => isString(item));
}
export function isOptionalArrayOfString(input: any): input is string[]|undefined {
return input === undefined || isArrayOfString(input);
}
export function resolveVariables(input: string, additionalEnvironment: {[key: string]: string | string[]}): string {
if (!input) {
return "";
}
if (!additionalEnvironment) {
additionalEnvironment = {};
}
// Replace environment variables. (support both ${env:VAR} and ${VAR} syntax)
let regexp: RegExp = /\$\{(env:|env.)?(.*?)\}/g;
let ret: string = input.replace(regexp, (match: string, ignored: string, name: string) => {
let newValue: string = process.env[name];
return (newValue != null) ? newValue : match;
});
// Replace environment and configuration variables.
let regexp: () => RegExp = () => /\$\{((env|config|workspaceFolder)(\.|:))?(.*?)\}/g;
let ret: string = input;
let cycleCache: Set<string> = new Set();
while (!cycleCache.has(ret)) {
cycleCache.add(ret);
ret = ret.replace(regexp(), (match: string, ignored1: string, varType: string, ignored2: string, name: string) => {
// Historically, if the variable didn't have anything before the "." or ":"
// it was assumed to be an environment variable
if (varType === undefined) {
varType = "env";
}
let newValue: string;
switch (varType) {
case "env": {
let v: string | string[] = additionalEnvironment[name];
if (isString(v)) {
newValue = v;
} else if (input === match && isArrayOfString(v)) {
newValue = v.join(";");
}
if (!isString(newValue)) {
newValue = process.env[name];
}
break;
}
case "config": {
let config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration();
if (config) {
newValue = config.get<string>(name);
}
break;
}
case "workspaceFolder": {
// Only replace ${workspaceFolder:name} variables for now.
// We may consider doing replacement of ${workspaceFolder} here later, but we would have to update the language server and also
// intercept messages with paths in them and add the ${workspaceFolder} variable back in (e.g. for light bulb suggestions)
if (name && vscode.workspace && vscode.workspace.workspaceFolders) {
let folder: vscode.WorkspaceFolder = vscode.workspace.workspaceFolders.find(folder => folder.name.toLocaleLowerCase() === name.toLocaleLowerCase());
if (folder) {
newValue = folder.uri.fsPath;
}
}
break;
}
default: { assert.fail("unknown varType matched"); }
}
return (isString(newValue)) ? newValue : match;
});
}
// Resolve '~' at the start of the path.
regexp = /^\~/g;
ret = ret.replace(regexp, (match: string, name: string) => {
let newValue: string = process.env.HOME;
return (newValue != null) ? newValue : match;
regexp = () => /^\~/g;
ret = ret.replace(regexp(), (match: string, name: string) => {
let newValue: string = (process.platform === 'win32') ? process.env.USERPROFILE : process.env.HOME;
return (newValue) ? newValue : match;
});
return ret;
@@ -152,9 +368,9 @@ export function asFolder(uri: vscode.Uri): string {
* get the default open command for the current platform
*/
export function getOpenCommand(): string {
if (os.platform() == 'win32') {
if (os.platform() === 'win32') {
return 'explorer';
} else if (os.platform() == 'darwin') {
} else if (os.platform() === 'darwin') {
return '/usr/bin/open';
} else {
return '/usr/bin/xdg-open';
@@ -165,7 +381,7 @@ export function getDebugAdaptersPath(file: string): string {
return path.resolve(getExtensionFilePath("debugAdapters"), file);
}
export function GetHttpsProxyAgent(): HttpsProxyAgent {
export function getHttpsProxyAgent(): HttpsProxyAgent {
let proxy: string = vscode.workspace.getConfiguration().get<string>('http.proxy');
if (!proxy) {
proxy = process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy;
@@ -210,7 +426,7 @@ export function touchInstallLockFile(): Promise<void> {
export function touchExtensionFolder(): Promise<void> {
return new Promise<void>((resolve, reject) => {
fs.utimes(path.resolve(extensionContext.extensionPath, ".."), new Date(Date.now()), new Date(Date.now()), (err) => {
fs.utimes(path.resolve(extensionPath, ".."), new Date(Date.now()), new Date(Date.now()), (err) => {
if (err) {
reject(err);
}
@@ -233,6 +449,45 @@ export function checkFileExists(filePath: string): Promise<boolean> {
});
}
/** Test whether a directory exists */
export function checkDirectoryExists(dirPath: string): Promise<boolean> {
return new Promise((resolve, reject) => {
fs.stat(dirPath, (err, stats) => {
if (stats && stats.isDirectory()) {
resolve(true);
} else {
resolve(false);
}
});
});
}
export function checkFileExistsSync(filePath: string): boolean {
try {
return fs.statSync(filePath).isFile();
} catch (e) {
}
return false;
}
/** Test whether a directory exists */
export function checkDirectoryExistsSync(dirPath: string): boolean {
try {
return fs.statSync(dirPath).isDirectory();
} catch (e) {
}
return false;
}
/** Read the files in a directory */
export function readDir(dirPath: string): Promise<string[]> {
return new Promise((resolve) => {
fs.readdir(dirPath, (err, list) => {
resolve(list);
});
});
}
/** Test whether the lock file exists.*/
export function checkInstallLockFile(): Promise<boolean> {
return checkFileExists(getInstallLockPath());
@@ -244,10 +499,9 @@ export function readFileText(filePath: string, encoding: string = "utf8"): Promi
fs.readFile(filePath, encoding, (err, data) => {
if (err) {
reject(err);
return;
} else {
resolve(data);
}
resolve(data);
});
});
}
@@ -258,14 +512,29 @@ export function writeFileText(filePath: string, content: string, encoding: strin
fs.writeFile(filePath, content, { encoding }, (err) => {
if (err) {
reject(err);
return;
} else {
resolve();
}
resolve();
});
});
}
export function deleteFile(filePath: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
if (fs.existsSync(filePath)) {
fs.unlink(filePath, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
} else {
resolve();
}
});
}
// Get the path of the lock file. This is used to indicate that the platform-specific dependencies have been downloaded.
export function getInstallLockPath(): string {
return getExtensionFilePath("install.lock");
@@ -273,7 +542,7 @@ export function getInstallLockPath(): string {
export function getReadmeMessage(): string {
const readmePath: string = getExtensionFilePath("README.md");
const readmeMessage: string = `Please refer to ${readmePath} for troubleshooting information. Issues can be created at https://github.com/Microsoft/vscppsamples/issues`;
const readmeMessage: string = `Please refer to ${readmePath} for troubleshooting information. Issues can be created at https://github.com/Microsoft/vscode-cpptools/issues`;
return readmeMessage;
}
@@ -350,7 +619,7 @@ export function spawnChildProcess(process: string, args: string[], workingDirect
export function allowExecution(file: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
if (process.platform != 'win32') {
if (process.platform !== 'win32') {
checkFileExists(file).then((exists: boolean) => {
if (exists) {
fs.chmod(file, '755', (err: NodeJS.ErrnoException) => {
@@ -376,7 +645,7 @@ export function removePotentialPII(str: string): string {
let words: string[] = str.split(" ");
let result: string = "";
for (let word of words) {
if (word.indexOf(".") == -1 && word.indexOf("/") == -1 && word.indexOf("\\") == -1 && word.indexOf(":") == -1) {
if (word.indexOf(".") === -1 && word.indexOf("/") === -1 && word.indexOf("\\") === -1 && word.indexOf(":") === -1) {
result += word + " ";
} else {
result += "? ";
@@ -386,9 +655,185 @@ export function removePotentialPII(str: string): string {
}
export function checkDistro(platformInfo: PlatformInformation): void {
if (platformInfo.platform != 'win32' && platformInfo.platform != 'linux' && platformInfo.platform != 'darwin') {
if (platformInfo.platform !== 'win32' && platformInfo.platform !== 'linux' && platformInfo.platform !== 'darwin') {
// this should never happen because VSCode doesn't run on FreeBSD
// or SunOS (the other platforms supported by node)
getOutputChannelLogger().appendLine(`Warning: Debugging has not been tested for this platform. ${getReadmeMessage()}`);
}
}
}
export async function unlinkPromise(fileName: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
fs.unlink(fileName, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
export async function renamePromise(oldName: string, newName: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
fs.rename(oldName, newName, err => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
export function promptForReloadWindowDueToSettingsChange(): void {
promptReloadWindow("Reload the workspace for the settings change to take effect.");
}
export function promptReloadWindow(message: string): void {
let reload: string = "Reload";
vscode.window.showInformationMessage(message, reload).then((value: string) => {
if (value === reload) {
vscode.commands.executeCommand("workbench.action.reloadWindow");
}
});
}
export function downloadFileToDestination(urlStr: string, destinationPath: string, headers?: OutgoingHttpHeaders): Promise<void> {
return new Promise<void>((resolve, reject) => {
let parsedUrl: url.Url = url.parse(urlStr);
let request: ClientRequest = https.request({
host: parsedUrl.host,
path: parsedUrl.path,
agent: getHttpsProxyAgent(),
rejectUnauthorized: vscode.workspace.getConfiguration().get('http.proxyStrictSSL', true),
headers: headers
}, (response) => {
if (response.statusCode === 301 || response.statusCode === 302) { // If redirected
// Download from new location
let redirectUrl: string;
if (typeof response.headers.location === 'string') {
redirectUrl = response.headers.location;
} else {
redirectUrl = response.headers.location[0];
}
return resolve(downloadFileToDestination(redirectUrl, destinationPath, headers));
}
if (response.statusCode !== 200) { // If request is not successful
return reject();
}
// Write file using downloaded data
let createdFile: fs.WriteStream = fs.createWriteStream(destinationPath);
createdFile.on('finish', () => { resolve(); });
response.on('error', (error) => { reject(error); });
response.pipe(createdFile);
});
request.on('error', (error) => { reject(error); });
request.end();
});
}
export function downloadFileToStr(urlStr: string, headers?: OutgoingHttpHeaders): Promise<any> {
return new Promise<string>((resolve, reject) => {
let parsedUrl: url.Url = url.parse(urlStr);
let request: ClientRequest = https.request({
host: parsedUrl.host,
path: parsedUrl.path,
agent: getHttpsProxyAgent(),
rejectUnauthorized: vscode.workspace.getConfiguration().get('http.proxyStrictSSL', true),
headers: headers
}, (response) => {
if (response.statusCode === 301 || response.statusCode === 302) { // If redirected
// Download from new location
let redirectUrl: string;
if (typeof response.headers.location === 'string') {
redirectUrl = response.headers.location;
} else {
redirectUrl = response.headers.location[0];
}
return resolve(downloadFileToStr(redirectUrl, headers));
}
if (response.statusCode !== 200) { // If request is not successful
return reject();
}
let downloadedData: string = '';
response.on('data', (data) => { downloadedData += data; });
response.on('error', (error) => { reject(error); });
response.on('end', () => { resolve(downloadedData); });
});
request.on('error', (error) => { reject(error); });
request.end();
});
}
export interface CompilerPathAndArgs {
compilerPath: string;
additionalArgs: string[];
}
export function extractCompilerPathAndArgs(inputCompilerPath: string): CompilerPathAndArgs {
let compilerPath: string = inputCompilerPath;
let additionalArgs: string[];
let isWindows: boolean = os.platform() === 'win32';
if (compilerPath) {
if (compilerPath.startsWith("\"")) {
let endQuote: number = compilerPath.substr(1).search("\"") + 1;
if (endQuote !== -1) {
additionalArgs = compilerPath.substr(endQuote + 1).split(" ");
additionalArgs = additionalArgs.filter((arg: string) => { return arg.trim().length !== 0; }); // Remove empty args.
compilerPath = compilerPath.substr(1, endQuote - 1);
}
} else {
// Go from right to left checking if a valid path is to the left of a space.
let spaceStart: number = compilerPath.lastIndexOf(" ");
if (spaceStart !== -1 && (!isWindows || !compilerPath.endsWith("cl.exe")) && !checkFileExistsSync(compilerPath)) {
let potentialCompilerPath: string = compilerPath.substr(0, spaceStart);
while ((!isWindows || !potentialCompilerPath.endsWith("cl.exe")) && !checkFileExistsSync(potentialCompilerPath)) {
spaceStart = potentialCompilerPath.lastIndexOf(" ");
if (spaceStart === -1) {
// Reached the start without finding a valid path. Use the original value.
potentialCompilerPath = compilerPath;
break;
}
potentialCompilerPath = potentialCompilerPath.substr(0, spaceStart);
}
if (compilerPath !== potentialCompilerPath) {
// Found a valid compilerPath and args.
additionalArgs = compilerPath.substr(spaceStart + 1).split(" ");
additionalArgs = additionalArgs.filter((arg: string) => { return arg.trim().length !== 0; }); // Remove empty args.
compilerPath = potentialCompilerPath;
}
}
}
}
return { compilerPath, additionalArgs };
}
export function escapeForSquiggles(s: string): string {
// Replace all \<escape character> with \\<character>, except for \"
// Otherwise, the JSON.parse result will have the \<escape character> missing.
let newResults: string = "";
let lastWasBackslash: Boolean = false;
let lastBackslashWasEscaped: Boolean = false;
for (let i: number = 0; i < s.length; i++) {
if (s[i] === '\\') {
if (lastWasBackslash) {
newResults += "\\";
lastBackslashWasEscaped = !lastBackslashWasEscaped;
} else {
lastBackslashWasEscaped = false;
}
newResults += "\\";
lastWasBackslash = true;
} else {
if (lastWasBackslash && (lastBackslashWasEscaped || (s[i] !== '"'))) {
newResults += "\\";
}
lastWasBackslash = false;
lastBackslashWasEscaped = false;
newResults += s[i];
}
}
if (lastWasBackslash) {
newResults += "\\";
}
return newResults;
}
+124
View File
@@ -0,0 +1,124 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import { CustomConfigurationProvider, Version } from 'vscode-cpptools';
import { CppToolsTestApi, CppToolsTestHook } from 'vscode-cpptools/out/testApi';
import { CustomConfigurationProvider1, getCustomConfigProviders, CustomConfigurationProviderCollection } from './LanguageServer/customProviders';
import { getOutputChannel } from './logger';
import * as LanguageServer from './LanguageServer/extension';
import * as test from './testHook';
export class CppTools implements CppToolsTestApi {
private version: Version;
private providers: CustomConfigurationProvider1[] = [];
private failedRegistrations: CustomConfigurationProvider[] = [];
private timers = new Map<string, NodeJS.Timer>();
constructor(version: Version) {
if (version > Version.latest) {
console.warn(`version ${version} is not supported by this version of cpptools`);
console.warn(` using ${Version.latest} instead`);
version = Version.latest;
}
this.version = version;
}
private addNotifyReadyTimer(provider: CustomConfigurationProvider1): void {
if (this.version >= Version.v2) {
const timeout: number = 30;
let timer: NodeJS.Timer = setTimeout(() => {
console.warn(`registered provider ${provider.extensionId} did not call 'notifyReady' within ${timeout} seconds`);
}, timeout * 1000);
this.timers.set(provider.extensionId, timer);
}
}
private removeNotifyReadyTimer(provider: CustomConfigurationProvider1): void {
if (this.version >= Version.v2) {
let timer: NodeJS.Timer = this.timers.get(provider.extensionId);
if (timer) {
this.timers.delete(provider.extensionId);
clearTimeout(timer);
}
}
}
public getVersion(): Version {
return this.version;
}
public registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void {
let providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
if (providers.add(provider, this.version)) {
let added: CustomConfigurationProvider1 = providers.get(provider);
getOutputChannel().appendLine(`Custom configuration provider '${added.name}' registered`);
this.providers.push(added);
LanguageServer.getClients().forEach(client => client.onRegisterCustomConfigurationProvider(added));
this.addNotifyReadyTimer(added);
} else {
this.failedRegistrations.push(provider);
}
}
public notifyReady(provider: CustomConfigurationProvider): void {
let providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
let p: CustomConfigurationProvider1 = providers.get(provider);
if (p) {
this.removeNotifyReadyTimer(p);
p.isReady = true;
LanguageServer.getClients().forEach(client => {
client.updateCustomConfigurations(p);
client.updateCustomBrowseConfiguration(p);
});
} else if (this.failedRegistrations.find(p => p === provider)) {
console.warn("provider not successfully registered, 'notifyReady' ignored");
} else {
console.warn("provider should be registered before signaling it's ready to provide configurations");
}
}
public didChangeCustomConfiguration(provider: CustomConfigurationProvider): void {
let providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
let p: CustomConfigurationProvider1 = providers.get(provider);
if (p) {
if (!p.isReady) {
console.warn("didChangeCustomConfiguration was invoked before notifyReady");
}
LanguageServer.getClients().forEach(client => client.updateCustomConfigurations(p));
} else if (this.failedRegistrations.find(p => p === provider)) {
console.warn("provider not successfully registered, 'didChangeCustomConfiguration' ignored");
} else {
console.warn("provider should be registered before sending config change messages");
}
}
public didChangeCustomBrowseConfiguration(provider: CustomConfigurationProvider): void {
let providers: CustomConfigurationProviderCollection = getCustomConfigProviders();
let p: CustomConfigurationProvider1 = providers.get(provider);
if (p) {
LanguageServer.getClients().forEach(client => client.updateCustomBrowseConfiguration(p));
} else if (this.failedRegistrations.find(p => p === provider)) {
console.warn("provider not successfully registered, 'didChangeCustomBrowseConfiguration' ignored");
} else {
console.warn("provider should be registered before sending config change messages");
}
}
public dispose(): void {
this.providers.forEach(provider => {
getCustomConfigProviders().remove(provider);
provider.dispose();
});
this.providers = [];
}
public getTestHook(): CppToolsTestHook {
return test.getTestHook();
}
}
+65
View File
@@ -0,0 +1,65 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import { CustomConfigurationProvider, Version, CppToolsApi } from 'vscode-cpptools';
import { CppToolsTestApi, CppToolsTestHook, CppToolsTestExtension } from 'vscode-cpptools/out/testApi';
import { CppTools } from './cppTools';
/**
* This class implements both interfaces since the extension returned CppToolsApi for v0,
* but returns CppToolsTestExtension for v1 and later.
*/
export class CppTools1 implements CppToolsTestApi, CppToolsTestExtension {
private backupApi: CppTools;
private get BackupApi(): CppToolsTestApi {
if (!this.backupApi) {
this.backupApi = new CppTools(Version.v0);
}
return this.backupApi;
}
getApi(version: Version): CppToolsApi {
switch (version) {
case Version.v0:
return this.BackupApi;
default:
return new CppTools(version);
}
}
getTestApi(version: Version): CppToolsTestApi {
return <CppToolsTestApi>this.getApi(version);
}
getVersion(): Version {
return this.BackupApi.getVersion();
}
registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void {
this.BackupApi.registerCustomConfigurationProvider(provider);
}
notifyReady(provider: CustomConfigurationProvider): void {
this.BackupApi.notifyReady(provider);
}
didChangeCustomConfiguration(provider: CustomConfigurationProvider): void {
this.BackupApi.didChangeCustomConfiguration(provider);
}
didChangeCustomBrowseConfiguration(provider: CustomConfigurationProvider): void {
this.BackupApi.didChangeCustomBrowseConfiguration(provider);
}
dispose(): void {
}
getTestHook(): CppToolsTestHook {
return this.BackupApi.getTestHook();
}
}
+286
View File
@@ -0,0 +1,286 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import { PackageVersion } from './packageVersion';
import * as util from './common';
import { PlatformInformation } from './platform';
import { OutgoingHttpHeaders } from 'http';
const testingInsidersVsixInstall: boolean = false; // Change this to true to enable testing of the Insiders vsix installation.
/**
* The object representation of a Build Asset. Each Asset corresponds to information about a release file on GitHub.
*/
interface Asset {
name: string;
browser_download_url: string;
}
/**
* The object representation of a release in the GitHub API's release JSON.
* Named Build so as to reduce confusion between a "Release" release and "Insiders" release.
*/
interface Build {
name: string;
assets: Asset[];
}
/**
* Search each Asset by name to retrieve the download URL for a VSIX package
* @param vsixName The name of the VSIX to search for
* @return The download URL of the VSIX
*/
function getVsixDownloadUrl(build: Build, vsixName: string): string {
const downloadUrl: string = build.assets.find(asset => {
return asset.name === vsixName;
}).browser_download_url;
if (!downloadUrl) {
throw new Error('Failed to find VSIX: ' + vsixName + ' in build: ' + build.name);
}
return downloadUrl;
}
/**
* Determine whether an object is of type Asset.
* @param input Incoming object.
* @return Whether input is of type Asset.
*/
function isAsset(input: any): input is Asset {
return input && input.name && typeof(input.name) === "string" &&
input.browser_download_url && typeof(input.browser_download_url) === "string";
}
/**
* Determine whether an object is of type Build. Note that earlier releases of the extension
* do not have 4 or greater Assets (Mac, Win, Linux 32/64). Only call this on more recent Builds.
* @param input Incoming object.
* @return Whether input is of type Build.
*/
function isBuild(input: any): input is Build {
return input && input.name && typeof(input.name) === "string" && isArrayOfAssets(input.assets) && input.assets.length >= 4;
}
/**
* Determine whether an object is of type Asset[].
* @param input Incoming object.
* @return Whether input is of type Asset[].
*/
function isArrayOfAssets(input: any): input is Asset[] {
return input instanceof Array && input.every(item => isAsset(item));
}
/**
* Determine whether an object is of type Build[].
* @param input Incoming object.
* @return Whether input is of type Build[].
*/
function isArrayOfBuilds(input: any): input is Build[] {
if (!input || !(input instanceof Array) || input.length === 0) {
return false;
}
// Only check the five most recent builds for validity -- no need to check all of them
for (let i: number = 0; i < 5 && i < input.length; i++) {
if (!isBuild(input[i])) {
return false;
}
}
return true;
}
/**
* Match the user's platform information to the VSIX name relevant to them.
* @param info Information about the user's operating system.
* @return VSIX filename for the extension's releases matched to the user's platform.
*/
function vsixNameForPlatform(info: PlatformInformation): string {
const vsixName: string = function(platformInfo): string {
switch (platformInfo.platform) {
case 'win32': return 'cpptools-win32.vsix';
case 'darwin': return 'cpptools-osx.vsix';
default: {
switch (platformInfo.architecture) {
case 'x86_64': return 'cpptools-linux.vsix';
case 'x86':
case 'i386':
case 'i686': return 'cpptools-linux32.vsix';
}
}
}
}(info);
if (!vsixName) {
throw new Error('Failed to match VSIX name for: ' + info.platform + ':' + info.architecture);
}
return vsixName;
}
/**
* Interface for return value of getTargetBuildInfo containing the download URL and version of a Build.
*/
export interface BuildInfo {
downloadUrl: string;
name: string;
}
/**
* Use the GitHub API to retrieve the download URL of the extension version the user should update to, if any.
* @param updateChannel The user's updateChannel setting.
* @return Download URL for the extension VSIX package that the user should install. If the user
* does not need to update, resolves to undefined.
*/
export async function getTargetBuildInfo(updateChannel: string): Promise<BuildInfo> {
return getReleaseJson()
.then(builds => {
if (!builds || builds.length === 0) {
return undefined;
}
// If the user version is greater than or incomparable to the latest available verion then there is no need to update
// Allows testing pre-releases without accidentally downgrading to the latest version
const userVersion: PackageVersion = new PackageVersion(util.packageJson.version);
const latestVersion: PackageVersion = new PackageVersion(builds[0].name);
if (!testingInsidersVsixInstall && (userVersion.isGreaterThan(latestVersion) || (userVersion.suffix && userVersion.suffix !== 'insiders'))) {
return undefined;
}
return getTargetBuild(builds, userVersion, updateChannel);
})
.then(async build => {
if (!build) {
return Promise.resolve(undefined);
}
try {
const platformInfo: PlatformInformation = await PlatformInformation.GetPlatformInformation();
const vsixName: string = vsixNameForPlatform(platformInfo);
const downloadUrl: string = getVsixDownloadUrl(build, vsixName);
return { downloadUrl: downloadUrl, name: build.name };
} catch (error) {
return Promise.reject(error);
}
});
}
/**
* Determines whether there exists a Build in the given Build[] that should be installed.
* @param builds The GitHub release list parsed as an array of Builds.
* @param userVersion The verion of the extension that the user is running.
* @param updateChannel The user's updateChannel setting.
* @return The Build if the user should update to it, otherwise undefined.
*/
function getTargetBuild(builds: Build[], userVersion: PackageVersion, updateChannel: string): Build {
// Get predicates to determine the build to install, if any
let needsUpdate: (installed: PackageVersion, target: PackageVersion) => boolean;
let useBuild: (build: Build) => boolean;
if (updateChannel === 'Insiders') {
needsUpdate = (installed: PackageVersion, target: PackageVersion) => { return testingInsidersVsixInstall || target.isGreaterThan(installed); };
useBuild = (build: Build): boolean => { return true; };
} else if (updateChannel === 'Default') {
needsUpdate = function(installed: PackageVersion, target: PackageVersion): boolean { return installed.isGreaterThan(target); };
useBuild = (build: Build): boolean => { return build.name.indexOf('-') === -1; };
} else {
throw new Error('Incorrect updateChannel setting provided');
}
// Get the build to install
const targetBuild: Build = builds.find((build) => useBuild(build));
if (!targetBuild) {
throw new Error('Failed to determine installation candidate');
}
// Check current version against target's version to determine if the installation should happen
const targetVersion: PackageVersion = new PackageVersion(targetBuild.name);
if (needsUpdate(userVersion, targetVersion)) {
return targetBuild;
}
return undefined;
}
interface Rate {
remaining: number;
}
interface RateLimit {
rate: Rate;
}
function isRate(input: any): input is Rate {
return input && util.isNumber(input.remaining);
}
function isRateLimit(input: any): input is RateLimit {
return input && isRate(input.rate);
}
async function getRateLimit(): Promise<RateLimit> {
const header: OutgoingHttpHeaders = { 'User-Agent': 'vscode-cpptools' };
const data: string = await util.downloadFileToStr('https://api.github.com/rate_limit', header)
.catch((error) => {
if (error && error.code && error.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download rate limit JSON');
}
});
if (!data) {
return Promise.resolve(null);
}
let rateLimit: any;
try {
rateLimit = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse rate limit JSON');
}
if (isRateLimit(rateLimit)) {
return Promise.resolve(rateLimit);
} else {
throw new Error('Rate limit JSON is not of type RateLimit');
}
}
async function rateLimitExceeded(): Promise<boolean> {
const rateLimit: RateLimit = await getRateLimit();
return rateLimit && rateLimit.rate.remaining <= 0;
}
/**
* Download and parse the release list JSON from the GitHub API into a Build[].
* @return Information about the released builds of the C/C++ extension.
*/
async function getReleaseJson(): Promise<Build[]> {
if (await rateLimitExceeded()) {
throw new Error('Failed to stay within GitHub API rate limit');
}
// Download release JSON
const releaseUrl: string = 'https://api.github.com/repos/Microsoft/vscode-cpptools/releases';
const header: OutgoingHttpHeaders = { 'User-Agent': 'vscode-cpptools' };
const data: string = await util.downloadFileToStr(releaseUrl, header)
.catch((error) => {
if (error && error.code && error.code !== "ENOENT") {
// Only throw if the user is connected to the Internet.
throw new Error('Failed to download release JSON');
}
});
if (!data) {
return Promise.resolve(null);
}
// Parse the file
let releaseJson: any;
try {
releaseJson = JSON.parse(data);
} catch (error) {
throw new Error('Failed to parse release JSON');
}
// Type check
if (isArrayOfBuilds(releaseJson)) {
return releaseJson;
} else {
throw new Error('Release JSON is not of type Build[]');
}
}
+17 -11
View File
@@ -3,8 +3,14 @@
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
export class InstallationInformation {
export enum InstallationType {
Online,
Offline
}
export class InstallationInformation {
stage: string;
type: InstallationType;
hasError: boolean;
telemetryProperties: { [key: string]: string };
@@ -14,19 +20,19 @@ export class InstallationInformation {
}
}
let installBlob: InstallationInformation ;
let installBlob: InstallationInformation;
export function initializeInstallationInformation(): void {
installBlob = new InstallationInformation ();
}
export function getInstallationInformationInstance(): InstallationInformation {
export function getInstallationInformation(): InstallationInformation {
if (!installBlob) {
installBlob = new InstallationInformation();
}
return installBlob;
}
export function setInstallationStage(stage: string): void {
if (!installBlob) {
initializeInstallationInformation();
}
installBlob.stage = stage;
getInstallationInformation().stage = stage;
}
export function setInstallationType(type: InstallationType): void {
getInstallationInformation().type = type;
}
+1 -1
View File
@@ -53,7 +53,7 @@ export class LinuxDistribution {
let keyValues: string[] = data.split(os.EOL);
for (let i: number = 0; i < keyValues.length; i++) {
let keyValue: string[] = keyValues[i].split('=');
if (keyValue.length == 2) {
if (keyValue.length === 2) {
if (keyValue[0] === idKey) {
distroName = keyValue[1];
} else if (keyValue[0] === versionKey) {
+1 -1
View File
@@ -56,7 +56,7 @@ export class Logger {
let outputChannel: vscode.OutputChannel;
export function getOutputChannel(): vscode.OutputChannel {
if (outputChannel == undefined) {
if (outputChannel === undefined) {
outputChannel = vscode.window.createOutputChannel("C/C++");
}
return outputChannel;
+101 -52
View File
@@ -13,32 +13,43 @@ import * as Telemetry from './telemetry';
import * as util from './common';
import * as vscode from 'vscode';
import { CppToolsApi, CppToolsExtension } from 'vscode-cpptools';
import { getTemporaryCommandRegistrarInstance, initializeTemporaryCommandRegistrar } from './commands';
import { PlatformInformation } from './platform';
import { PackageManager, PackageManagerError, PackageManagerWebResponseError, IPackage } from './packageManager';
import { PackageManager, PackageManagerError, IPackage } from './packageManager';
import { PersistentState } from './LanguageServer/persistentState';
import { initializeInstallationInformation, getInstallationInformationInstance, InstallationInformation, setInstallationStage } from './installationInformation';
import { getInstallationInformation, InstallationInformation, setInstallationStage, setInstallationType, InstallationType } from './installationInformation';
import { Logger, getOutputChannelLogger, showOutputChannel } from './logger';
import { CppTools1 } from './cppTools1';
const releaseNotesVersion: number = 3;
const releaseNotesVersion: number = 5;
const cppTools: CppTools1 = new CppTools1();
let languageServiceDisabled: boolean = false;
let reloadMessageShown: boolean = false;
let disposables: vscode.Disposable[] = [];
export function activate(context: vscode.ExtensionContext): void | Promise<void> {
export async function activate(context: vscode.ExtensionContext): Promise<CppToolsApi & CppToolsExtension> {
initializeTemporaryCommandRegistrar();
util.setExtensionContext(context);
Telemetry.activate();
util.setProgress(0);
cpptoolsJsonUtils.activate(context);
initializeInstallationInformation();
// Initialize the DebuggerExtension and register the related commands and providers.
DebuggerExtension.initialize();
DebuggerExtension.initialize(context);
return processRuntimeDependencies();
await processRuntimeDependencies();
return cppTools;
}
export function deactivate(): Thenable<void> {
DebuggerExtension.dispose();
Telemetry.deactivate();
disposables.forEach(d => d.dispose());
if (languageServiceDisabled) {
return;
}
return LanguageServer.deactivate();
}
@@ -47,12 +58,15 @@ async function processRuntimeDependencies(): Promise<void> {
if (installLockExists) {
// Offline Scenario: Lock file exists but package.json has not had its activationEvents rewritten.
if (util.packageJson.activationEvents && util.packageJson.activationEvents.length == 1) {
if (util.packageJson.activationEvents && util.packageJson.activationEvents.length === 1) {
try {
await offlineInstallation();
} catch (error) {
getOutputChannelLogger().showErrorMessage('The installation of the C/C++ extension failed. Please see the output window for more information.');
showOutputChannel();
// Send the failure telemetry since postInstall will not be called.
sendTelemetry(await PlatformInformation.GetPlatformInformation());
}
// The extension have been installed and activated before.
} else {
@@ -64,12 +78,16 @@ async function processRuntimeDependencies(): Promise<void> {
await onlineInstallation();
} catch (error) {
handleError(error);
// Send the failure telemetry since postInstall will not be called.
sendTelemetry(await PlatformInformation.GetPlatformInformation());
}
}
}
async function offlineInstallation(): Promise<void> {
setInstallationStage('getPlatformInfo');
setInstallationType(InstallationType.Offline);
const info: PlatformInformation = await PlatformInformation.GetPlatformInformation();
setInstallationStage('makeBinariesExecutable');
@@ -90,6 +108,7 @@ async function offlineInstallation(): Promise<void> {
async function onlineInstallation(): Promise<void> {
setInstallationStage('getPlatformInfo');
setInstallationType(InstallationType.Online);
const info: PlatformInformation = await PlatformInformation.GetPlatformInformation();
await downloadAndInstallPackages(info);
@@ -114,18 +133,22 @@ async function downloadAndInstallPackages(info: PlatformInformation): Promise<vo
let outputChannelLogger: Logger = getOutputChannelLogger();
outputChannelLogger.appendLine("Updating C/C++ dependencies...");
let statusItem: vscode.StatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right);
let packageManager: PackageManager = new PackageManager(info, outputChannelLogger, statusItem);
let packageManager: PackageManager = new PackageManager(info, outputChannelLogger);
outputChannelLogger.appendLine('');
setInstallationStage('downloadPackages');
await packageManager.DownloadPackages();
return vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: "C/C++ Extension",
cancellable: false
}, async (progress, token) => {
outputChannelLogger.appendLine('');
setInstallationStage('installPackages');
await packageManager.InstallPackages();
outputChannelLogger.appendLine('');
setInstallationStage('downloadPackages');
await packageManager.DownloadPackages(progress);
statusItem.dispose();
outputChannelLogger.appendLine('');
setInstallationStage('installPackages');
await packageManager.InstallPackages(progress);
});
}
function makeBinariesExecutable(): Promise<void> {
@@ -165,23 +188,12 @@ function touchInstallLockFile(): Promise<void> {
}
function handleError(error: any): void {
let installationInformation: InstallationInformation = getInstallationInformationInstance();
let installationInformation: InstallationInformation = getInstallationInformation();
installationInformation.hasError = true;
installationInformation.telemetryProperties['stage'] = installationInformation.stage;
let errorMessage: string;
if (error instanceof PackageManagerError) {
// If this is a WebResponse error, log the IP that it resolved from the package URL
if (error instanceof PackageManagerWebResponseError) {
let webRequestPackageError: PackageManagerWebResponseError = error;
if (webRequestPackageError.socket) {
let address: any = webRequestPackageError.socket.address();
if (address) {
installationInformation.telemetryProperties['error.targetIP'] = address.address + ':' + address.port;
}
}
}
let packageError: PackageManagerError = error;
installationInformation.telemetryProperties['error.methodName'] = packageError.methodName;
@@ -208,7 +220,7 @@ function handleError(error: any): void {
}
let outputChannelLogger: Logger = getOutputChannelLogger();
if (installationInformation.stage == 'downloadPackages') {
if (installationInformation.stage === 'downloadPackages') {
outputChannelLogger.appendLine("");
}
// Show the actual message and not the sanitized one
@@ -220,10 +232,11 @@ function handleError(error: any): void {
}
function sendTelemetry(info: PlatformInformation): boolean {
let installBlob: InstallationInformation = getInstallationInformationInstance();
let installBlob: InstallationInformation = getInstallationInformation();
const success: boolean = !installBlob.hasError;
installBlob.telemetryProperties['success'] = success.toString();
installBlob.telemetryProperties['type'] = installBlob.type === InstallationType.Online ? "online" : "offline";
if (info.distribution) {
installBlob.telemetryProperties['linuxDistroName'] = info.distribution.name;
@@ -234,7 +247,9 @@ function sendTelemetry(info: PlatformInformation): boolean {
util.setProgress(util.getProgressInstallSuccess());
let versionShown: PersistentState<number> = new PersistentState<number>("CPP.ReleaseNotesVersion", -1);
if (versionShown.Value < releaseNotesVersion) {
util.showReleaseNotes();
if (versionShown.Value !== versionShown.DefaultValue) {
util.showReleaseNotes();
}
versionShown.Value = releaseNotesVersion;
}
}
@@ -266,48 +281,82 @@ async function postInstall(info: PlatformInformation): Promise<void> {
}
async function finalizeExtensionActivation(): Promise<void> {
const cpptoolsJsonFile: string = util.getExtensionFilePath("cpptools.json");
try {
const exists: boolean = await util.checkFileExists(cpptoolsJsonFile);
if (exists) {
const cpptoolsString: string = await util.readFileText(cpptoolsJsonFile);
await cpptoolsJsonUtils.processCpptoolsJson(cpptoolsString);
}
} catch (error) {
// Ignore any cpptoolsJsonFile errors
if (vscode.workspace.getConfiguration("C_Cpp", null).get<string>("intelliSenseEngine") === "Disabled") {
languageServiceDisabled = true;
getTemporaryCommandRegistrarInstance().disableLanguageServer();
disposables.push(vscode.workspace.onDidChangeConfiguration(() => {
if (!reloadMessageShown && vscode.workspace.getConfiguration("C_Cpp", null).get<string>("intelliSenseEngine") !== "Disabled") {
reloadMessageShown = true;
util.promptForReloadWindowDueToSettingsChange();
}
}));
return;
}
disposables.push(vscode.workspace.onDidChangeConfiguration(() => {
if (!reloadMessageShown && vscode.workspace.getConfiguration("C_Cpp", null).get<string>("intelliSenseEngine") === "Disabled") {
reloadMessageShown = true;
util.promptForReloadWindowDueToSettingsChange();
}
}));
getTemporaryCommandRegistrarInstance().activateLanguageServer();
// Redownload cpptools.json after activation so it's not blocked.
// It'll be used after the extension reloads.
return cpptoolsJsonUtils.downloadCpptoolsJsonPkg();
// Update default for C_Cpp.intelliSenseEngine based on A/B testing settings.
// (this may result in rewriting the package.json file)
let packageJsonPath: string = util.getExtensionFilePath("package.json");
if (!packageJsonPath.includes(".vscode-insiders") && !packageJsonPath.includes(".vscode-exploration")) {
let abTestSettings: cpptoolsJsonUtils.ABTestSettings = cpptoolsJsonUtils.getABTestSettings();
let packageJson: any = util.getRawPackageJson();
let prevIntelliSenseEngineDefault: any = packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default;
if (abTestSettings.UseDefaultIntelliSenseEngine) {
packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default = "Default";
} else {
packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default = "Tag Parser";
}
if (prevIntelliSenseEngineDefault !== packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default) {
return util.writeFileText(util.getPackageJsonPath(), util.stringifyPackageJson(packageJson));
}
} else {
let packageJson: any = util.getRawPackageJson();
if (packageJson.contributes.configuration.properties['C_Cpp.updateChannel'].default === 'Default') {
packageJson.contributes.configuration.properties['C_Cpp.updateChannel'].default = 'Insiders';
return util.writeFileText(util.getPackageJsonPath(), util.stringifyPackageJson(packageJson));
}
}
}
function rewriteManifest(): Promise<void> {
// Replace activationEvents with the events that the extension should be activated for subsequent sessions.
util.packageJson.activationEvents = [
let packageJson: any = util.getRawPackageJson();
packageJson.activationEvents = [
"onLanguage:cpp",
"onLanguage:c",
"onCommand:extension.pickNativeProcess",
"onCommand:extension.pickRemoteNativeProcess",
"onCommand:C_Cpp.ConfigurationEdit",
"onCommand:C_Cpp.BuildAndDebugActiveFile",
"onCommand:C_Cpp.ConfigurationEditJSON",
"onCommand:C_Cpp.ConfigurationEditUI",
"onCommand:C_Cpp.ConfigurationSelect",
"onCommand:C_Cpp.ConfigurationProviderSelect",
"onCommand:C_Cpp.SwitchHeaderSource",
"onCommand:C_Cpp.Navigate",
"onCommand:C_Cpp.GoToDeclaration",
"onCommand:C_Cpp.PeekDeclaration",
"onCommand:C_Cpp.ToggleErrorSquiggles",
"onCommand:C_Cpp.EnableErrorSquiggles",
"onCommand:C_Cpp.DisableErrorSquiggles",
"onCommand:C_Cpp.ToggleIncludeFallback",
"onCommand:C_Cpp.ToggleDimInactiveRegions",
"onCommand:C_Cpp.ShowReleaseNotes",
"onCommand:C_Cpp.ResetDatabase",
"onCommand:C_Cpp.PauseParsing",
"onCommand:C_Cpp.ResumeParsing",
"onCommand:C_Cpp.ShowParsingCommands",
"onCommand:C_Cpp.TakeSurvey",
"onDebug"
"onCommand:C_Cpp.LogDiagnostics",
"onDebug",
"workspaceContains:/.vscode/c_cpp_properties.json"
];
return util.writeFileText(util.getPackageJsonPath(), util.getPackageJsonString());
return util.writeFileText(util.getPackageJsonPath(), util.stringifyPackageJson(packageJson));
}
+128 -115
View File
@@ -67,24 +67,33 @@ export class PackageManager {
public constructor(
private platformInfo: PlatformInformation,
private outputChannel?: Logger,
private statusItem?: vscode.StatusBarItem) {
private outputChannel?: Logger) {
// Ensure our temp files get cleaned up in case of error
tmp.setGracefulCleanup();
}
public DownloadPackages(): Promise<void> {
public DownloadPackages(progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
return this.GetPackages()
.then((packages) => {
return this.BuildPromiseChain(packages, (pkg) => this.DownloadPackage(pkg));
let count: number = 1;
return this.BuildPromiseChain(packages, (pkg): Promise<void> => {
const p: Promise<void> = this.DownloadPackage(pkg, `${count}/${packages.length}`, progress);
count += 1;
return p;
});
});
}
public InstallPackages(): Promise<void> {
public InstallPackages(progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
return this.GetPackages()
.then((packages) => {
return this.BuildPromiseChain(packages, (pkg) => this.InstallPackage(pkg));
.then((packages) => {
let count: number = 1;
return this.BuildPromiseChain(packages, (pkg): Promise<void> => {
const p: Promise<void> = this.InstallPackage(pkg, `${count}/${packages.length}`, progress);
count += 1;
return p;
});
});
}
/** Builds a chain of promises by calling the promiseBuilder function once per item in the list.
@@ -137,98 +146,101 @@ export class PackageManager {
});
}
private DownloadPackage(pkg: IPackage): Promise<void> {
private async DownloadPackage(pkg: IPackage, progressCount: string, progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
this.AppendChannel(`Downloading package '${pkg.description}' `);
this.SetStatusText("$(cloud-download) Downloading packages...");
this.SetStatusTooltip(`Downloading package '${pkg.description}'...`);
progress.report({message: `Downloading ${progressCount}: ${pkg.description}`});
const tmpResult: tmp.SyncResult = await this.CreateTempFile(pkg);
await this.DownloadPackageWithRetries(pkg, tmpResult, progress);
}
private async CreateTempFile(pkg: IPackage): Promise<tmp.SyncResult> {
return new Promise<tmp.SyncResult>((resolve, reject) => {
tmp.file({ prefix: "package-" }, (err, path, fd, cleanupCallback) => {
if (err) {
return reject(new PackageManagerError('Error from temp.file', 'DownloadPackage', pkg, err));
}
resolve(<tmp.SyncResult>{ name: path, fd: fd, removeCallback: cleanupCallback });
return resolve(<tmp.SyncResult>{ name: path, fd: fd, removeCallback: cleanupCallback });
});
})
.then((tmpResult) => {
pkg.tmpFile = tmpResult;
});
}
let lastError: any = null;
let retryCount: number = 0;
let handleDownloadFailure: (num: any, error: any) => void = (num, error) => {
retryCount = num;
lastError = error;
private async DownloadPackageWithRetries(pkg: IPackage, tmpResult: tmp.SyncResult, progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
pkg.tmpFile = tmpResult;
let success: boolean = false;
let lastError: any = null;
let retryCount: number = 0;
const MAX_RETRIES: number = 5;
// Retry the download at most MAX_RETRIES times with 2-32 seconds delay.
do {
try {
await this.DownloadFile(pkg.url, pkg, retryCount, progress);
success = true;
} catch (error) {
retryCount += 1;
lastError = error;
if (retryCount > MAX_RETRIES) {
this.AppendChannel(` Failed to download ` + pkg.url);
throw error;
} else {
this.AppendChannel(` Failed. Retrying...`);
};
// Retry the download at most 5 times with 2-32 seconds delay.
return this.DownloadFile(pkg.url, pkg, 0).catch((error) => {
handleDownloadFailure(1, error);
return this.DownloadFile(pkg.url, pkg, 1).catch((error) => {
handleDownloadFailure(2, error);
return this.DownloadFile(pkg.url, pkg, 2).catch((error) => {
handleDownloadFailure(3, error);
return this.DownloadFile(pkg.url, pkg, 3).catch((error) => {
handleDownloadFailure(4, error);
return this.DownloadFile(pkg.url, pkg, 4).catch((error) => {
handleDownloadFailure(5, error);
return this.DownloadFile(pkg.url, pkg, 5); // Last try, don't catch the error.
});
});
});
});
}).then(() => {
this.AppendLineChannel(" Done!");
if (retryCount != 0) {
// Log telemetry to see if retrying helps.
let telemetryProperties: { [key: string]: string } = {};
telemetryProperties["success"] = `OnRetry${retryCount}`;
if (lastError instanceof PackageManagerError) {
let packageError: PackageManagerError = lastError;
telemetryProperties['error.methodName'] = packageError.methodName;
telemetryProperties['error.message'] = packageError.message;
if (packageError.pkg) {
telemetryProperties['error.packageName'] = packageError.pkg.description;
telemetryProperties['error.packageUrl'] = packageError.pkg.url;
}
if (packageError.errorCode) {
telemetryProperties['error.errorCode'] = packageError.errorCode;
}
}
Telemetry.logDebuggerEvent("acquisition", telemetryProperties);
}
});
});
continue;
}
}
} while (!success && retryCount < MAX_RETRIES);
this.AppendLineChannel(" Done!");
if (retryCount !== 0) {
// Log telemetry to see if retrying helps.
let telemetryProperties: { [key: string]: string } = {};
telemetryProperties["success"] = success ? `OnRetry${retryCount}` : 'false';
if (lastError instanceof PackageManagerError) {
let packageError: PackageManagerError = lastError;
telemetryProperties['error.methodName'] = packageError.methodName;
telemetryProperties['error.message'] = packageError.message;
if (packageError.pkg) {
telemetryProperties['error.packageName'] = packageError.pkg.description;
telemetryProperties['error.packageUrl'] = packageError.pkg.url;
}
if (packageError.errorCode) {
telemetryProperties['error.errorCode'] = packageError.errorCode;
}
}
Telemetry.logDebuggerEvent("acquisition", telemetryProperties);
}
}
// reloadCpptoolsJson in main.ts uses ~25% of this function.
private DownloadFile(urlString: any, pkg: IPackage, delay: number): Promise<void> {
private DownloadFile(urlString: any, pkg: IPackage, delay: number, progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
let parsedUrl: url.Url = url.parse(urlString);
let proxyStrictSSL: any = vscode.workspace.getConfiguration().get("http.proxyStrictSSL", true);
let options: https.RequestOptions = {
host: parsedUrl.host,
path: parsedUrl.path,
agent: util.GetHttpsProxyAgent(),
agent: util.getHttpsProxyAgent(),
rejectUnauthorized: proxyStrictSSL
};
return new Promise<void>((resolve, reject) => {
let secondsDelay: number = Math.pow(2, delay);
if (secondsDelay == 1) {
if (secondsDelay === 1) {
secondsDelay = 0;
}
if (secondsDelay > 4) {
this.AppendChannel(`Waiting ${secondsDelay} seconds...`);
}
setTimeout(() => {
if (!pkg.tmpFile || pkg.tmpFile.fd == 0) {
if (!pkg.tmpFile || pkg.tmpFile.fd === 0) {
return reject(new PackageManagerError('Temporary Package file unavailable', 'DownloadFile', pkg));
}
let handleHttpResponse: (response: IncomingMessage) => void = (response: IncomingMessage) => {
if (response.statusCode == 301 || response.statusCode == 302) {
if (response.statusCode === 301 || response.statusCode === 302) {
// Redirect - download from new location
let redirectUrl: string | string[];
if (typeof response.headers.location === "string") {
@@ -236,8 +248,8 @@ export class PackageManager {
} else {
redirectUrl = response.headers.location[0];
}
return resolve(this.DownloadFile(redirectUrl, pkg, 0));
} else if (response.statusCode != 200) {
return resolve(this.DownloadFile(redirectUrl, pkg, 0, progress));
} else if (response.statusCode !== 200) {
// Download failed - print error message
let errorMessage: string = `failed (error code '${response.statusCode}')`;
return reject(new PackageManagerWebResponseError(response.socket, 'HTTP/HTTPS Response Error', 'DownloadFile', pkg, errorMessage, response.statusCode.toString()));
@@ -250,7 +262,6 @@ export class PackageManager {
contentLength = response.headers['content-length'][0];
}
let packageSize: number = parseInt(contentLength, 10);
let downloadedBytes: number = 0;
let downloadPercentage: number = 0;
let dots: number = 0;
let tmpFile: fs.WriteStream = fs.createWriteStream(null, { fd: pkg.tmpFile.fd });
@@ -258,15 +269,6 @@ export class PackageManager {
this.AppendChannel(`(${Math.ceil(packageSize / 1024)} KB) `);
response.on('data', (data) => {
downloadedBytes += data.length;
// Update status bar item with percentage
let newPercentage: number = Math.ceil(100 * (downloadedBytes / packageSize));
if (newPercentage !== downloadPercentage) {
this.SetStatusTooltip(`Downloading package '${pkg.description}'... ${downloadPercentage}%`);
downloadPercentage = newPercentage;
}
// Update dots after package name in output console
let newDots: number = Math.ceil(downloadPercentage / 5);
if (newDots > dots) {
@@ -276,11 +278,11 @@ export class PackageManager {
});
response.on('end', () => {
resolve();
return resolve();
});
response.on('error', (error) => {
reject(new PackageManagerWebResponseError(response.socket, 'HTTP/HTTPS Response error', 'DownloadFile', pkg, error.stack, error.name));
return reject(new PackageManagerWebResponseError(response.socket, 'HTTP/HTTPS Response error', 'DownloadFile', pkg, error.stack, error.name));
});
// Begin piping data from the response to the package file
@@ -291,7 +293,7 @@ export class PackageManager {
let request: ClientRequest = https.request(options, handleHttpResponse);
request.on('error', (error) => {
reject(new PackageManagerError('HTTP/HTTPS Request error' + (urlString.includes("fwlink") ? ": fwlink" : ""), 'DownloadFile', pkg, error.stack, error.message));
return reject(new PackageManagerError('HTTP/HTTPS Request error' + (urlString.includes("fwlink") ? ": fwlink" : ""), 'DownloadFile', pkg, error.stack, error.message));
});
// Execute the request
@@ -300,14 +302,13 @@ export class PackageManager {
});
}
private InstallPackage(pkg: IPackage): Promise<void> {
private InstallPackage(pkg: IPackage, progressCount: string, progress: vscode.Progress<{message?: string; increment?: number}>): Promise<void> {
this.AppendLineChannel(`Installing package '${pkg.description}'`);
this.SetStatusText("$(desktop-download) Installing packages...");
this.SetStatusTooltip(`Installing package '${pkg.description}'`);
progress.report({message: `Installing ${progressCount}: ${pkg.description}`});
return new Promise<void>((resolve, reject) => {
if (!pkg.tmpFile || pkg.tmpFile.fd == 0) {
if (!pkg.tmpFile || pkg.tmpFile.fd === 0) {
return reject(new PackageManagerError('Downloaded file unavailable', 'InstallPackage', pkg));
}
@@ -316,6 +317,15 @@ export class PackageManager {
return reject(new PackageManagerError('Zip file error', 'InstallPackage', pkg, err));
}
// setup zip file events
zipfile.on('end', () => {
return resolve();
});
zipfile.on('error', err => {
return reject(new PackageManagerError('Zip File Error', 'InstallPackage', pkg, err, err.code));
});
zipfile.readEntry();
zipfile.on('entry', (entry: yauzl.Entry) => {
@@ -334,31 +344,57 @@ export class PackageManager {
util.checkFileExists(absoluteEntryPath).then((exists: boolean) => {
if (!exists) {
// File - extract it
zipfile.openReadStream(entry, (err, readStream) => {
zipfile.openReadStream(entry, (err, readStream: fs.ReadStream) => {
if (err) {
return reject(new PackageManagerError('Error reading zip stream', 'InstallPackage', pkg, err));
}
mkdirp.mkdirp(path.dirname(absoluteEntryPath), { mode: 0o775 }, (err) => {
readStream.on('error', (err) => {
return reject(new PackageManagerError('Error in readStream', 'InstallPackage', pkg, err));
});
mkdirp.mkdirp(path.dirname(absoluteEntryPath), { mode: 0o775 }, async (err) => {
if (err) {
return reject(new PackageManagerError('Error creating directory', 'InstallPackage', pkg, err, err.code));
}
// Create as a .tmp file to avoid partially unzipped files
// counting as completed files.
let absoluteEntryTempFile: string = absoluteEntryPath + ".tmp";
if (fs.existsSync(absoluteEntryTempFile)) {
try {
await util.unlinkPromise(absoluteEntryTempFile);
} catch (err) {
return reject(new PackageManagerError(`Error unlinking file ${absoluteEntryTempFile}`, 'InstallPackage', pkg, err));
}
}
// Make sure executable files have correct permissions when extracted
let fileMode: number = (pkg.binaries && pkg.binaries.indexOf(absoluteEntryPath) !== -1) ? 0o755 : 0o664;
let writeStream: fs.WriteStream = fs.createWriteStream(absoluteEntryTempFile, { mode: fileMode });
let writeStream: fs.WriteStream = fs.createWriteStream(absoluteEntryPath, { mode: fileMode });
readStream.pipe(writeStream);
writeStream.on('close', () => {
writeStream.on('close', async () => {
try {
// Remove .tmp extension from the file.
await util.renamePromise(absoluteEntryTempFile, absoluteEntryPath);
} catch (err) {
return reject(new PackageManagerError(`Error renaming file ${absoluteEntryTempFile}`, 'InstallPackage', pkg, err));
}
// Wait till output is done writing before reading the next zip entry.
// Otherwise, it's possible to try to launch the .exe before it is done being created.
zipfile.readEntry();
});
writeStream.on('error', (err) => {
return reject(new PackageManagerError('Error in writeStream', 'InstallPackage', pkg, err));
});
readStream.pipe(writeStream);
});
});
} else {
// Skip the message for text files, because there is a duplicate text file unzipped.
if (path.extname(absoluteEntryPath) != ".txt") {
if (path.extname(absoluteEntryPath) !== ".txt") {
this.AppendLineChannel(`Warning: File '${absoluteEntryPath}' already exists and was not updated.`);
}
zipfile.readEntry();
@@ -366,20 +402,11 @@ export class PackageManager {
});
}
});
zipfile.on('end', () => {
resolve();
});
zipfile.on('error', err => {
reject(new PackageManagerError('Zip File Error', 'InstallPackage', pkg, err, err.code));
});
});
})
.then(() => {
// Clean up temp file
pkg.tmpFile.removeCallback();
});
}).then(() => {
// Clean up temp file
pkg.tmpFile.removeCallback();
});
}
private AppendChannel(text: string): void {
@@ -393,18 +420,4 @@ export class PackageManager {
this.outputChannel.appendLine(text);
}
}
private SetStatusText(text: string): void {
if (this.statusItem) {
this.statusItem.text = text;
this.statusItem.show();
}
}
private SetStatusTooltip(text: string): void {
if (this.statusItem) {
this.statusItem.tooltip = text;
this.statusItem.show();
}
}
}
+61
View File
@@ -0,0 +1,61 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All Rights Reserved.
* See 'LICENSE' in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
export class PackageVersion {
major: number;
minor: number;
patch: number;
suffix?: string;
suffixVersion: number;
constructor(version: string) {
const tokens: string[] = version.split(new RegExp('[-\\.]', 'g')); // Match against dots and dashes
if (tokens.length < 3) {
throw new Error('Failed to parse version string: ' + version);
}
this.major = parseInt(tokens[0]);
this.minor = parseInt(tokens[1]);
this.patch = parseInt(tokens[2]);
if (tokens.length > 3) {
const firstDigitOffset: number = tokens[3].search(new RegExp(/(\d)/)); // Find first occurrence of 0-9
if (firstDigitOffset !== -1) {
this.suffix = tokens[3].substring(0, firstDigitOffset);
this.suffixVersion = parseInt(tokens[3].substring(firstDigitOffset));
} else {
this.suffix = tokens[3];
this.suffixVersion = 1;
}
} else {
this.suffix = undefined;
this.suffixVersion = 0;
}
if (this.major === undefined || this.minor === undefined || this.patch === undefined) {
throw new Error('Failed to parse version string: ' + version);
}
}
public isGreaterThan(other: PackageVersion, suffixStr: string = 'insiders'): boolean {
if ((this.suffix && !this.suffix.startsWith(suffixStr)) || (other.suffix && !other.suffix.startsWith(suffixStr))) {
return false;
}
let diff: number = this.major - other.major;
if (diff) {
return diff > 0;
} else if (diff = this.minor - other.minor) {
return diff > 0;
} else if (diff = this.patch - other.patch) {
return diff > 0;
} else if (this.suffix) {
return (other.suffix && this.suffixVersion > other.suffixVersion);
} else {
return other.suffix ? true : false;
}
}
}
+1 -1
View File
@@ -39,7 +39,7 @@ export class PlatformInformation {
public static GetUnknownArchitecture(): string { return "Unknown"; }
private static GetWindowsArchitecture(): Promise<string> {
return util.execChildProcess('wmic os get osarchitecture', util.extensionContext.extensionPath)
return util.execChildProcess('wmic os get osarchitecture', util.extensionPath)
.then((architecture) => {
if (architecture) {
let archArray: string[] = architecture.split(os.EOL);
+7 -5
View File
@@ -30,23 +30,25 @@ export function deactivate(): void {
}
export function logDebuggerEvent(eventName: string, properties?: { [key: string]: string }): void {
const eventNamePrefix: string = "cppdbg/VS/Diagnostics/Debugger/";
if (telemetryReporter) {
const eventNamePrefix: string = "cppdbg/VS/Diagnostics/Debugger/";
telemetryReporter.sendTelemetryEvent(eventNamePrefix + eventName, properties);
}
}
export function logLanguageServerEvent(eventName: string, properties?: { [key: string]: string }, metrics?: { [key: string]: number }): void {
const eventNamePrefix: string = "C_Cpp/LanguageServer/";
if (telemetryReporter) {
const eventNamePrefix: string = "C_Cpp/LanguageServer/";
telemetryReporter.sendTelemetryEvent(eventNamePrefix + eventName, properties, metrics);
}
}
function createReporter(): TelemetryReporter {
let packageInfo: IPackageInfo = getPackageInfo();
if (packageInfo && packageInfo.aiKey) {
return new TelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey);
if (util.extensionContext) {
let packageInfo: IPackageInfo = getPackageInfo();
if (packageInfo && packageInfo.aiKey) {
return new TelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey);
}
}
return null;
}

Some files were not shown because too many files have changed in this diff Show More