Merge VS Code 1.26.1 (#2394)
* Squash merge commits for 1.26 (#1) (#2323) * Polish tag search as per feedback (#55269) * Polish tag search as per feedback * Updated regex * Allow users to opt-out of features that send online requests in the background (#55097) * settings sweep #54690 * Minor css tweaks to enable eoverflow elipsis in more places (#55277) * fix an issue with titlebarheight when not scaling with zoom * Settings descriptions update #54690 * fixes #55209 * Settings editor - many padding fixes * More space above level 2 label * Fixing Cannot debug npm script using Yarn #55103 * Settings editor - show ellipsis when description overflows * Settings editor - ... fix measuring around links, relayout * Setting descriptions * Settings editor - fix ... for some short lines, fix select container width * Settings editor - overlay trees so scrollable shadow is full width * Fix #54133 - missing extension settings after reload * Settings color token description tweak * Settings editor - disable overflow indicator temporarily, needs to be faster * Added command to Run the selected npm script * fixes #54452 * fixes #54929 * fixes #55248 * prefix command with extension name * Contribute run selected to the context menu * node-debug@1.26.6 * Allow terminal rendererType to be swapped out at runtime Part of #53274 Fixes #55344 * Settings editor - fix not focusing search when restoring editor setInput must be actually async. Will be fixed naturally when we aren't using winJS promises... * Settings editor - TOC should only expand the section with a selected item * Bump node-debug2 * Settings editor - Tree focus outlines * Settings editor - don't blink the scrollbar when toc selection changes And hide TOC correctly when the editor is narrow * Settings editor - header rows should not be selectable * fixes #54877 * change debug assignee to isi * Settings sweep (#54690) * workaround for #55051 * Settings sweep (#54690) * settings sweep #54690 * Don't try closing tags when you type > after another > * Describe what implementation code lens does Fixes #55370 * fix javadoc formatter setting description * fixes #55325 * update to officical TS version * Settings editor - Even more padding, use semibold instead of bold * Fix #55357 - fix TOC twistie * fixes #55288 * explorer: refresh on di change file system provider registration fixes #53256 * Disable push to Linux repo to test standalone publisher * New env var to notify log level to extensions #54001 * Disable snippets in extension search (when not in suggest dropdown) (#55281) * Disable snippits in extension search (when not in suggest dropdown) * Add monaco input contributions * Fix bug preventing snippetSuggestions from taking effect in sub-editors * Latest emmet helper to fix #52366 * Fix comment updates for threads within same file * Allow extensions to log telemetry to log files #54001 * Pull latest css grammar * files.exclude control - use same style for "add" vs "edit" * files.exclude control - focus/keyboard behavior * don't show menubar too early * files.exclude - better styling * Place cursor at end of extensions search box on autofill (#55254) * Place cursor at end of extensions search box on autofill * Use position instead of selection * fix linux build issue (empty if block) * Settings editor - fix extension category prefixes * Settings editor - add simple ellipsis for first line that overflows, doesn't cover case when first line does not overflow but there is more text, TODO * File/Text search provider docs * Fixes #52655 * Include epoch (#55008) * Fixes #53385 * Fixes #49480 * VS Code Insiders (Users) not opening Fixes #55353 * Better handling of the case when the extension host fails to start * Fixes #53966 * Remove confusing Start from wordPartLeft commands ID * vscode-xterm@3.6.0-beta12 Fixes #55488 * Initial size is set to infinity!! Fixes #55461 * Polish embeddedEditorBackground * configuration service misses event * Fix #55224 - fix duplicate results in multiroot workspace from splitting the diskseach query * Select all not working in issue reporter on mac, fixes #55424 * Disable fuzzy matching for extensions autosuggest (#55498) * Fix clipping of extensions search border in some third party themes (#55504) * fixes #55538 * Fix bug causing an aria alert to not be shown the third time (and odd numbers thereafter) * Settings editor - work around rendering glitch with webkit-line-clamp * Settings editor - revert earlier '...' changes * Settings editor - move enumDescription to its own div, because it disturbs -webkit-line-clamp for some reason * Settings editor - better overflow indicator * Don't show existing filters in autocomplete (#55495) * Dont show existing filters in autocomplete * Simplify * Settings Editor: Add aria labels for input elements Fixes: #54836 (#55543) * fixes #55223 * Update vscode-css-languageservice to 3.0.10-next.1 * Fix #55509 - settings navigation * Fix #55519 * Fix #55520 * FIx #55524 * Fix #55556 - include wordSeparators in all search queries, so findTextInFiles can respect isWordMatch correctly * oss updates for endgame * Fix unit tests * fixes #55522 * Avoid missing manifest error from bubbling up #54757 * Settings format crawl * Search provider - Fix FileSearchProvider to return array, not progress * Fix #55598 * Settings editor - fix NPE rendering settings with no description * dont render inden guides in search box (#55600) * fixes #55454 * More settings crawl * Another change for #55598 - maxResults applies to FileSearch and TextSearch but not FileIndex * Fix FileSearchProvider unit tests for progress change * fixes #55561 * Settings description update for #54690 * Update setting descriptions for online services * Minor edits * fixes #55513 * fixes #55451 * Fix #55612 - fix findTextInFiles cancellation * fixes #55539 * More setting description tweaks * Setting to disable online experiments #54354 * fixes #55507 * fixes #55515 * Show online services action only in Insiders for now * Settings editor - change toc behavior default to 'filter' * Settings editor - nicer filter count style during search * Fix #55617 - search viewlet icons * Settings editor - better styling for element count indicator * SearchProvider - fix NPE when searching extraFileResources * Allow extends to work without json suffix Fixes #16905 * Remove accessability options logic entirely Follow up on #55451 * use latest version of DAP * fixes #55490 * fixes #55122 * fixes #52332 * Avoid assumptions about git: URIs (fixes #36236) * relative path for descriptions * resourece: get rid of isFile context key fixes #48275 * Register previous ids for compatibility (#53497) * more tuning for #48275 * no need to always re-read "files explorer" fixes #52003 * read out active composites properly fixes #51967 * Update link colors for hc theme to meet color contrast ratio, fixes #55651 Also updated link color for `textLinkActiveForeground` to be the same as `textLinkForeground` as it wasn't properly updated * detect 'winpty-agent.exe'; fixes #55672 * node-debug@1.26.7 * reset counter on new label * Settings editor - fix multiple setting links in one description * Settings editor - color code blocks in setting descriptions, fix #55532 * Settings editor - hover color in TOC * Settings editor - fix navigation NPE * Settings editor - fix text control width * Settings editor - maybe fix #55684 * Fix bug causing cursor to not move on paste * fixes #53582 * Use ctrlCmd instead of ctrl for go down from search box * fixes #55264 * fixes #55456 * filter for spcaes before triggering search (#55611) * Fix #55698 - don't lose filtered TOC counts when refreshing TOC * fixes #55421 * fixes #28979 * fixes #55576 * only add check for updates to windows/linux help * readonly files: append decoration to label fixes #53022 * debug: do not show toolbar while initialising fixes #55026 * Opening launch.json should not activate debug extensions fixes #55029 * fixes #55435 * fixes #55434 * fixes #55439 * trigger menu only on altkey up * Fix #50555 - fix settings editor memory leak * Fix #55712 - no need to focus 'a' anymore when restoring control focus after tree render * fixes #55335 * proper fix for readonly model fixes #53022 * improve FoldingRangeKind spec (for #55686) * Use class with static fields (fixes #55494) * Fixes #53671 * fixes #54630 * [html] should disable ionic suggestions by default. Currently forces deprecated Ionic v1 suggestions in .html files while typing. Fixes #53324 * cleanup deps * debug issues back to andre * update electron for smoketest * Fix #55757 - prevent settings tabs from overflowing * Fix #53897 - revert setting menu defaults to old editor * Add enum descriptions to `typescript.preferences.importModuleSpecifier` * Fix #55767 - leaking style elements from settings editor * Fix #55521 - prevent flashing when clicking in exclude control * Update Git modified color for contrast ratio, fixes #53140 * Revert "Merge branch 'master' of github.com:Microsoft/vscode" This reverts commit bf46b6bfbae0cab99c2863e1244a916181fa9fbc, reversing changes made to e275a424483dfb4ed33b428c97d5e2c441d6b917. * Revert "Revert "Merge branch 'master' of github.com:Microsoft/vscode"" This reverts commit 53949d963f39e40757557c6526332354a31d9154. * don't ask to install an incomplete menu * Fix NPE in terminal AccessibilityManager Fixes #55744 * don't display fallback menu unless we've closed the last window * fixes #55547 * Fix smoke tests for extension search box * Update OSSREADME.json for Electron 2.0.5 * Update distro Includes Chromium license changes * fix #55455 * fix #55865 * fixes #55893 * Fix bug causing workspace recommendations to go away upon ignoring a recommendation (#55805) * Fix bug causing workspace recommendations to go away upon ignoring a recommendation * ONly show on @recommended or @recommended:workspace * Make more consistant * Fix #55911 * Understand json activity (#55926) * Understand json file activity * Refactoring * adding composer.json * Distro update for experiments * use terminal.processId for auto-attach; fixes #55918 * Reject invalid URI with vscode.openFolder (for #55891) * improve win32 setup system vs user detection fixes #55840 fixes #55840 delay winreg import related to #55840 show notification earlier related to #55840 fix #55840 update inno setup message related to #55840 * Fix #55593 - this code only operates on local paths, so use fsPath and Uri.file instead * Bring back the old menu due to electron 2.0 issues (#55913) * add the old menu back for native menus * make menu labels match * `vscode.openFolder`: treat missing URI schema gracefully (for #55891) * delay EH reattach; fixes #55955 * Mark all json files under appSettingsHome as settings * Use localized strings for telemetry opt-out * Exception when saving file editor opened from remote file provider (fixes #55051) * Remove terminal menu from stable Fixes 56003 * VSCode Insiders crashes on open with TypeError: Cannot read property 'lastIndexOf' of undefined. Fixes #54933 * improve fix for #55891 * fix #55916 * Improve #55891 * increase EH debugging restart delay; fixes #55955 * Revert "Don't include non-resource entries in history quick pick" This reverts commit 37209a838e9f7e9abe6dc53ed73cdf1e03b72060. * Diff editor: horizontal scrollbar height is smaller (fixes #56062) * improve openFolder uri fix (correctly treat backslashes) * fixes #56116 repair ipc for native menubar keybindings * Fix #56240 - Open the JSON settings editor instead of the UI editor * Fix #55536 * uriDisplay: if no formatter is registered fall back to getPathlabel fixes #56104 * VSCode hangs when opening python file. Fixes #56377 * VS Code Hangs When Opening Specific PowerShell File. Fixes #56430 * Fix #56433 - search extraFileResources even when no folders open * Workaround #55649 * Fix in master #56371 * Fix tests #56371 * Fix in master #56317 * increase version to 1.26.1 * Fixes #56387: Handle SIGPIPE in extension host * fixes #56185 * Fix merge issues (part 1) * Fix build breaks (part 1) * Build breaks (part 2) * Build breaks (part 3) * More build breaks (part 4) * Fix build breaks (part 5) * WIP * Fix menus * Render query result and message panels (#2363) * Put back query editor hot exit changes * Fix grid changes that broke profiler (#2365) * Update APIs for saving query editor state * Fix restore view state for profiler and edit data * Updating custom default themes to support 4.5:1 contrast ratio * Test updates * Fix Extension Manager and Windows Setup * Update license headers * Add appveyor and travis files back * Fix hidden modal dropdown issue
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 14H0V2h16v12z" id="outline"/><path class="icon-vs-bg" d="M1 3v10h14V3H1zm13 9H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6v8z" id="iconBg"/><path class="icon-vs-fg" d="M14 4v8H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6zM6.057 5.367L5.35 4.66 2 8.01l3.35 3.338.707-.707-2.139-2.146L8 8.501v-1l-4.064-.005 2.121-2.129z" id="iconFg"/></svg>
|
||||
|
After Width: | Height: | Size: 738 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2a292c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 14H0V2h16v12z" id="outline"/><path class="icon-vs-bg" d="M1 3v10h14V3H1zm13 9H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6v8z" id="iconBg"/><path class="icon-vs-fg" d="M14 4v8H8V8.507l3.998.006-2.121 2.129.707.707 3.35-3.35-3.35-3.338-.707.706 2.138 2.146L8 7.507V4h6zM6.057 5.367L5.35 4.66 2 8.01l3.35 3.338.707-.707-2.139-2.146L8 8.501v-1l-4.064-.005 2.121-2.129z" id="iconFg"/></svg>
|
||||
|
After Width: | Height: | Size: 738 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-orange{fill:#c27d1a}</style><g id="canvas"><path id="XMLID_1_" class="icon-canvas-transparent" d="M16 16H0V0h16v16z"/></g><path class="icon-vs-out" d="M16 6.586l-3-3L11.586 5H9.414l1-1-4-4h-.828L0 5.586v.828l4 4L6.414 8H7v5h1.586l3 3h.828L16 12.414v-.828L13.914 9.5 16 7.414v-.828z" id="outline"/><g id="iconBg"><path class="icon-vs-action-orange" d="M13 10l2 2-3 3-2-2 1-1H8V7H6L4 9 1 6l5-5 3 3-2 2h5l1-1 2 2-3 3-2-2 1-1H9v4l2.999.002L13 10z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 612 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 6.586l-3-3L11.586 5H9.414l1-1-4-4h-.828L0 5.586v.828l4 4L6.414 8H7v5h1.586l3 3h.828L16 12.414v-.828L13.914 9.5 16 7.414v-.828z" id="outline"/><path class="icon-vs-action-orange" d="M13 10l2 2-3 3-2-2 1-1H8V7H6L4 9 1 6l5-5 3 3-2 2h5l1-1 2 2-3 3-2-2 1-1H9v4l2.999.002L13 10z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 584 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-red{fill:#e51400}.icon-vs-yellow{fill:#ffcc00}.icon-vs-green{fill:#339933}.icon-vs-blue{fill:#1ba1e2}.icon-vs-action-purple{fill:#652d90}.icon-white{fill:#ffffff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8c0 4.411-3.589 8-8 8a2.803 2.803 0 0 1-2.8-2.8c0-.833.272-1.629.766-2.241a.596.596 0 0 0 .101-.359.667.667 0 0 0-.667-.666.58.58 0 0 0-.358.102A3.584 3.584 0 0 1 2.8 10.8 2.803 2.803 0 0 1 0 8c0-4.411 3.589-8 8-8s8 3.589 8 8z" id="outline"/><path class="icon-white" d="M5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M8 15c-.992 0-1.8-.808-1.8-1.8 0-.606.193-1.179.544-1.613.208-.259.323-.609.323-.987 0-.919-.748-1.666-1.667-1.666-.377 0-.728.115-.986.323A2.58 2.58 0 0 1 2.8 9.8C1.808 9.8 1 8.992 1 8c0-3.86 3.14-7 7-7 3.859 0 7 3.14 7 7 0 3.859-3.141 7-7 7zM5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z"/><path class="icon-vs-action-purple" d="M4.5 5.375a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-blue" d="M7.125 3.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-green" d="M10.625 4.5a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-yellow" d="M11.5 8a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-red" d="M9.75 10.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-red{fill:#ff4635}.icon-vs-yellow{fill:#ffda48}.icon-vs-green{fill:#78d278}.icon-vs-blue{fill:#37aee7}.icon-vs-action-purple{fill:#b180d7}.icon-white{fill:#000000}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 8c0 4.411-3.589 8-8 8a2.803 2.803 0 0 1-2.8-2.8c0-.833.272-1.629.766-2.241a.596.596 0 0 0 .101-.359.667.667 0 0 0-.667-.666.58.58 0 0 0-.358.102A3.584 3.584 0 0 1 2.8 10.8 2.803 2.803 0 0 1 0 8c0-4.411 3.589-8 8-8s8 3.589 8 8z" id="outline"/><path class="icon-white" d="M5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M8 15c-.992 0-1.8-.808-1.8-1.8 0-.606.193-1.179.544-1.613.208-.259.323-.609.323-.987 0-.919-.748-1.666-1.667-1.666-.377 0-.728.115-.986.323A2.58 2.58 0 0 1 2.8 9.8C1.808 9.8 1 8.992 1 8c0-3.86 3.14-7 7-7 3.859 0 7 3.14 7 7 0 3.859-3.141 7-7 7zM5.4 7.933a2.67 2.67 0 0 1 2.667 2.666c0 .606-.193 1.179-.544 1.614a1.599 1.599 0 0 0-.323.987.8.8 0 0 0 .8.8c3.309 0 6-2.691 6-6s-2.691-6-6-6-6 2.691-6 6c0 .441.359.8.8.8.378 0 .729-.114.986-.322A2.568 2.568 0 0 1 5.4 7.933z"/><path class="icon-vs-action-purple" d="M4.5 5.375a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-blue" d="M7.125 3.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-green" d="M10.625 4.5a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-yellow" d="M11.5 8a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/><path class="icon-vs-red" d="M9.75 10.625a.875.875 0 1 0 0 1.75.875.875 0 0 0 0-1.75z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M2.879 14L1 12.121V3.879L2.879 2h10.242L15 3.879v8.242L13.121 14H2.879z" id="outline"/><path class="icon-vs-fg" d="M12.293 4H3.707L3 4.707v6.586l.707.707h8.586l.707-.707V4.707L12.293 4zM11 10H5V9h6v1zm0-3H5V6h6v1z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M12.707 13H3.293L2 11.707V4.293L3.293 3h9.414L14 4.293v7.414L12.707 13zm-9-1h8.586l.707-.707V4.707L12.293 4H3.707L3 4.707v6.586l.707.707z"/><path class="icon-vs-action-blue" d="M11 7H5V6h6v1zm0 2H5v1h6V9z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 823 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M2.879 14L1 12.121V3.879L2.879 2h10.242L15 3.879v8.242L13.121 14H2.879z" id="outline"/><path class="icon-vs-fg" d="M12.293 4H3.707L3 4.707v6.586l.707.707h8.586l.707-.707V4.707L12.293 4zM11 10H5V9h6v1zm0-3H5V6h6v1z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M12.707 13H3.293L2 11.707V4.293L3.293 3h9.414L14 4.293v7.414L12.707 13zm-9-1h8.586l.707-.707V4.707L12.293 4H3.707L3 4.707v6.586l.707.707z"/><path class="icon-vs-action-blue" d="M11 7H5V6h6v1zm0 2H5v1h6V9z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 823 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#424242;} .icon-vs-fg_x0020_2{fill:#F0EFF1;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M15 16h-13v-16h8.621l4.379 4.379v11.621z" id="outline"/><path class="icon-vs-fg_x0020_2" d="M13 14h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconFg"/><path class="icon-vs-bg" d="M3 1v14h11v-10.207l-3.793-3.793h-7.207zm10 13h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 673 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-bg{fill:#c5c5c5;} .icon-vs-fg_x0020_2{fill:#F0EFF1;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M15 16h-13v-16h8.621l4.379 4.379v11.621z" id="outline"/><path class="icon-vs-fg_x0020_2" d="M13 14h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconFg"/><path class="icon-vs-bg" d="M3 1v14h11v-10.207l-3.793-3.793h-7.207zm10 13h-9v-12h5v4h4v8zm-3-9v-2.793l2.793 2.793h-2.793z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 673 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 15V6h6V2.586L7.585 1h6.829L16 2.586v5.829L14.414 10H10v5H0zm3-6z" id="outline"/><path class="icon-vs-fg" d="M8 3v3h5v1h-3v1h4V3H8zm5 2H9V4h4v1zM2 8v5h6V8H2zm5 3H3v-1h4v1z" id="iconFg"/><path class="icon-vs-action-blue" d="M10 6h3v1h-3V6zM9 4v1h4V4H9zm5-2H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1zm-7 8H3v1h4v-1zm2-3v7H1V7h8zM8 8H2v5h6V8z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 664 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 15V6h6V2.586L7.585 1h6.829L16 2.586v5.829L14.414 10H10v5H0zm3-6z" id="outline"/><path class="icon-vs-fg" d="M8 3v3h5v1h-3v1h4V3H8zm5 2H9V4h4v1zM2 8v5h6V8H2zm5 3H3v-1h4v1z" id="iconFg"/><path class="icon-vs-action-blue" d="M10 6h3v1h-3V6zM9 4v1h4V4H9zm5-2H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1zm-7 8H3v1h4v-1zm2-3v7H1V7h8zM8 8H2v5h6V8z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 664 B |
1
src/vs/editor/contrib/documentSymbols/media/Enumerator_16x.svg
Executable file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-orange{fill:#c27d1a}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14.414 1L16 2.586v5.828L14.414 10H10v3.416L8.414 15H1.586L0 13.416v-5.83L1.586 6H6V2.586L7.586 1h6.828z" id="outline"/><path class="icon-vs-fg" d="M2 13h6V8H2v5zm1-4h4v1H3V9zm0 2h4v1H3v-1zm11-5V3H8v3h.414L9 6.586V6h4v1H9.414l.586.586V8h4V6zm-1-1H9V4h4v1z" id="iconFg"/><path class="icon-vs-action-orange" d="M3 11h4.001v1H3v-1zm0-1h4.001V9H3v1zm6-2v5l-1 1H2l-1-1V8l1-1h6l1 1zM8 8H2v5h6V8zm1-2l1 1h3V6H9zm0-1h4V4H9v1zm5-3H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 789 B |
1
src/vs/editor/contrib/documentSymbols/media/Enumerator_inverse_16x.svg
Executable file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14.414 1L16 2.586v5.828L14.414 10H10v3.416L8.414 15H1.586L0 13.416v-5.83L1.586 6H6V2.586L7.586 1h6.828z" id="outline"/><path class="icon-vs-fg" d="M2 13h6V8H2v5zm1-4h4v1H3V9zm0 2h4v1H3v-1zm11-5V3H8v3h.414L9 6.586V6h4v1H9.414l.586.586V8h4V6zm-1-1H9V4h4v1z" id="iconFg"/><path class="icon-vs-action-orange" d="M3 11h4.001v1H3v-1zm0-1h4.001V9H3v1zm6-2v5l-1 1H2l-1-1V8l1-1h6l1 1zM8 8H2v5h6V8zm1-2l1 1h3V6H9zm0-1h4V4H9v1zm5-3H8L7 3v3h1V3h6v5h-4v1h4l1-1V3l-1-1z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 789 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-orange{fill:#c27d1a}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 1.414L9.414 6H14v1.414L5.414 16H3v-1.234L5.371 10H2V8.764L6.382 0H14v1.414z" id="outline" style="display: none;"/><path class="icon-vs-action-orange" d="M7 7h6l-8 8H4l2.985-6H3l4-8h6L7 7z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 499 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-orange{fill:#e8ab53}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M14 1.414L9.414 6H14v1.414L5.414 16H3v-1.234L5.371 10H2V8.764L6.382 0H14v1.414z" id="outline" style="display: none;"/><path class="icon-vs-action-orange" d="M7 7h6l-8 8H4l2.985-6H3l4-8h6L7 7z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 499 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-fg{fill:#F0EFF1;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 10.736v-6.236l9-4.5 7 3.5v6.236l-9 4.5-7-3.5z" id="outline"/><path class="icon-vs-action-blue" d="M9 1l-8 4v5l6 3 8-4v-5l-6-3zm-2 5.882l-3.764-1.882 5.764-2.882 3.764 1.882-5.764 2.882z" id="iconBg"/><path class="icon-vs-fg" d="M9 2.118l3.764 1.882-5.764 2.882-3.764-1.882 5.764-2.882z" id="iconFg"/></svg>
|
||||
|
After Width: | Height: | Size: 680 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M0 10.736V4.5L9 0l7 3.5v6.236l-9 4.5-7-3.5z" id="outline"/><path class="icon-vs-action-blue" d="M9 1L1 5v5l6 3 8-4V4L9 1zM7 6.882L3.236 5 9 2.118 12.764 4 7 6.882z" id="iconBg"/><path class="icon-vs-fg" d="M9 2.118L12.764 4 7 6.882 3.236 5 9 2.118z" id="iconFg"/></svg>
|
||||
|
After Width: | Height: | Size: 579 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 15v-3h2V4h-2V1h5v14h-5zM0 15V1h5v3H3v8h2v3H0z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M4 14H1V2h3v1H2v10h2v1zM15 2h-3v1h2v10h-2v1h3V2z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 445 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 15v-3h2V4h-2V1h5v14h-5zM0 15V1h5v3H3v8h2v3H0z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M4 14H1V2h3v1H2v10h2v1zM15 2h-3v1h2v10h-2v1h3V2z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 445 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 5V2H9V1H0v14h13v-3h3V9h-1V6H9V5h7zm-8 7V9h1v3H8z" id="outline"/><path class="icon-vs-fg" d="M2 3h5v1H2V3z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M15 4h-5V3h5v1zm-1 3h-2v1h2V7zm-4 0H1v1h9V7zm2 6H1v1h11v-1zm-5-3H1v1h6v-1zm8 0h-5v1h5v-1zM8 2v3H1V2h7zM7 3H2v1h5V3z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 596 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2a292c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 5V2H9V1H0v14h13v-3h3V9h-1V6H9V5h7zm-8 7V9h1v3H8z" id="outline"/><path class="icon-vs-fg" d="M2 3h5v1H2V3z" id="iconFg"/><g id="iconBg"><path class="icon-vs-bg" d="M15 4h-5V3h5v1zm-1 3h-2v1h2V7zm-4 0H1v1h9V7zm2 6H1v1h11v-1zm-5-3H1v1h6v-1zm8 0h-5v1h5v-1zM8 2v3H1V2h7zM7 3H2v1h5V3z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 596 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" enable-background="new 0 0 16 16"><style type="text/css">.icon-canvas-transparent{opacity:0;fill:#F6F6F6;} .icon-vs-out{fill:#F6F6F6;} .icon-vs-fg{fill:#F0EFF1;} .icon-vs-action-blue{fill:#00539C;}</style><path class="icon-canvas-transparent" d="M16 16h-16v-16h16v16z" id="canvas"/><path class="icon-vs-out" d="M11.5 12c-1.915 0-3.602-1.241-4.228-3h-1.41c-.536.985-1.572 1.625-2.737 1.625-1.723 0-3.125-1.402-3.125-3.125s1.402-3.125 3.125-3.125c1.165 0 2.201.639 2.737 1.625h1.41c.626-1.759 2.313-3 4.228-3 2.481 0 4.5 2.019 4.5 4.5s-2.019 4.5-4.5 4.5z" id="outline"/><path class="icon-vs-fg" d="M11.5 9c-.827 0-1.5-.674-1.5-1.5 0-.828.673-1.5 1.5-1.5s1.5.672 1.5 1.5c0 .826-.673 1.5-1.5 1.5z" id="iconFg"/><path class="icon-vs-action-blue" d="M11.5 4c-1.762 0-3.205 1.306-3.45 3h-2.865c-.226-.931-1.059-1.625-2.06-1.625-1.174 0-2.125.951-2.125 2.125s.951 2.125 2.125 2.125c1 0 1.834-.694 2.06-1.625h2.865c.245 1.694 1.688 3 3.45 3 1.933 0 3.5-1.567 3.5-3.5s-1.567-3.5-3.5-3.5zm0 5c-.827 0-1.5-.673-1.5-1.5s.673-1.5 1.5-1.5 1.5.673 1.5 1.5-.673 1.5-1.5 1.5z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11.5 12c-1.915 0-3.602-1.241-4.228-3h-1.41a3.11 3.11 0 0 1-2.737 1.625C1.402 10.625 0 9.223 0 7.5s1.402-3.125 3.125-3.125c1.165 0 2.201.639 2.737 1.625h1.41c.626-1.759 2.313-3 4.228-3C13.981 3 16 5.019 16 7.5S13.981 12 11.5 12z" id="outline"/><path class="icon-vs-fg" d="M11.5 9A1.501 1.501 0 1 1 13 7.5c0 .826-.673 1.5-1.5 1.5z" id="iconFg"/><path class="icon-vs-action-blue" d="M11.5 4a3.49 3.49 0 0 0-3.45 3H5.185A2.122 2.122 0 0 0 1 7.5a2.123 2.123 0 1 0 4.185.5H8.05a3.49 3.49 0 0 0 3.45 3 3.5 3.5 0 1 0 0-7zm0 5c-.827 0-1.5-.673-1.5-1.5S10.673 6 11.5 6s1.5.673 1.5 1.5S12.327 9 11.5 9z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 923 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 3v1.015L8.733 2.882 5 4.749V3H0v10h5v-1.859l2.156 1.077L11 10.295V13h5V3h-5z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M2 5v6h2v1H1V4h3v1H2zm10 6v1h3V4h-3v1h2v6h-2z" id="iconBg"/><path class="icon-vs-fg" d="M7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="iconFg" style="display: none;"/><path class="icon-vs-action-blue" d="M8.733 4L4 6.367v3.156L7.156 11.1l4.733-2.367V5.578L8.733 4zM7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="colorImportance"/></svg>
|
||||
|
After Width: | Height: | Size: 853 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M11 3v1.015L8.733 2.882 5 4.749V3H0v10h5v-1.859l2.156 1.077L11 10.295V13h5V3h-5z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M2 5v6h2v1H1V4h3v1H2zm10 6v1h3V4h-3v1h2v6h-2z" id="iconBg"/><path class="icon-vs-fg" d="M7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="iconFg" style="display: none;"/><path class="icon-vs-action-blue" d="M8.733 4L4 6.367v3.156L7.156 11.1l4.733-2.367V5.578L8.733 4zM7.156 7.156l-1.578-.789 3.156-1.578 1.578.789-3.156 1.578z" id="colorImportance"/></svg>
|
||||
|
After Width: | Height: | Size: 853 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-fg{fill:#f0eff1;}.icon-vs-action-purple{fill:#652d90;}</style></defs><title>Method_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M15,3.349v8.4L8.975,16h-.9L1,11.582V3.327L7.6,0H8.713Z"/></g><g id="iconFg"><path class="icon-vs-fg" d="M12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g><g id="iconBg"><path class="icon-vs-action-purple" d="M8.156.837,2,3.942v7.085L8.517,15.1,14,11.233V3.95ZM12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 821 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-fg{fill:#2a292c;}.icon-vs-action-purple{fill:#b180d7;}</style></defs><title>Method_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M15,3.349v8.4L8.975,16h-.9L1,11.582V3.327L7.6,0H8.713Z"/></g><g id="iconFg"><path class="icon-vs-fg" d="M12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g><g id="iconBg"><path class="icon-vs-action-purple" d="M8.156.837,2,3.942v7.085L8.517,15.1,14,11.233V3.95ZM12.715,4.4,8.487,7.02,3.565,4.272,8.144,1.963ZM3,5.1,8,7.894v5.7L3,10.473Zm6,8.434V7.878L13,5.4v5.318Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 821 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9.26 11.984l.978-.021a.962.962 0 0 0 .09-.006c.011-.063.026-.179.026-.361V9.688c0-.679.185-1.257.53-1.707-.346-.452-.53-1.03-.53-1.705V4.35c0-.167-.021-.259-.034-.302L9.26 4.02V.973l1.011.011c2.167.024 3.409 1.156 3.409 3.105v1.962c0 .351.071.461.072.462l.936.06.053.927v1.936l-.936.061c-.076.016-.125.146-.125.424v2.017c0 .914-.332 3.043-3.408 3.078l-1.012.011v-3.043zm-3.521 3.032c-3.089-.035-3.422-2.164-3.422-3.078V9.921c0-.327-.066-.432-.067-.433l-.937-.06-.063-.929V6.563l.942-.06c.058 0 .125-.114.125-.452V4.09c0-1.949 1.248-3.081 3.422-3.105L6.75.973V4.02l-.975.023a.572.572 0 0 0-.093.01c.006.021-.019.115-.019.297v1.928c0 .675-.186 1.253-.534 1.705.348.45.534 1.028.534 1.707v1.907c0 .175.014.291.027.363.023.002 1.06.025 1.06.025v3.043l-1.011-.012z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M5.75 14.016c-1.623-.019-2.434-.711-2.434-2.078V9.921c0-.902-.355-1.376-1.066-1.422v-.998c.711-.045 1.066-.529 1.066-1.449V4.09c0-1.385.811-2.087 2.434-2.105v1.06c-.725.017-1.087.453-1.087 1.305v1.928c0 .92-.454 1.488-1.36 1.702V8c.907.201 1.36.763 1.36 1.688v1.907c0 .488.081.835.243 1.042.162.208.443.316.844.325v1.054zm7.99-5.517c-.706.045-1.06.52-1.06 1.422v2.017c0 1.367-.807 2.06-2.42 2.078v-1.053c.396-.009.678-.118.844-.328.167-.21.25-.556.25-1.039V9.688c0-.925.449-1.488 1.347-1.688v-.021c-.898-.214-1.347-.782-1.347-1.702V4.35c0-.852-.364-1.288-1.094-1.306v-1.06c1.613.018 2.42.72 2.42 2.105v1.962c0 .92.354 1.404 1.06 1.449v.999z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9.26 11.984l.978-.021a.962.962 0 0 0 .09-.006c.011-.063.026-.179.026-.361V9.688c0-.679.185-1.257.53-1.707-.346-.452-.53-1.03-.53-1.705V4.35c0-.167-.021-.259-.034-.302L9.26 4.02V.973l1.011.011c2.167.024 3.409 1.156 3.409 3.105v1.962c0 .351.071.461.072.462l.936.06.053.927v1.936l-.936.061c-.076.016-.125.146-.125.424v2.017c0 .914-.332 3.043-3.408 3.078l-1.012.011v-3.043zm-3.521 3.032c-3.089-.035-3.422-2.164-3.422-3.078V9.921c0-.327-.066-.432-.067-.433l-.937-.06-.063-.929V6.563l.942-.06c.058 0 .125-.114.125-.452V4.09c0-1.949 1.248-3.081 3.422-3.105L6.75.973V4.02l-.975.023a.572.572 0 0 0-.093.01c.006.021-.019.115-.019.297v1.928c0 .675-.186 1.253-.534 1.705.348.45.534 1.028.534 1.707v1.907c0 .175.014.291.027.363.023.002 1.06.025 1.06.025v3.043l-1.011-.012z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M5.75 14.016c-1.623-.019-2.434-.711-2.434-2.078V9.921c0-.902-.355-1.376-1.066-1.422v-.998c.711-.045 1.066-.529 1.066-1.449V4.09c0-1.385.811-2.087 2.434-2.105v1.06c-.725.017-1.087.453-1.087 1.305v1.928c0 .92-.454 1.488-1.36 1.702V8c.907.201 1.36.763 1.36 1.688v1.907c0 .488.081.835.243 1.042.162.208.443.316.844.325v1.054zm7.99-5.517c-.706.045-1.06.52-1.06 1.422v2.017c0 1.367-.807 2.06-2.42 2.078v-1.053c.396-.009.678-.118.844-.328.167-.21.25-.556.25-1.039V9.688c0-.925.449-1.488 1.347-1.688v-.021c-.898-.214-1.347-.782-1.347-1.702V4.35c0-.852-.364-1.288-1.094-1.306v-1.06c1.613.018 2.42.72 2.42 2.105v1.962c0 .92.354 1.404 1.06 1.449v.999z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 15v-3H7v3H4v-3H1V9h3V7H1V4h3V1h3v3h2V1h3v3h3v3h-3v2h3v3h-3v3H9z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M14 6V5h-3V2h-1v3H6V2H5v3H2v1h3v4H2v1h3v3h1v-3h4v3h1v-3h3v-1h-3V6h3zm-4 4H6V6h4v4z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 496 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 15v-3H7v3H4v-3H1V9h3V7H1V4h3V1h3v3h2V1h3v3h3v3h-3v2h3v3h-3v3H9z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M14 6V5h-3V2h-1v3H6V2H5v3H2v1h3v4H2v1h3v3h1v-3h4v3h1v-3h3v-1h-3V6h3zm-4 4H6V6h4v4z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 496 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-fg{fill:#f0eff1}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 16H0V0h16v16z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M1 1v14h14V1H1zm6 12H3v-1h4v1zm0-3H3V9h4v1zm0-5H5v2H4V5H2V4h2V2h1v2h2v1zm3.281 8H8.719l3-4h1.563l-3.001 4zM14 5H9V4h5v1z" id="iconBg"/><path class="icon-vs-fg" d="M7 5H5v2H4V5H2V4h2V2h1v2h2v1zm7-1H9v1h5V4zM7 9H3v1h4V9zm0 3H3v1h4v-1zm3.281 1l3-4h-1.563l-3 4h1.563z" id="iconFg" style="display: none;"/></svg>
|
||||
|
After Width: | Height: | Size: 710 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-fg{fill:#2b282e}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M16 16H0V0h16v16z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M1 1v14h14V1H1zm6 12H3v-1h4v1zm0-3H3V9h4v1zm0-5H5v2H4V5H2V4h2V2h1v2h2v1zm3.281 8H8.719l3-4h1.563l-3.001 4zM14 5H9V4h5v1z" id="iconBg"/><path class="icon-vs-fg" d="M7 5H5v2H4V5H2V4h2V2h1v2h2v1zm7-1H9v1h5V4zM7 9H3v1h4V9zm0 3H3v1h4v-1zm3.281 1l3-4h-1.563l-3 4h1.563z" id="iconFg" style="display: none;"/></svg>
|
||||
|
After Width: | Height: | Size: 710 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#f6f6f6;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#424242;}</style></defs><title>Property_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M16,5.5a5.46,5.46,0,0,1-6.307,5.434l-.078-.012a5.439,5.439,0,0,1-.811-.191L4.268,15.268A2.5,2.5,0,0,1,.732,11.732L5.269,7.2a5.452,5.452,0,0,1-.191-.812c0-.025-.008-.051-.012-.077A5.5,5.5,0,1,1,16,5.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.474,4.474,0,0,1,8.571,9.55l-5.01,5.01a1.5,1.5,0,0,1-2.122-2.12L6.45,7.429A4.474,4.474,0,0,1,12.429,1.45L9.636,4.243l2.121,2.121L14.55,3.571A4.462,4.462,0,0,1,15,5.5Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 789 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.icon-canvas-transparent,.icon-vs-out{fill:#252526;}.icon-canvas-transparent{opacity:0;}.icon-vs-bg{fill:#c5c5c5;}</style></defs><title>Property_16x</title><g id="canvas"><path class="icon-canvas-transparent" d="M16,16H0V0H16Z"/></g><g id="outline"><path class="icon-vs-out" d="M16,5.5a5.46,5.46,0,0,1-6.307,5.434l-.078-.012a5.439,5.439,0,0,1-.811-.191L4.268,15.268A2.5,2.5,0,0,1,.732,11.732L5.269,7.2a5.452,5.452,0,0,1-.191-.812c0-.025-.008-.051-.012-.077A5.5,5.5,0,1,1,16,5.5Z"/></g><g id="iconBg"><path class="icon-vs-bg" d="M15,5.5A4.474,4.474,0,0,1,8.571,9.55l-5.01,5.01a1.5,1.5,0,0,1-2.122-2.12L6.45,7.429A4.474,4.474,0,0,1,12.429,1.45L9.636,4.243l2.121,2.121L14.55,3.571A4.462,4.462,0,0,1,15,5.5Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 789 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.st0{opacity:0}.st0,.st1{fill:#f6f6f6}.st2{fill:#424242}.st3{fill:none}.st4{fill:#f0eff1}</style><g id="outline"><path class="st0" d="M0 0h16v16H0z"/><path class="st1" d="M2 0h13v15H2z"/></g><g id="icon_x5F_bg"><path class="st2" d="M7 13h1v1H7zM5 13h1v1H5zM3 13h1v1H3zM9 13h1v1H9zM11 13h1v1h-1zM13 13h1v1h-1zM3 1v11h1V2h9v10h1V1z"/></g><g id="icon_x5F_fg"><path class="st3" d="M13 2H4h9z"/><path class="st4" d="M4 2h9v10H4z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 503 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.st0{opacity:0}.st0,.st1{fill:#252526}.st2{fill:#c5c5c5}.st3{fill:none}.st4{fill:#2a292c}</style><g id="outline"><path class="st0" d="M0 0h16v16H0z"/><path class="st1" d="M2 0h13v15H2z"/></g><g id="icon_x5F_bg"><path class="st2" d="M7 13h1v1H7zM5 13h1v1H5zM3 13h1v1H3zM9 13h1v1H9zM11 13h1v1h-1zM13 13h1v1h-1zM3 1v11h1V2h9v10h1V1z"/></g><g id="icon_x5F_fg"><path class="st3" d="M13 2H4h9z"/><path class="st4" d="M4 2h9v10H4z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 503 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M0 0h16v16H0z" id="canvas"/><path class="icon-vs-out" d="M15.256 5.539a3.579 3.579 0 0 0-1.501-.306c-1.014 0-1.85.328-2.482.974-.084.086-.149.185-.222.278-.057-.091-.109-.186-.175-.27-.512-.642-1.243-.982-2.117-.982-.189 0-.372.016-.547.048V3.176h-3.02v2.736c-.463-.438-1.123-.68-1.949-.68-.8 0-1.524.189-2.153.562l-.49.291v2.081c-.288.393-.44.887-.44 1.464 0 .667.236 1.246.684 1.676.442.423 1.024.638 1.731.638.265 0 .517-.036.753-.105H7.8c.237.07.49.105.755.105.928 0 1.709-.365 2.258-1.055.052-.066.091-.142.138-.212.087.117.171.236.275.342.604.614 1.388.925 2.33.925.668 0 1.267-.15 1.779-.446l.5-.289V9.39l.004.003V5.806l-.583-.267zm-6.88 3.59l-.123-.013c-.024-.026-.051-.055-.051-.159v-.558c0-.21.063-.284.09-.315.021-.024.033-.038.119-.038l.033-.003c.02.025.084.128.084.418-.001.418-.091.587-.152.668zm5.834-.165c-.191.154-.326.171-.411.171-.229 0-.293-.066-.322-.097-.073-.076-.11-.214-.11-.411 0-.31.103-.418.14-.458.057-.061.134-.125.332-.125.086 0 .221.016.403.152l.479.358-.511.41z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M3.243 6.233c-.621 0-1.169.141-1.644.422v.892c.431-.369.914-.554 1.45-.554.609 0 .914.321.914.962l-1.336.189c-.978.141-1.467.636-1.467 1.486 0 .396.125.713.375.954.251.24.597.36 1.04.36.601 0 1.056-.27 1.367-.809h.018v.703h.989V7.911c-.001-1.119-.57-1.678-1.706-1.678zm.72 2.786c0 .331-.102.606-.305.824a1.011 1.011 0 0 1-.771.327c-.229 0-.411-.061-.547-.183a.595.595 0 0 1-.205-.467c0-.261.074-.443.222-.547.147-.104.368-.175.661-.213l.945-.132v.391zM8.758 6.233c-.671 0-1.181.299-1.529.896h-.018V4.176h-1.02v6.662h1.02v-.65h.018c.299.504.741.756 1.327.756.624 0 1.116-.227 1.476-.679.361-.453.541-1.056.541-1.809 0-.677-.16-1.216-.48-1.619s-.767-.604-1.335-.604zm.445 3.46c-.214.294-.511.441-.889.441-.322 0-.588-.114-.798-.343s-.314-.506-.314-.834v-.558c0-.387.11-.709.332-.967s.514-.387.877-.387c.343 0 .615.125.816.375.199.251.301.597.301 1.04-.001.528-.108.939-.325 1.233zM13.838 7.046c.354 0 .688.117 1.002.352v-.95a2.572 2.572 0 0 0-1.085-.215c-.738 0-1.328.225-1.769.675-.441.45-.662 1.045-.662 1.786 0 .665.205 1.206.615 1.624.41.417.949.626 1.617.626.492 0 .919-.104 1.279-.312v-.888c-.325.261-.671.391-1.037.391-.437 0-.784-.135-1.044-.404-.259-.27-.389-.637-.389-1.103 0-.472.138-.853.413-1.145.277-.291.63-.437 1.06-.437z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#252526}.icon-vs-out{fill:#252526}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M0 0h16v16H0z" id="canvas"/><path class="icon-vs-out" d="M15.256 5.539a3.579 3.579 0 0 0-1.501-.306c-1.014 0-1.85.328-2.482.974-.084.086-.149.185-.222.278-.057-.091-.109-.186-.175-.27-.512-.642-1.243-.982-2.117-.982-.189 0-.372.016-.547.048V3.176h-3.02v2.736c-.463-.438-1.123-.68-1.949-.68-.8 0-1.524.189-2.153.562l-.49.291v2.081c-.288.393-.44.887-.44 1.464 0 .667.236 1.246.684 1.676.442.423 1.024.638 1.731.638.265 0 .517-.036.753-.105H7.8c.237.07.49.105.755.105.928 0 1.709-.365 2.258-1.055.052-.066.091-.142.138-.212.087.117.171.236.275.342.604.614 1.388.925 2.33.925.668 0 1.267-.15 1.779-.446l.5-.289V9.39l.004.003V5.806l-.583-.267zm-6.88 3.59l-.123-.013c-.024-.026-.051-.055-.051-.159v-.558c0-.21.063-.284.09-.315.021-.024.033-.038.119-.038l.033-.003c.02.025.084.128.084.418-.001.418-.091.587-.152.668zm5.834-.165c-.191.154-.326.171-.411.171-.229 0-.293-.066-.322-.097-.073-.076-.11-.214-.11-.411 0-.31.103-.418.14-.458.057-.061.134-.125.332-.125.086 0 .221.016.403.152l.479.358-.511.41z" id="outline"/><g id="iconBg"><path class="icon-vs-bg" d="M3.243 6.233c-.621 0-1.169.141-1.644.422v.892c.431-.369.914-.554 1.45-.554.609 0 .914.321.914.962l-1.336.189c-.978.141-1.467.636-1.467 1.486 0 .396.125.713.375.954.251.24.597.36 1.04.36.601 0 1.056-.27 1.367-.809h.018v.703h.989V7.911c-.001-1.119-.57-1.678-1.706-1.678zm.72 2.786c0 .331-.102.606-.305.824a1.011 1.011 0 0 1-.771.327c-.229 0-.411-.061-.547-.183a.595.595 0 0 1-.205-.467c0-.261.074-.443.222-.547.147-.104.368-.175.661-.213l.945-.132v.391zM8.758 6.233c-.671 0-1.181.299-1.529.896h-.018V4.176h-1.02v6.662h1.02v-.65h.018c.299.504.741.756 1.327.756.624 0 1.116-.227 1.476-.679.361-.453.541-1.056.541-1.809 0-.677-.16-1.216-.48-1.619s-.767-.604-1.335-.604zm.445 3.46c-.214.294-.511.441-.889.441-.322 0-.588-.114-.798-.343s-.314-.506-.314-.834v-.558c0-.387.11-.709.332-.967s.514-.387.877-.387c.343 0 .615.125.816.375.199.251.301.597.301 1.04-.001.528-.108.939-.325 1.233zM13.838 7.046c.354 0 .688.117 1.002.352v-.95a2.572 2.572 0 0 0-1.085-.215c-.738 0-1.328.225-1.769.675-.441.45-.662 1.045-.662 1.786 0 .665.205 1.206.615 1.624.41.417.949.626 1.617.626.492 0 .919-.104 1.279-.312v-.888c-.325.261-.671.391-1.037.391-.437 0-.784-.135-1.044-.404-.259-.27-.389-.637-.389-1.103 0-.472.138-.853.413-1.145.277-.291.63-.437 1.06-.437z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-action-blue{fill:#00539c}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 14V8H7v6H1V2h14v12H9z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M10 9h4v4h-4V9zm-8 4h4V9H2v4zM2 3v4h12V3H2z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 449 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-action-blue{fill:#75beff}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M9 14V8H7v6H1V2h14v12H9z" id="outline" style="display: none;"/><path class="icon-vs-action-blue" d="M10 9h4v4h-4V9zm-8 4h4V9H2v4zM2 3v4h12V3H2z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 449 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#f6f6f6}.icon-vs-out{fill:#f6f6f6}.icon-vs-bg{fill:#424242}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M10.702 10.5l2-2-2-2 .5-.5H10v5h1v3H5v-3h1V6H4.798l.5.5-2 2 2 2L3 12.797l-3-3V7.201l3-3V2h10v2.201l3 3v2.596l-3 3-2.298-2.297z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M4 3h8v2h-1v-.5c0-.277-.224-.5-.5-.5H9v7.5c0 .275.224.5.5.5h.5v1H6v-1h.5a.5.5 0 0 0 .5-.5V4H5.5a.5.5 0 0 0-.5.5V5H4V3zM3 5.615L.116 8.5 3 11.383l.884-.883-2-2 2-2L3 5.615zm10 0l-.884.885 2 2-2 2 .884.883L15.884 8.5 13 5.615z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 714 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><style>.icon-canvas-transparent{opacity:0;fill:#2d2d30}.icon-vs-out{fill:#2d2d30}.icon-vs-bg{fill:#c5c5c5}</style><path class="icon-canvas-transparent" d="M16 16H0V0h16v16z" id="canvas"/><path class="icon-vs-out" d="M10.702 10.5l2-2-2-2 .5-.5H10v5h1v3H5v-3h1V6H4.798l.5.5-2 2 2 2L3 12.797l-3-3V7.201l3-3V2h10v2.201l3 3v2.596l-3 3-2.298-2.297z" id="outline" style="display: none;"/><path class="icon-vs-bg" d="M4 3h8v2h-1v-.5c0-.277-.224-.5-.5-.5H9v7.5c0 .275.224.5.5.5h.5v1H6v-1h.5a.5.5 0 0 0 .5-.5V4H5.5a.5.5 0 0 0-.5.5V5H4V3zM3 5.615L.116 8.5 3 11.383l.884-.883-2-2 2-2L3 5.615zm10 0l-.884.885 2 2-2 2 .884.883L15.884 8.5 13 5.615z" id="iconBg"/></svg>
|
||||
|
After Width: | Height: | Size: 714 B |
66
src/vs/editor/contrib/documentSymbols/media/outlineTree.css
Normal file
@@ -0,0 +1,66 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.monaco-tree.focused .selected .outline-element-label, .monaco-tree.focused .selected .outline-element-decoration {
|
||||
/* make sure selection color wins when a label is being selected */
|
||||
color: inherit !important;
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-flow: row nowrap;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element .outline-element-icon {
|
||||
padding-right: 3px;
|
||||
}
|
||||
|
||||
/* .monaco-tree.no-icons .outline-element .outline-element-icon {
|
||||
display: none;
|
||||
} */
|
||||
|
||||
.monaco-tree .outline-element .outline-element-label {
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
color: var(--outline-element-color);
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element .outline-element-label .monaco-highlighted-label .highlight {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element .outline-element-detail {
|
||||
visibility: hidden;
|
||||
flex: 1;
|
||||
flex-basis: 10%;
|
||||
opacity: 0.8;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-size: 90%;
|
||||
padding-left: 4px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
|
||||
.monaco-tree .monaco-tree-row.focused .outline-element .outline-element-detail {
|
||||
visibility: inherit;
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element .outline-element-decoration {
|
||||
opacity: 0.75;
|
||||
font-size: 90%;
|
||||
font-weight: 600;
|
||||
padding: 0 12px 0 5px;
|
||||
margin-left: auto;
|
||||
text-align: center;
|
||||
color: var(--outline-element-color);
|
||||
}
|
||||
|
||||
.monaco-tree .outline-element .outline-element-decoration.bubble {
|
||||
font-family: octicons;
|
||||
font-size: 14px;
|
||||
opacity: 0.4;
|
||||
}
|
||||
276
src/vs/editor/contrib/documentSymbols/media/symbol-icons.css
Normal file
@@ -0,0 +1,276 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.monaco-workbench .symbol-icon {
|
||||
display: inline-block;
|
||||
height: 14px;
|
||||
width: 16px;
|
||||
min-height: 14px;
|
||||
min-width: 16px;
|
||||
}
|
||||
|
||||
/* default icons */
|
||||
.monaco-workbench .symbol-icon {
|
||||
background-image: url('Field_16x.svg');
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon,
|
||||
.hc-black .monaco-workbench .symbol-icon {
|
||||
background-image: url('Field_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* constant */
|
||||
.monaco-workbench .symbol-icon.constant {
|
||||
background-image: url('Constant_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.constant,
|
||||
.hc-black .monaco-workbench .symbol-icon.constant {
|
||||
background-image: url('Constant_16x_inverse.svg');
|
||||
}
|
||||
|
||||
/* enum */
|
||||
.monaco-workbench .symbol-icon.enum {
|
||||
background-image: url('Enumerator_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.enum,
|
||||
.hc-black .monaco-workbench .symbol-icon.enum {
|
||||
background-image: url('Enumerator_inverse_16x.svg');
|
||||
}
|
||||
|
||||
/* enum-member */
|
||||
.monaco-workbench .symbol-icon.enum-member {
|
||||
background-image: url('EnumItem_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.enum-member,
|
||||
.hc-black .monaco-workbench .symbol-icon.enum-member {
|
||||
background-image: url('EnumItem_inverse_16x.svg');
|
||||
}
|
||||
|
||||
/* struct */
|
||||
.monaco-workbench .symbol-icon.struct {
|
||||
background-image: url('Structure_16x_vscode.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.struct,
|
||||
.hc-black .monaco-workbench .symbol-icon.struct {
|
||||
background-image: url('Structure_16x_vscode_inverse.svg');
|
||||
}
|
||||
|
||||
/* event */
|
||||
.monaco-workbench .symbol-icon.event {
|
||||
background-image: url('Event_16x_vscode.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.event,
|
||||
.hc-black .monaco-workbench .symbol-icon.event {
|
||||
background-image: url('Event_16x_vscode_inverse.svg');
|
||||
}
|
||||
|
||||
/* operator */
|
||||
.monaco-workbench .symbol-icon.operator {
|
||||
background-image: url('Operator_16x_vscode.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.operator,
|
||||
.hc-black .monaco-workbench .symbol-icon.operator {
|
||||
background-image: url('Operator_16x_vscode_inverse.svg');
|
||||
}
|
||||
|
||||
/* type paramter */
|
||||
.monaco-workbench .symbol-icon.type-parameter {
|
||||
background-image: url('Template_16x_vscode.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.type-parameter,
|
||||
.hc-black .monaco-workbench .symbol-icon.type-parameter {
|
||||
background-image: url('Template_16x_vscode_inverse.svg');
|
||||
}
|
||||
|
||||
/* boolean, null */
|
||||
.monaco-workbench .symbol-icon.boolean {
|
||||
background-image: url('BooleanData_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.boolean,
|
||||
.hc-black .monaco-workbench .symbol-icon.boolean {
|
||||
background-image: url('BooleanData_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* null */
|
||||
.monaco-workbench .symbol-icon.null {
|
||||
background-image: url('BooleanData_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.null,
|
||||
.hc-black .monaco-workbench .symbol-icon.null {
|
||||
background-image: url('BooleanData_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* class */
|
||||
.monaco-workbench .symbol-icon.class {
|
||||
background-image: url('Class_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.class,
|
||||
.hc-black .monaco-workbench .symbol-icon.class {
|
||||
background-image: url('Class_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* constructor */
|
||||
.monaco-workbench .symbol-icon.constructor {
|
||||
background-image: url('Method_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.constructor,
|
||||
.hc-black .monaco-workbench .symbol-icon.constructor {
|
||||
background-image: url('Method_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* file */
|
||||
.monaco-workbench .symbol-icon.file {
|
||||
background-image: url('Document_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.file,
|
||||
.hc-black .monaco-workbench .symbol-icon.file {
|
||||
background-image: url('Document_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* field */
|
||||
.monaco-workbench .symbol-icon.field {
|
||||
background-image: url('Field_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.field,
|
||||
.hc-black .monaco-workbench .symbol-icon.field {
|
||||
background-image: url('Field_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* variable */
|
||||
.monaco-workbench .symbol-icon.variable {
|
||||
background-image: url('LocalVariable_16x_vscode.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.variable,
|
||||
.hc-black .monaco-workbench .symbol-icon.variable {
|
||||
background-image: url('LocalVariable_16x_vscode_inverse.svg');
|
||||
}
|
||||
|
||||
/* array */
|
||||
.monaco-workbench .symbol-icon.array {
|
||||
background-image: url('Indexer_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.array,
|
||||
.hc-black .monaco-workbench .symbol-icon.array {
|
||||
background-image: url('Indexer_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* keyword */
|
||||
/* todo@joh not used? */
|
||||
.monaco-workbench .symbol-icon.keyword {
|
||||
background-image: url('IntelliSenseKeyword_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.keyword,
|
||||
.hc-black .monaco-workbench .symbol-icon.keyword {
|
||||
background-image: url('IntelliSenseKeyword_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* interface */
|
||||
.monaco-workbench .symbol-icon.interface {
|
||||
background-image: url('Interface_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.interface,
|
||||
.hc-black .monaco-workbench .symbol-icon.interface {
|
||||
background-image: url('Interface_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* method */
|
||||
.monaco-workbench .symbol-icon.method {
|
||||
background-image: url('Method_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.method,
|
||||
.hc-black .monaco-workbench .symbol-icon.method {
|
||||
background-image: url('Method_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* function */
|
||||
.monaco-workbench .symbol-icon.function {
|
||||
background-image: url('Method_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.function,
|
||||
.hc-black .monaco-workbench .symbol-icon.function {
|
||||
background-image: url('Method_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* object */
|
||||
.monaco-workbench .symbol-icon.object {
|
||||
background-image: url('Namespace_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.object,
|
||||
.hc-black .monaco-workbench .symbol-icon.object {
|
||||
background-image: url('Namespace_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* namespace */
|
||||
.monaco-workbench .symbol-icon.namespace {
|
||||
background-image: url('Namespace_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.namespace,
|
||||
.hc-black .monaco-workbench .symbol-icon.namespace {
|
||||
background-image: url('Namespace_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* package */
|
||||
.monaco-workbench .symbol-icon.package {
|
||||
background-image: url('Namespace_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.package,
|
||||
.hc-black .monaco-workbench .symbol-icon.package {
|
||||
background-image: url('Namespace_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* module */
|
||||
.monaco-workbench .symbol-icon.module {
|
||||
background-image: url('Namespace_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.module,
|
||||
.hc-black .monaco-workbench .symbol-icon.module {
|
||||
background-image: url('Namespace_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* number */
|
||||
.monaco-workbench .symbol-icon.number {
|
||||
background-image: url('Numeric_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.number,
|
||||
.hc-black .monaco-workbench .symbol-icon.number {
|
||||
background-image: url('Numeric_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* property */
|
||||
.monaco-workbench .symbol-icon.property {
|
||||
background-image: url('Property_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.property,
|
||||
.hc-black .monaco-workbench .symbol-icon.property {
|
||||
background-image: url('Property_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* snippet */
|
||||
/* todo@joh unused? */
|
||||
.monaco-workbench .symbol-icon.snippet {
|
||||
background-image: url('Snippet_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.snippet,
|
||||
.hc-black .monaco-workbench .symbol-icon.snippet {
|
||||
background-image: url('Snippet_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* string */
|
||||
.monaco-workbench .symbol-icon.string {
|
||||
background-image: url('String_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.string,
|
||||
.hc-black .monaco-workbench .symbol-icon.string {
|
||||
background-image: url('String_16x_darkp.svg');
|
||||
}
|
||||
|
||||
/* key */
|
||||
.monaco-workbench .symbol-icon.key {
|
||||
background-image: url('String_16x.svg');
|
||||
}
|
||||
.vs-dark .monaco-workbench .symbol-icon.key,
|
||||
.hc-black .monaco-workbench .symbol-icon.key {
|
||||
background-image: url('String_16x_darkp.svg');
|
||||
}
|
||||
441
src/vs/editor/contrib/documentSymbols/outlineModel.ts
Normal file
@@ -0,0 +1,441 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { DocumentSymbolProviderRegistry, DocumentSymbolProvider, DocumentSymbol } from 'vs/editor/common/modes';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters';
|
||||
import { IPosition } from 'vs/editor/common/core/position';
|
||||
import { Range, IRange } from 'vs/editor/common/core/range';
|
||||
import { first, size, forEach } from 'vs/base/common/collections';
|
||||
import { isFalsyOrEmpty, binarySearch, coalesce } from 'vs/base/common/arrays';
|
||||
import { commonPrefixLength } from 'vs/base/common/strings';
|
||||
import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers';
|
||||
import { onUnexpectedExternalError } from 'vs/base/common/errors';
|
||||
import { LRUCache } from 'vs/base/common/map';
|
||||
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
|
||||
|
||||
export abstract class TreeElement {
|
||||
|
||||
abstract id: string;
|
||||
abstract children: { [id: string]: TreeElement };
|
||||
abstract parent: TreeElement;
|
||||
|
||||
abstract adopt(newParent: TreeElement): TreeElement;
|
||||
|
||||
remove(): void {
|
||||
delete this.parent.children[this.id];
|
||||
}
|
||||
|
||||
static findId(candidate: DocumentSymbol | string, container: TreeElement): string {
|
||||
// complex id-computation which contains the origin/extension,
|
||||
// the parent path, and some dedupe logic when names collide
|
||||
let candidateId: string;
|
||||
if (typeof candidate === 'string') {
|
||||
candidateId = `${container.id}/${candidate}`;
|
||||
} else {
|
||||
candidateId = `${container.id}/${candidate.name}`;
|
||||
if (container.children[candidateId] !== void 0) {
|
||||
candidateId = `${container.id}/${candidate.name}_${candidate.range.startLineNumber}_${candidate.range.startColumn}`;
|
||||
}
|
||||
}
|
||||
|
||||
let id = candidateId;
|
||||
for (let i = 0; container.children[id] !== void 0; i++) {
|
||||
id = `${candidateId}_${i}`;
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
static getElementById(id: string, element: TreeElement): TreeElement {
|
||||
if (!id) {
|
||||
return undefined;
|
||||
}
|
||||
let len = commonPrefixLength(id, element.id);
|
||||
if (len === id.length) {
|
||||
return element;
|
||||
}
|
||||
if (len < element.id.length) {
|
||||
return undefined;
|
||||
}
|
||||
for (const key in element.children) {
|
||||
let candidate = TreeElement.getElementById(id, element.children[key]);
|
||||
if (candidate) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
static size(element: TreeElement): number {
|
||||
let res = 1;
|
||||
for (const key in element.children) {
|
||||
res += TreeElement.size(element.children[key]);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static empty(element: TreeElement): boolean {
|
||||
for (const _key in element.children) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineElement extends TreeElement {
|
||||
|
||||
children: { [id: string]: OutlineElement; } = Object.create(null);
|
||||
score: FuzzyScore = [0, []];
|
||||
marker: { count: number, topSev: MarkerSeverity };
|
||||
|
||||
constructor(
|
||||
readonly id: string,
|
||||
public parent: OutlineModel | OutlineGroup | OutlineElement,
|
||||
readonly symbol: DocumentSymbol
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
adopt(parent: OutlineModel | OutlineGroup | OutlineElement): OutlineElement {
|
||||
let res = new OutlineElement(this.id, parent, this.symbol);
|
||||
forEach(this.children, entry => res.children[entry.key] = entry.value.adopt(res));
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineGroup extends TreeElement {
|
||||
|
||||
children: { [id: string]: OutlineElement; } = Object.create(null);
|
||||
|
||||
constructor(
|
||||
readonly id: string,
|
||||
public parent: OutlineModel,
|
||||
readonly provider: DocumentSymbolProvider,
|
||||
readonly providerIndex: number,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
adopt(parent: OutlineModel): OutlineGroup {
|
||||
let res = new OutlineGroup(this.id, parent, this.provider, this.providerIndex);
|
||||
forEach(this.children, entry => res.children[entry.key] = entry.value.adopt(res));
|
||||
return res;
|
||||
}
|
||||
|
||||
updateMatches(pattern: string, topMatch: OutlineElement): OutlineElement {
|
||||
for (const key in this.children) {
|
||||
topMatch = this._updateMatches(pattern, this.children[key], topMatch);
|
||||
}
|
||||
return topMatch;
|
||||
}
|
||||
|
||||
private _updateMatches(pattern: string, item: OutlineElement, topMatch: OutlineElement): OutlineElement {
|
||||
item.score = fuzzyScore(pattern, item.symbol.name, undefined, true);
|
||||
if (item.score && (!topMatch || item.score[0] > topMatch.score[0])) {
|
||||
topMatch = item;
|
||||
}
|
||||
for (const key in item.children) {
|
||||
let child = item.children[key];
|
||||
topMatch = this._updateMatches(pattern, child, topMatch);
|
||||
if (!item.score && child.score) {
|
||||
// don't filter parents with unfiltered children
|
||||
item.score = [0, []];
|
||||
}
|
||||
}
|
||||
return topMatch;
|
||||
}
|
||||
|
||||
getItemEnclosingPosition(position: IPosition): OutlineElement {
|
||||
return this._getItemEnclosingPosition(position, this.children);
|
||||
}
|
||||
|
||||
private _getItemEnclosingPosition(position: IPosition, children: { [id: string]: OutlineElement }): OutlineElement {
|
||||
for (let key in children) {
|
||||
let item = children[key];
|
||||
if (!Range.containsPosition(item.symbol.range, position)) {
|
||||
continue;
|
||||
}
|
||||
return this._getItemEnclosingPosition(position, item.children) || item;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
updateMarker(marker: IMarker[]): void {
|
||||
for (const key in this.children) {
|
||||
this._updateMarker(marker, this.children[key]);
|
||||
}
|
||||
}
|
||||
|
||||
private _updateMarker(markers: IMarker[], item: OutlineElement): void {
|
||||
|
||||
item.marker = undefined;
|
||||
|
||||
// find the proper start index to check for item/marker overlap.
|
||||
let idx = binarySearch<IRange>(markers, item.symbol.range, Range.compareRangesUsingStarts);
|
||||
let start: number;
|
||||
if (idx < 0) {
|
||||
start = ~idx;
|
||||
if (start > 0 && Range.areIntersecting(markers[start - 1], item.symbol.range)) {
|
||||
start -= 1;
|
||||
}
|
||||
} else {
|
||||
start = idx;
|
||||
}
|
||||
|
||||
let myMarkers: IMarker[] = [];
|
||||
let myTopSev: MarkerSeverity;
|
||||
|
||||
for (; start < markers.length && Range.areIntersecting(item.symbol.range, markers[start]); start++) {
|
||||
// remove markers intersecting with this outline element
|
||||
// and store them in a 'private' array.
|
||||
let marker = markers[start];
|
||||
myMarkers.push(marker);
|
||||
markers[start] = undefined;
|
||||
if (!myTopSev || marker.severity > myTopSev) {
|
||||
myTopSev = marker.severity;
|
||||
}
|
||||
}
|
||||
|
||||
// Recurse into children and let them match markers that have matched
|
||||
// this outline element. This might remove markers from this element and
|
||||
// therefore we remember that we have had markers. That allows us to render
|
||||
// the dot, saying 'this element has children with markers'
|
||||
for (const key in item.children) {
|
||||
this._updateMarker(myMarkers, item.children[key]);
|
||||
}
|
||||
|
||||
if (myTopSev) {
|
||||
item.marker = {
|
||||
count: myMarkers.length,
|
||||
topSev: myTopSev
|
||||
};
|
||||
}
|
||||
|
||||
coalesce(markers, true);
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineModel extends TreeElement {
|
||||
|
||||
private static readonly _requests = new LRUCache<string, { promiseCnt: number, source: CancellationTokenSource, promise: Promise<any>, model: OutlineModel }>(9, .75);
|
||||
private static readonly _keys = new class {
|
||||
|
||||
private _counter = 1;
|
||||
private _data = new WeakMap<DocumentSymbolProvider, number>();
|
||||
|
||||
for(textModel: ITextModel): string {
|
||||
return `${textModel.id}/${textModel.getVersionId()}/${this._hash(DocumentSymbolProviderRegistry.all(textModel))}`;
|
||||
}
|
||||
|
||||
private _hash(providers: DocumentSymbolProvider[]): string {
|
||||
let result = '';
|
||||
for (const provider of providers) {
|
||||
let n = this._data.get(provider);
|
||||
if (typeof n === 'undefined') {
|
||||
n = this._counter++;
|
||||
this._data.set(provider, n);
|
||||
}
|
||||
result += n;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
|
||||
|
||||
let key = this._keys.for(textModel);
|
||||
let data = OutlineModel._requests.get(key);
|
||||
|
||||
if (!data) {
|
||||
let source = new CancellationTokenSource();
|
||||
data = {
|
||||
promiseCnt: 0,
|
||||
source,
|
||||
promise: OutlineModel._create(textModel, source.token),
|
||||
model: undefined,
|
||||
};
|
||||
OutlineModel._requests.set(key, data);
|
||||
}
|
||||
|
||||
if (data.model) {
|
||||
// resolved -> return data
|
||||
return Promise.resolve(data.model);
|
||||
}
|
||||
|
||||
// increase usage counter
|
||||
data.promiseCnt += 1;
|
||||
|
||||
token.onCancellationRequested(() => {
|
||||
// last -> cancel provider request, remove cached promise
|
||||
if (--data.promiseCnt === 0) {
|
||||
data.source.cancel();
|
||||
OutlineModel._requests.delete(key);
|
||||
}
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
data.promise.then(model => {
|
||||
data.model = model;
|
||||
resolve(model);
|
||||
}, err => {
|
||||
OutlineModel._requests.delete(key);
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
static _create(textModel: ITextModel, token: CancellationToken): Promise<OutlineModel> {
|
||||
|
||||
let result = new OutlineModel(textModel);
|
||||
let promises = DocumentSymbolProviderRegistry.ordered(textModel).map((provider, index) => {
|
||||
|
||||
let id = TreeElement.findId(`provider_${index}`, result);
|
||||
let group = new OutlineGroup(id, result, provider, index);
|
||||
|
||||
return Promise.resolve(provider.provideDocumentSymbols(result.textModel, token)).then(result => {
|
||||
if (!isFalsyOrEmpty(result)) {
|
||||
for (const info of result) {
|
||||
OutlineModel._makeOutlineElement(info, group);
|
||||
}
|
||||
}
|
||||
return group;
|
||||
}, err => {
|
||||
onUnexpectedExternalError(err);
|
||||
return group;
|
||||
}).then(group => {
|
||||
if (!TreeElement.empty(group)) {
|
||||
result._groups[id] = group;
|
||||
} else {
|
||||
group.remove();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return Promise.all(promises).then(() => result._compact());
|
||||
}
|
||||
|
||||
private static _makeOutlineElement(info: DocumentSymbol, container: OutlineGroup | OutlineElement): void {
|
||||
let id = TreeElement.findId(info, container);
|
||||
let res = new OutlineElement(id, container, info);
|
||||
if (info.children) {
|
||||
for (const childInfo of info.children) {
|
||||
OutlineModel._makeOutlineElement(childInfo, res);
|
||||
}
|
||||
}
|
||||
container.children[res.id] = res;
|
||||
}
|
||||
|
||||
static get(element: TreeElement): OutlineModel {
|
||||
while (element) {
|
||||
if (element instanceof OutlineModel) {
|
||||
return element;
|
||||
}
|
||||
element = element.parent;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
readonly id = 'root';
|
||||
readonly parent = undefined;
|
||||
|
||||
protected _groups: { [id: string]: OutlineGroup; } = Object.create(null);
|
||||
children: { [id: string]: OutlineGroup | OutlineElement; } = Object.create(null);
|
||||
|
||||
protected constructor(readonly textModel: ITextModel) {
|
||||
super();
|
||||
}
|
||||
|
||||
adopt(): OutlineModel {
|
||||
let res = new OutlineModel(this.textModel);
|
||||
forEach(this._groups, entry => res._groups[entry.key] = entry.value.adopt(res));
|
||||
return res._compact();
|
||||
}
|
||||
|
||||
private _compact(): this {
|
||||
let count = 0;
|
||||
for (const key in this._groups) {
|
||||
let group = this._groups[key];
|
||||
if (first(group.children) === undefined) { // empty
|
||||
delete this._groups[key];
|
||||
} else {
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
if (count !== 1) {
|
||||
//
|
||||
this.children = this._groups;
|
||||
} else {
|
||||
// adopt all elements of the first group
|
||||
let group = first(this._groups);
|
||||
for (let key in group.children) {
|
||||
let child = group.children[key];
|
||||
child.parent = this;
|
||||
this.children[child.id] = child;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
merge(other: OutlineModel): boolean {
|
||||
if (this.textModel.uri.toString() !== other.textModel.uri.toString()) {
|
||||
return false;
|
||||
}
|
||||
if (size(this._groups) !== size(other._groups)) {
|
||||
return false;
|
||||
}
|
||||
this._groups = other._groups;
|
||||
this.children = other.children;
|
||||
return true;
|
||||
}
|
||||
|
||||
updateMatches(pattern: string): OutlineElement {
|
||||
let topMatch: OutlineElement;
|
||||
for (const key in this._groups) {
|
||||
topMatch = this._groups[key].updateMatches(pattern, topMatch);
|
||||
}
|
||||
return topMatch;
|
||||
}
|
||||
|
||||
getItemEnclosingPosition(position: IPosition, context?: OutlineElement): OutlineElement {
|
||||
|
||||
let preferredGroup: OutlineGroup;
|
||||
if (context) {
|
||||
let candidate = context.parent;
|
||||
while (candidate && !preferredGroup) {
|
||||
if (candidate instanceof OutlineGroup) {
|
||||
preferredGroup = candidate;
|
||||
}
|
||||
candidate = candidate.parent;
|
||||
}
|
||||
}
|
||||
|
||||
let result: OutlineElement = undefined;
|
||||
for (const key in this._groups) {
|
||||
const group = this._groups[key];
|
||||
result = group.getItemEnclosingPosition(position);
|
||||
if (result && (!preferredGroup || preferredGroup === group)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
getItemById(id: string): TreeElement {
|
||||
return TreeElement.getElementById(id, this);
|
||||
}
|
||||
|
||||
updateMarker(marker: IMarker[]): void {
|
||||
// sort markers by start range so that we can use
|
||||
// outline element starts for quicker look up
|
||||
marker.sort(Range.compareRangesUsingStarts);
|
||||
|
||||
for (const key in this._groups) {
|
||||
this._groups[key].updateMarker(marker.slice(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
318
src/vs/editor/contrib/documentSymbols/outlineTree.ts
Normal file
@@ -0,0 +1,318 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
|
||||
import { values } from 'vs/base/common/collections';
|
||||
import { createMatches } from 'vs/base/common/filters';
|
||||
import { TPromise } from 'vs/base/common/winjs.base';
|
||||
import { IDataSource, IFilter, IRenderer, ISorter, ITree } from 'vs/base/parts/tree/browser/tree';
|
||||
import 'vs/css!./media/outlineTree';
|
||||
import 'vs/css!./media/symbol-icons';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { SymbolKind, symbolKindToCssClass } from 'vs/editor/common/modes';
|
||||
import { OutlineElement, OutlineGroup, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel';
|
||||
import { localize } from 'vs/nls';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { WorkbenchTreeController } from 'vs/platform/list/browser/listService';
|
||||
import { MarkerSeverity } from 'vs/platform/markers/common/markers';
|
||||
import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
export const enum OutlineItemCompareType {
|
||||
ByPosition,
|
||||
ByName,
|
||||
ByKind
|
||||
}
|
||||
|
||||
export class OutlineItemComparator implements ISorter {
|
||||
|
||||
constructor(
|
||||
public type: OutlineItemCompareType = OutlineItemCompareType.ByPosition
|
||||
) { }
|
||||
|
||||
compare(tree: ITree, a: OutlineGroup | OutlineElement, b: OutlineGroup | OutlineElement): number {
|
||||
|
||||
if (a instanceof OutlineGroup && b instanceof OutlineGroup) {
|
||||
return a.providerIndex - b.providerIndex;
|
||||
}
|
||||
|
||||
if (a instanceof OutlineElement && b instanceof OutlineElement) {
|
||||
switch (this.type) {
|
||||
case OutlineItemCompareType.ByKind:
|
||||
return a.symbol.kind - b.symbol.kind;
|
||||
case OutlineItemCompareType.ByName:
|
||||
return a.symbol.name.localeCompare(b.symbol.name);
|
||||
case OutlineItemCompareType.ByPosition:
|
||||
default:
|
||||
return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineItemFilter implements IFilter {
|
||||
|
||||
enabled: boolean = true;
|
||||
|
||||
isVisible(tree: ITree, element: OutlineElement | any): boolean {
|
||||
if (!this.enabled) {
|
||||
return true;
|
||||
}
|
||||
return !(element instanceof OutlineElement) || Boolean(element.score);
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineDataSource implements IDataSource {
|
||||
|
||||
// this is a workaround for the tree showing twisties for items
|
||||
// with only filtered children
|
||||
filterOnScore: boolean = true;
|
||||
|
||||
getId(tree: ITree, element: TreeElement): string {
|
||||
return element ? element.id : 'empty';
|
||||
}
|
||||
|
||||
hasChildren(tree: ITree, element: OutlineModel | OutlineGroup | OutlineElement): boolean {
|
||||
if (!element) {
|
||||
return false;
|
||||
}
|
||||
if (element instanceof OutlineModel) {
|
||||
return true;
|
||||
}
|
||||
if (element instanceof OutlineElement && (this.filterOnScore && !element.score)) {
|
||||
return false;
|
||||
}
|
||||
for (const id in element.children) {
|
||||
if (!this.filterOnScore || element.children[id].score) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
getChildren(tree: ITree, element: TreeElement): TPromise<TreeElement[]> {
|
||||
let res = values(element.children);
|
||||
// console.log(element.id + ' with children ' + res.length);
|
||||
return TPromise.wrap(res);
|
||||
}
|
||||
|
||||
getParent(tree: ITree, element: TreeElement | any): TPromise<TreeElement> {
|
||||
return TPromise.wrap(element && element.parent);
|
||||
}
|
||||
|
||||
shouldAutoexpand(tree: ITree, element: TreeElement): boolean {
|
||||
return element && (element instanceof OutlineModel || element.parent instanceof OutlineModel || element instanceof OutlineGroup || element.parent instanceof OutlineGroup);
|
||||
}
|
||||
}
|
||||
|
||||
export interface OutlineTemplate {
|
||||
labelContainer: HTMLElement;
|
||||
label: HighlightedLabel;
|
||||
icon?: HTMLElement;
|
||||
detail?: HTMLElement;
|
||||
decoration?: HTMLElement;
|
||||
}
|
||||
|
||||
export class OutlineRenderer implements IRenderer {
|
||||
|
||||
renderProblemColors = true;
|
||||
renderProblemBadges = true;
|
||||
|
||||
constructor(
|
||||
@IThemeService readonly _themeService: IThemeService,
|
||||
@IConfigurationService readonly _configurationService: IConfigurationService
|
||||
) {
|
||||
//
|
||||
}
|
||||
|
||||
getHeight(tree: ITree, element: any): number {
|
||||
return 22;
|
||||
}
|
||||
|
||||
getTemplateId(tree: ITree, element: OutlineGroup | OutlineElement): string {
|
||||
return element instanceof OutlineGroup ? 'outline-group' : 'outline-element';
|
||||
}
|
||||
|
||||
renderTemplate(tree: ITree, templateId: string, container: HTMLElement): OutlineTemplate {
|
||||
if (templateId === 'outline-element') {
|
||||
const icon = dom.$('.outline-element-icon symbol-icon');
|
||||
const labelContainer = dom.$('.outline-element-label');
|
||||
const detail = dom.$('.outline-element-detail');
|
||||
const decoration = dom.$('.outline-element-decoration');
|
||||
dom.addClass(container, 'outline-element');
|
||||
dom.append(container, icon, labelContainer, detail, decoration);
|
||||
return { icon, labelContainer, label: new HighlightedLabel(labelContainer), detail, decoration };
|
||||
}
|
||||
if (templateId === 'outline-group') {
|
||||
const labelContainer = dom.$('.outline-element-label');
|
||||
dom.addClass(container, 'outline-element');
|
||||
dom.append(container, labelContainer);
|
||||
return { labelContainer, label: new HighlightedLabel(labelContainer) };
|
||||
}
|
||||
|
||||
throw new Error(templateId);
|
||||
}
|
||||
|
||||
renderElement(tree: ITree, element: OutlineGroup | OutlineElement, templateId: string, template: OutlineTemplate): void {
|
||||
if (element instanceof OutlineElement) {
|
||||
template.icon.className = `outline-element-icon ${symbolKindToCssClass(element.symbol.kind)}`;
|
||||
template.label.set(element.symbol.name, element.score ? createMatches(element.score[1]) : undefined, localize('title.template', "{0} ({1})", element.symbol.name, OutlineRenderer._symbolKindNames[element.symbol.kind]));
|
||||
template.detail.innerText = element.symbol.detail || '';
|
||||
this._renderMarkerInfo(element, template);
|
||||
|
||||
}
|
||||
if (element instanceof OutlineGroup) {
|
||||
template.label.set(element.provider.displayName || localize('provider', "Outline Provider"));
|
||||
}
|
||||
}
|
||||
|
||||
private _renderMarkerInfo(element: OutlineElement, template: OutlineTemplate): void {
|
||||
|
||||
if (!element.marker) {
|
||||
dom.hide(template.decoration);
|
||||
template.labelContainer.style.removeProperty('--outline-element-color');
|
||||
return;
|
||||
}
|
||||
|
||||
const { count, topSev } = element.marker;
|
||||
const color = this._themeService.getTheme().getColor(topSev === MarkerSeverity.Error ? listErrorForeground : listWarningForeground);
|
||||
const cssColor = color ? color.toString() : 'inherit';
|
||||
|
||||
// color of the label
|
||||
if (this.renderProblemColors) {
|
||||
template.labelContainer.style.setProperty('--outline-element-color', cssColor);
|
||||
} else {
|
||||
template.labelContainer.style.removeProperty('--outline-element-color');
|
||||
}
|
||||
|
||||
// badge with color/rollup
|
||||
if (!this.renderProblemBadges) {
|
||||
dom.hide(template.decoration);
|
||||
|
||||
} else if (count > 0) {
|
||||
dom.show(template.decoration);
|
||||
dom.removeClass(template.decoration, 'bubble');
|
||||
template.decoration.innerText = count < 10 ? count.toString() : '+9';
|
||||
template.decoration.title = count === 1 ? localize('1.problem', "1 problem in this element") : localize('N.problem', "{0} problems in this element", count);
|
||||
template.decoration.style.setProperty('--outline-element-color', cssColor);
|
||||
|
||||
} else {
|
||||
dom.show(template.decoration);
|
||||
dom.addClass(template.decoration, 'bubble');
|
||||
template.decoration.innerText = '\uf052';
|
||||
template.decoration.title = localize('deep.problem', "Contains elements with problems");
|
||||
template.decoration.style.setProperty('--outline-element-color', cssColor);
|
||||
}
|
||||
}
|
||||
|
||||
private static _symbolKindNames: { [symbol: number]: string } = {
|
||||
[SymbolKind.Array]: localize('Array', "array"),
|
||||
[SymbolKind.Boolean]: localize('Boolean', "boolean"),
|
||||
[SymbolKind.Class]: localize('Class', "class"),
|
||||
[SymbolKind.Constant]: localize('Constant', "constant"),
|
||||
[SymbolKind.Constructor]: localize('Constructor', "constructor"),
|
||||
[SymbolKind.Enum]: localize('Enum', "enumeration"),
|
||||
[SymbolKind.EnumMember]: localize('EnumMember', "enumeration member"),
|
||||
[SymbolKind.Event]: localize('Event', "event"),
|
||||
[SymbolKind.Field]: localize('Field', "field"),
|
||||
[SymbolKind.File]: localize('File', "file"),
|
||||
[SymbolKind.Function]: localize('Function', "function"),
|
||||
[SymbolKind.Interface]: localize('Interface', "interface"),
|
||||
[SymbolKind.Key]: localize('Key', "key"),
|
||||
[SymbolKind.Method]: localize('Method', "method"),
|
||||
[SymbolKind.Module]: localize('Module', "module"),
|
||||
[SymbolKind.Namespace]: localize('Namespace', "namespace"),
|
||||
[SymbolKind.Null]: localize('Null', "null"),
|
||||
[SymbolKind.Number]: localize('Number', "number"),
|
||||
[SymbolKind.Object]: localize('Object', "object"),
|
||||
[SymbolKind.Operator]: localize('Operator', "operator"),
|
||||
[SymbolKind.Package]: localize('Package', "package"),
|
||||
[SymbolKind.Property]: localize('Property', "property"),
|
||||
[SymbolKind.String]: localize('String', "string"),
|
||||
[SymbolKind.Struct]: localize('Struct', "struct"),
|
||||
[SymbolKind.TypeParameter]: localize('TypeParameter', "type parameter"),
|
||||
[SymbolKind.Variable]: localize('Variable', "variable"),
|
||||
};
|
||||
|
||||
disposeTemplate(tree: ITree, templateId: string, template: OutlineTemplate): void {
|
||||
template.label.dispose();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export class OutlineTreeState {
|
||||
|
||||
readonly selected: string;
|
||||
readonly focused: string;
|
||||
readonly expanded: string[];
|
||||
|
||||
static capture(tree: ITree): OutlineTreeState {
|
||||
// selection
|
||||
let selected: string;
|
||||
let element = tree.getSelection()[0];
|
||||
if (element instanceof TreeElement) {
|
||||
selected = element.id;
|
||||
}
|
||||
|
||||
// focus
|
||||
let focused: string;
|
||||
element = tree.getFocus(true);
|
||||
if (element instanceof TreeElement) {
|
||||
focused = element.id;
|
||||
}
|
||||
|
||||
// expansion
|
||||
let expanded = new Array<string>();
|
||||
let nav = tree.getNavigator();
|
||||
while (nav.next()) {
|
||||
let element = nav.current();
|
||||
if (element instanceof TreeElement) {
|
||||
if (tree.isExpanded(element)) {
|
||||
expanded.push(element.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
return { selected, focused, expanded };
|
||||
}
|
||||
|
||||
static async restore(tree: ITree, state: OutlineTreeState, eventPayload: any): Promise<void> {
|
||||
let model = <OutlineModel>tree.getInput();
|
||||
if (!state || !(model instanceof OutlineModel)) {
|
||||
return TPromise.as(undefined);
|
||||
}
|
||||
|
||||
// expansion
|
||||
let items: TreeElement[] = [];
|
||||
for (const id of state.expanded) {
|
||||
let item = model.getItemById(id);
|
||||
if (item) {
|
||||
items.push(item);
|
||||
}
|
||||
}
|
||||
await tree.collapseAll(undefined);
|
||||
await tree.expandAll(items);
|
||||
|
||||
// selection & focus
|
||||
let selected = model.getItemById(state.selected);
|
||||
let focused = model.getItemById(state.focused);
|
||||
tree.setSelection([selected], eventPayload);
|
||||
tree.setFocus(focused, eventPayload);
|
||||
}
|
||||
}
|
||||
|
||||
export class OutlineController extends WorkbenchTreeController {
|
||||
protected shouldToggleExpansion(element: any, event: IMouseEvent, origin: string): boolean {
|
||||
if (element instanceof OutlineElement) {
|
||||
return this.isClickOnTwistie(event);
|
||||
} else {
|
||||
return super.shouldToggleExpansion(element, event, origin);
|
||||
}
|
||||
}
|
||||
}
|
||||
188
src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts
Normal file
@@ -0,0 +1,188 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import * as assert from 'assert';
|
||||
import { OutlineElement, OutlineGroup, OutlineModel } from '../outlineModel';
|
||||
import { SymbolKind, DocumentSymbol, DocumentSymbolProviderRegistry } from 'vs/editor/common/modes';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers';
|
||||
import { TextModel } from 'vs/editor/common/model/textModel';
|
||||
import URI from 'vs/base/common/uri';
|
||||
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
|
||||
|
||||
suite('OutlineModel', function () {
|
||||
|
||||
test('OutlineModel#create, cached', async function () {
|
||||
|
||||
let model = TextModel.createFromString('foo', undefined, undefined, URI.file('/fome/path.foo'));
|
||||
let count = 0;
|
||||
let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
|
||||
provideDocumentSymbols() {
|
||||
count += 1;
|
||||
return [];
|
||||
}
|
||||
});
|
||||
|
||||
await OutlineModel.create(model, CancellationToken.None);
|
||||
assert.equal(count, 1);
|
||||
|
||||
// cached
|
||||
await OutlineModel.create(model, CancellationToken.None);
|
||||
assert.equal(count, 1);
|
||||
|
||||
// new version
|
||||
model.applyEdits([{ text: 'XXX', range: new Range(1, 1, 1, 1) }]);
|
||||
await OutlineModel.create(model, CancellationToken.None);
|
||||
assert.equal(count, 2);
|
||||
|
||||
reg.dispose();
|
||||
});
|
||||
|
||||
test('OutlineModel#create, cached/cancel', async function () {
|
||||
|
||||
let model = TextModel.createFromString('foo', undefined, undefined, URI.file('/fome/path.foo'));
|
||||
let isCancelled = false;
|
||||
|
||||
let reg = DocumentSymbolProviderRegistry.register({ pattern: '**/path.foo' }, {
|
||||
provideDocumentSymbols(d, token) {
|
||||
return new Promise(resolve => {
|
||||
token.onCancellationRequested(_ => {
|
||||
isCancelled = true;
|
||||
resolve(null);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
assert.equal(isCancelled, false);
|
||||
let s1 = new CancellationTokenSource();
|
||||
OutlineModel.create(model, s1.token);
|
||||
let s2 = new CancellationTokenSource();
|
||||
OutlineModel.create(model, s2.token);
|
||||
|
||||
s1.cancel();
|
||||
assert.equal(isCancelled, false);
|
||||
|
||||
s2.cancel();
|
||||
assert.equal(isCancelled, true);
|
||||
|
||||
reg.dispose();
|
||||
});
|
||||
|
||||
function fakeSymbolInformation(range: Range, name: string = 'foo'): DocumentSymbol {
|
||||
return {
|
||||
name,
|
||||
detail: 'fake',
|
||||
kind: SymbolKind.Boolean,
|
||||
selectionRange: range,
|
||||
range: range
|
||||
};
|
||||
}
|
||||
|
||||
function fakeMarker(range: Range): IMarker {
|
||||
return { ...range, owner: 'ffff', message: 'test', severity: MarkerSeverity.Error, resource: null };
|
||||
}
|
||||
|
||||
test('OutlineElement - updateMarker', function () {
|
||||
|
||||
let e0 = new OutlineElement('foo1', null, fakeSymbolInformation(new Range(1, 1, 1, 10)));
|
||||
let e1 = new OutlineElement('foo2', null, fakeSymbolInformation(new Range(2, 1, 5, 1)));
|
||||
let e2 = new OutlineElement('foo3', null, fakeSymbolInformation(new Range(6, 1, 10, 10)));
|
||||
|
||||
let group = new OutlineGroup('group', null, null, 1);
|
||||
group.children[e0.id] = e0;
|
||||
group.children[e1.id] = e1;
|
||||
group.children[e2.id] = e2;
|
||||
|
||||
const data = [fakeMarker(new Range(6, 1, 6, 7)), fakeMarker(new Range(1, 1, 1, 4)), fakeMarker(new Range(10, 2, 14, 1))];
|
||||
data.sort(Range.compareRangesUsingStarts); // model does this
|
||||
|
||||
group.updateMarker(data);
|
||||
assert.equal(data.length, 0); // all 'stolen'
|
||||
assert.equal(e0.marker.count, 1);
|
||||
assert.equal(e1.marker, undefined);
|
||||
assert.equal(e2.marker.count, 2);
|
||||
|
||||
group.updateMarker([]);
|
||||
assert.equal(e0.marker, undefined);
|
||||
assert.equal(e1.marker, undefined);
|
||||
assert.equal(e2.marker, undefined);
|
||||
});
|
||||
|
||||
test('OutlineElement - updateMarker, 2', function () {
|
||||
|
||||
let p = new OutlineElement('A', null, fakeSymbolInformation(new Range(1, 1, 11, 1)));
|
||||
let c1 = new OutlineElement('A/B', null, fakeSymbolInformation(new Range(2, 4, 5, 4)));
|
||||
let c2 = new OutlineElement('A/C', null, fakeSymbolInformation(new Range(6, 4, 9, 4)));
|
||||
|
||||
let group = new OutlineGroup('group', null, null, 1);
|
||||
group.children[p.id] = p;
|
||||
p.children[c1.id] = c1;
|
||||
p.children[c2.id] = c2;
|
||||
|
||||
let data = [
|
||||
fakeMarker(new Range(2, 4, 5, 4))
|
||||
];
|
||||
|
||||
group.updateMarker(data);
|
||||
assert.equal(p.marker.count, 0);
|
||||
assert.equal(c1.marker.count, 1);
|
||||
assert.equal(c2.marker, undefined);
|
||||
|
||||
data = [
|
||||
fakeMarker(new Range(2, 4, 5, 4)),
|
||||
fakeMarker(new Range(2, 6, 2, 8)),
|
||||
fakeMarker(new Range(7, 6, 7, 8)),
|
||||
];
|
||||
group.updateMarker(data);
|
||||
assert.equal(p.marker.count, 0);
|
||||
assert.equal(c1.marker.count, 2);
|
||||
assert.equal(c2.marker.count, 1);
|
||||
|
||||
data = [
|
||||
fakeMarker(new Range(1, 4, 1, 11)),
|
||||
fakeMarker(new Range(7, 6, 7, 8)),
|
||||
];
|
||||
group.updateMarker(data);
|
||||
assert.equal(p.marker.count, 1);
|
||||
assert.equal(c1.marker, undefined);
|
||||
assert.equal(c2.marker.count, 1);
|
||||
});
|
||||
|
||||
test('OutlineElement - updateMarker/multiple groups', function () {
|
||||
|
||||
let model = new class extends OutlineModel {
|
||||
constructor() {
|
||||
super(null);
|
||||
}
|
||||
readyForTesting() {
|
||||
this._groups = this.children as any;
|
||||
}
|
||||
};
|
||||
model.children['g1'] = new OutlineGroup('g1', model, null, 1);
|
||||
model.children['g1'].children['c1'] = new OutlineElement('c1', model.children['g1'], fakeSymbolInformation(new Range(1, 1, 11, 1)));
|
||||
|
||||
model.children['g2'] = new OutlineGroup('g2', model, null, 1);
|
||||
model.children['g2'].children['c2'] = new OutlineElement('c2', model.children['g2'], fakeSymbolInformation(new Range(1, 1, 7, 1)));
|
||||
model.children['g2'].children['c2'].children['c2.1'] = new OutlineElement('c2.1', model.children['g2'].children['c2'], fakeSymbolInformation(new Range(1, 3, 2, 19)));
|
||||
model.children['g2'].children['c2'].children['c2.2'] = new OutlineElement('c2.2', model.children['g2'].children['c2'], fakeSymbolInformation(new Range(4, 1, 6, 10)));
|
||||
|
||||
model.readyForTesting();
|
||||
|
||||
const data = [
|
||||
fakeMarker(new Range(1, 1, 2, 8)),
|
||||
fakeMarker(new Range(6, 1, 6, 98)),
|
||||
];
|
||||
|
||||
model.updateMarker(data);
|
||||
|
||||
assert.equal(model.children['g1'].children['c1'].marker.count, 2);
|
||||
assert.equal(model.children['g2'].children['c2'].children['c2.1'].marker.count, 1);
|
||||
assert.equal(model.children['g2'].children['c2'].children['c2.2'].marker.count, 1);
|
||||
});
|
||||
|
||||
});
|
||||